diff --git a/noir_stdlib/src/hash/mod.nr b/noir_stdlib/src/hash/mod.nr index e3eaf457554..23be42db6eb 100644 --- a/noir_stdlib/src/hash/mod.nr +++ b/noir_stdlib/src/hash/mod.nr @@ -30,11 +30,23 @@ pub fn blake2s(input: [u8; N]) -> [u8; 32] // docs:end:blake2s {} -#[foreign(blake3)] // docs:start:blake3 pub fn blake3(input: [u8; N]) -> [u8; 32] // docs:end:blake3 -{} +{ + if crate::runtime::is_unconstrained() { + // Temporary measure while Barretenberg is main proving system. + // Please open an issue if you're working on another proving system and running into problems due to this. + crate::static_assert( + N <= 1024, + "Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes", + ); + } + __blake3(input) +} + +#[foreign(blake3)] +fn __blake3(input: [u8; N]) -> [u8; 32] {} // docs:start:pedersen_commitment pub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint { diff --git a/test_programs/execution_success/brillig_cow_regression/src/main.nr b/test_programs/execution_success/brillig_cow_regression/src/main.nr index 4b70f2961b6..9a96a53acec 100644 --- a/test_programs/execution_success/brillig_cow_regression/src/main.nr +++ b/test_programs/execution_success/brillig_cow_regression/src/main.nr @@ -172,6 +172,6 @@ unconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA } } - let blake3_digest = std::hash::blake3(hash_input_flattened); - U256::from_bytes32(blake3_digest).to_u128_limbs() + let blake2_digest = std::hash::blake2s(hash_input_flattened); + U256::from_bytes32(blake2_digest).to_u128_limbs() } diff --git a/test_programs/execution_success/ram_blowup_regression/src/main.nr b/test_programs/execution_success/ram_blowup_regression/src/main.nr index 5f63bf03e55..342fe85ff0d 100644 --- a/test_programs/execution_success/ram_blowup_regression/src/main.nr +++ b/test_programs/execution_success/ram_blowup_regression/src/main.nr @@ -20,9 +20,9 @@ pub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field { low + high * v } -pub fn blake3_to_field(bytes_to_hash: [u8; N]) -> Field { - let blake3_hashed = std::hash::blake3(bytes_to_hash); - let hash_in_a_field = field_from_bytes_32_trunc(blake3_hashed); +pub fn blake2s_to_field(bytes_to_hash: [u8; N]) -> Field { + let blake2s_hashed = std::hash::blake2s(bytes_to_hash); + let hash_in_a_field = field_from_bytes_32_trunc(blake2s_hashed); hash_in_a_field } @@ -36,6 +36,6 @@ fn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Fie } } - let blake3_digest = blake3_to_field(hash_input_flattened); - blake3_digest + let blake2s_digest = blake2s_to_field(hash_input_flattened); + blake2s_digest } diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_empty/arithmetic_generics/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_empty/arithmetic_generics/execute__tests__expanded.snap index 75c73693c46..48942f42933 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_empty/arithmetic_generics/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_empty/arithmetic_generics/execute__tests__expanded.snap @@ -24,8 +24,8 @@ fn split_first(array: [T; N]) -> (T, [T; N - 1]) { fn push(array: [Field; N], element: Field) -> [Field; N + 1] { let mut result: [Field; N + 1] = std::mem::zeroed(); { - let i_3802: u32 = array.len(); - result[i_3802] = element; + let i_3805: u32 = array.len(); + result[i_3805] = element; }; for i in 0..array.len() { result[i] = array[i]; diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_empty/assign_mutation_in_lvalue/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_empty/assign_mutation_in_lvalue/execute__tests__expanded.snap index 80b546d64ec..3c06b4b0eb7 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_empty/assign_mutation_in_lvalue/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_empty/assign_mutation_in_lvalue/execute__tests__expanded.snap @@ -10,11 +10,11 @@ fn main() { fn bug() { let mut a: ([Field; 2], Field) = ([1, 2], 3); { - let i_3771: Field = { + let i_3774: Field = { a = ([4, 5], 6); 1 }; - a.0[i_3771] = 7; + a.0[i_3774] = 7; }; assert(a == ([4, 7], 6)); } diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_empty/numeric_generics/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_empty/numeric_generics/execute__tests__expanded.snap index 003b6790769..a1f2fe076d2 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_empty/numeric_generics/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_empty/numeric_generics/execute__tests__expanded.snap @@ -27,8 +27,8 @@ impl MyStruct { fn insert(mut self, index: Field, elem: Field) -> Self { assert((index as u64) < (S as u64)); { - let i_3785: u32 = index as u32; - self.data[i_3785] = elem; + let i_3788: u32 = index as u32; + self.data[i_3788] = elem; }; self } diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_empty/numeric_generics_explicit/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_empty/numeric_generics_explicit/execute__tests__expanded.snap index 8fe2f9ad19a..efdc5b36185 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_empty/numeric_generics_explicit/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_empty/numeric_generics_explicit/execute__tests__expanded.snap @@ -36,8 +36,8 @@ impl MyStruct { fn insert(mut self, index: Field, elem: Field) -> Self { assert((index as u32) < S); { - let i_3803: u32 = index as u32; - self.data[i_3803] = elem; + let i_3806: u32 = index as u32; + self.data[i_3806] = elem; }; self } diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_empty/regression_bignum/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_empty/regression_bignum/execute__tests__expanded.snap index 6f8681ba0d0..846bac42fa2 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_empty/regression_bignum/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_empty/regression_bignum/execute__tests__expanded.snap @@ -47,8 +47,8 @@ unconstrained fn shl(shift: u32) -> [u64; 6] { result[num_shifted_limbs] = 1 << limb_shift; for i in 1..6 - num_shifted_limbs { { - let i_3792: u32 = i + num_shifted_limbs; - result[i_3792] = 0; + let i_3795: u32 = i + num_shifted_limbs; + result[i_3795] = 0; } } result diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index deef8cb5be2..fcb7569535f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -114,8 +114,12 @@ expression: artifact "EXPR [ (-1, _35) (1, _67) 0 ]", "EXPR [ (-1, _36) (1, _68) 0 ]" ], - "debug_symbols": "jdLBioMwFAXQf8naRTS+Z+uvDINEjSUQoqQ6MIj/PtGrrbNo6epq4j3qI7NoTT3dKuu7/i7Kr1nUwTpnb5XrGz3a3sfVeUnEcVuNwZi4JE77sTXoYPwoSj85l4gf7abtofug/ZajDnFXJsL4NmYEO+vMerUkz7Z8Xc0o3ctZkT7q9HFf5fneVyxf9bM375fp9fgAmfFT+BxQ8gGoyxn4jje6seHfzIUqRBn/WV02Vl23yCUiRWQIhcgRhGBEgYCSQyEoBIWgEBSCQlAICkEhKASFoTAUhsJQGApDYSgMhaHwqizrwILVtTP7Qesm35zO3fg7HDvHyRxC35h2Cmad17YXJ/gH", + "debug_symbols": "jdLBjoMgEAbgd+HsAcQZ277KZtNQiw0JQUN1k43x3Rf91dqDm55+YZgvgAzibm/94+pC3TzF5WsQt+i8d4+rbyrTuSak2WHMxDq8dtHaNCV29dTVmmhDJy6h9z4TP8b386Jna8KcnYmpKjNhwz1lAmvn7fQ1Zq9uedyak1qa81Jt7fTer477leYVULrkTVDnT3egi2IBNMujHeh/TiDVeT2CzF87oM8BLTdAn/bAdxqYysW3vyZ0mVZmQp9mVp/nKCRCIXKERhQIQjCiREApoBAUgkJQCApBISgEhaAQFILCUBgKQ2EoDIWhMBSGwlB4UsbpwqIzN2+Xp1r3odq93O63XSvr225jU9l7H+10X3Mt3eAf", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// blake3 circuit where the input is 5 bytes\n// not five field elements since blake3 operates over\n// bytes.\n//\n// If you do not cast, it will take all the bytes from the field element!\nfn main(x: [u8; 5], result: pub [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_0.snap index deef8cb5be2..fcb7569535f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_0.snap @@ -114,8 +114,12 @@ expression: artifact "EXPR [ (-1, _35) (1, _67) 0 ]", "EXPR [ (-1, _36) (1, _68) 0 ]" ], - "debug_symbols": "jdLBioMwFAXQf8naRTS+Z+uvDINEjSUQoqQ6MIj/PtGrrbNo6epq4j3qI7NoTT3dKuu7/i7Kr1nUwTpnb5XrGz3a3sfVeUnEcVuNwZi4JE77sTXoYPwoSj85l4gf7abtofug/ZajDnFXJsL4NmYEO+vMerUkz7Z8Xc0o3ctZkT7q9HFf5fneVyxf9bM375fp9fgAmfFT+BxQ8gGoyxn4jje6seHfzIUqRBn/WV02Vl23yCUiRWQIhcgRhGBEgYCSQyEoBIWgEBSCQlAICkEhKASFoTAUhsJQGApDYSgMhaHwqizrwILVtTP7Qesm35zO3fg7HDvHyRxC35h2Cmad17YXJ/gH", + "debug_symbols": "jdLBjoMgEAbgd+HsAcQZ277KZtNQiw0JQUN1k43x3Rf91dqDm55+YZgvgAzibm/94+pC3TzF5WsQt+i8d4+rbyrTuSak2WHMxDq8dtHaNCV29dTVmmhDJy6h9z4TP8b386Jna8KcnYmpKjNhwz1lAmvn7fQ1Zq9uedyak1qa81Jt7fTer477leYVULrkTVDnT3egi2IBNMujHeh/TiDVeT2CzF87oM8BLTdAn/bAdxqYysW3vyZ0mVZmQp9mVp/nKCRCIXKERhQIQjCiREApoBAUgkJQCApBISgEhaAQFILCUBgKQ2EoDIWhMBSGwlB4UsbpwqIzN2+Xp1r3odq93O63XSvr225jU9l7H+10X3Mt3eAf", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// blake3 circuit where the input is 5 bytes\n// not five field elements since blake3 operates over\n// bytes.\n//\n// If you do not cast, it will take all the bytes from the field element!\nfn main(x: [u8; 5], result: pub [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index deef8cb5be2..fcb7569535f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -114,8 +114,12 @@ expression: artifact "EXPR [ (-1, _35) (1, _67) 0 ]", "EXPR [ (-1, _36) (1, _68) 0 ]" ], - "debug_symbols": "jdLBioMwFAXQf8naRTS+Z+uvDINEjSUQoqQ6MIj/PtGrrbNo6epq4j3qI7NoTT3dKuu7/i7Kr1nUwTpnb5XrGz3a3sfVeUnEcVuNwZi4JE77sTXoYPwoSj85l4gf7abtofug/ZajDnFXJsL4NmYEO+vMerUkz7Z8Xc0o3ctZkT7q9HFf5fneVyxf9bM375fp9fgAmfFT+BxQ8gGoyxn4jje6seHfzIUqRBn/WV02Vl23yCUiRWQIhcgRhGBEgYCSQyEoBIWgEBSCQlAICkEhKASFoTAUhsJQGApDYSgMhaHwqizrwILVtTP7Qesm35zO3fg7HDvHyRxC35h2Cmad17YXJ/gH", + "debug_symbols": "jdLBjoMgEAbgd+HsAcQZ277KZtNQiw0JQUN1k43x3Rf91dqDm55+YZgvgAzibm/94+pC3TzF5WsQt+i8d4+rbyrTuSak2WHMxDq8dtHaNCV29dTVmmhDJy6h9z4TP8b386Jna8KcnYmpKjNhwz1lAmvn7fQ1Zq9uedyak1qa81Jt7fTer477leYVULrkTVDnT3egi2IBNMujHeh/TiDVeT2CzF87oM8BLTdAn/bAdxqYysW3vyZ0mVZmQp9mVp/nKCRCIXKERhQIQjCiREApoBAUgkJQCApBISgEhaAQFILCUBgKQ2EoDIWhMBSGwlB4UsbpwqIzN2+Xp1r3odq93O63XSvr225jU9l7H+10X3Mt3eAf", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// blake3 circuit where the input is 5 bytes\n// not five field elements since blake3 operates over\n// bytes.\n//\n// If you do not cast, it will take all the bytes from the field element!\nfn main(x: [u8; 5], result: pub [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 94d7c2f24a6..c3b9fd059ab 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -56,12 +56,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 37 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U8) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U8) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U8) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(1), source: Relative(3) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(2), source: Relative(3) }, Call { location: 83 }, Call { location: 85 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 82 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 75 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Return, Call { location: 114 }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 92 }, Call { location: 120 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(7), size: 32 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 123 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(7) }, JumpIf { condition: Relative(1), location: 113 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 119 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 114 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 133 }, Call { location: 120 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 140 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, JumpIf { condition: Relative(5), location: 145 }, Jump { location: 143 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U8, lhs: Relative(6), rhs: Relative(9) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(10) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 140 }]" ], - "debug_symbols": "pdTBjoIwEAbgd+m5h860hZZXMcYgVkPSAKmwycbw7juVYXEPboxe/BzK/GlH4SZO4ThdDm137q+i2t3EMbUxtpdD7Jt6bPuOrt6Eyh/eiAqk8HahWCgX3IK/A0qxwKKoMKtZw1q2YEvWsX4RFAss5yHnIOcg5yDl6Kxj/aJWLLDIatYsGr7P0HWTtVxTvs2WrGMpvyCtYoGlfJflHGtYyjPzLMU65cOYQshDfhg7/RhDnUI3iqqbYpTiq47T/abrUHd3xzrRqpIidCeSAs9tDPnbLLdu9bwVLXAzlvDbbl/u18Zwvy7UG/3g3RoA3pst4eUDKOXXEyjt3wmALQCLdwK02nbgPt3BsyOU/wwRoVyHiFo9BuypqJs2/Xmc5xyV2voYA5fnqWseVsfvYV1ZXwdD6ptwmlLISds7gf7XuxKlw31+WqkAMBLA5xJyiUoC4n7OW/kB", + "debug_symbols": "pZTBjoMgEED/hTMHZgABf6VpGmtpY0LUUN1k0/jvC3Ws7cGm6V58DjAv4xjmxk7+OF4OTXvurqzc3dgxNiE0l0Po6mpoujat3pjID6dYiZw5PaOYYWbYGe4OEIIIRGSlzJRERdTEgmiIluhmgiACkXxIHiQPkgeTR2VaopspBRGISJRENVPROZXWdaamOPmLTEO0xOQ3iVoQgZj8LpM8WhGTT08TZ0uXD0P0Pjf5qe3pZ/RV9O3AynYMgbOfKoz3Q9e+au8cqph2BWe+PSUm4bkJPr9NfM0W26mogZLRwCNdv+bDdj7IYhGANMXDAO7TCqRSJJCF2KrgTT44uwjAObUaPm6BEG7pgZDuGwGsAiy+EUixVmD/W8HWJ9g3TUQwSxNRimfBPgVV3cSXgTBlVWyqY/AUnse2ftodfvtlZxkofexqfxqjz6Z1qqSbsTPILe7zfU8BgOIALoeQQxQcEPdTLuUP", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// blake3 circuit where the input is 5 bytes\n// not five field elements since blake3 operates over\n// bytes.\n//\n// If you do not cast, it will take all the bytes from the field element!\nfn main(x: [u8; 5], result: pub [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_0.snap index a0efb03ee40..4fa2cde6dd2 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_0.snap @@ -56,12 +56,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 37 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U8) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U8) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U8) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(1), source: Relative(3) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(2), source: Relative(3) }, Call { location: 83 }, Call { location: 84 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 82 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 75 }, Return, Return, Call { location: 139 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 91 }, Call { location: 145 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(6), size: Relative(7) }, output: HeapArray { pointer: Relative(8), size: 32 } }), Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U1), value: 1 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(4) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 111 }, Call { location: 145 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(3), source: Relative(7) }, Jump { location: 118 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, JumpIf { condition: Relative(5), location: 126 }, Jump { location: 121 }, Load { destination: Relative(2), source_pointer: Relative(1) }, JumpIf { condition: Relative(2), location: 125 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, Return, Load { destination: Relative(5), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(11) }, Store { destination_pointer: Relative(1), source: Relative(7) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(10) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 118 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 144 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tdTNioMwEAfwd8nZQ2YSP+KrlFKsTYsQVFJdWIrvvjPNuHYPXUqXvfTXSZw/cSDe1Mkf58uh68/DVdW7mzrGLoTucghD20zd0NPqTWn+cUbVkClnE3miSJSJKuHugNYiqNqwKBrRipRl2UIsxUp0SdAiiCjKc0jrOUvryBrRipKPlF+wleiShvJLFkQUKcexNuWbXKS8fFkytQ7rMEXveVYP06OZjk30/aTqfg4hUx9NmO8PXcemvzs1kXZ1pnx/Iinw3AXP/5Zs69bPWzEHacYSvtvzl/uNtdJvCv2sH/+vH1y1BoBzdkt4NQC1dusEtHHvBMAWgMU7AUZvJ6j+eoJnr1D9MkSEch0iGv0YsKeiabv441YvHBW75hi8lOe5bx92p89x3Vm/CmMcWn+ao+ek7dNA92NXYlbhnm8rFWBcBtZyCVzanMpyv/BRvgA=", + "debug_symbols": "tZTBjoMgEED/hbMHBlDEX2maxlramBA1VDfZNP77zpSxtgc3TTd78TnAPIZJ4CZO/jhdDm137q+i2t3EMbYhtJdD6Jt6bPsOR29C0sdpUalMOJOQJxQJNqFMcHeAlEwQlSEqpmYaJrpyYsG0zJLpEkEygamYvE7heEHEcU3UTMNkv0K/JZZMl6jRXxKBqZjoAUk/Jm2gcyYKi3nOxNKtwxi9p2Y9tQ+bOtTRd6OouimETHzVYbovug51d+dYR5zFHXx3QqLw3AZPf3O2ZsvtVJUDJysLj/T8NR+28/EkiwC0LR4GcO9WoI1hgS7kVgX6//LBlYsAnDOr4V2BktItPZTafSKAVaCKTwRarhWUf61g6wjulyYqsEsTlZbPgj0GddPGl4dhJlVs62PwHJ6nrnmaHb+HZWZ5WIbYN/40RU+m9XXBK7azKivVni48BqBdBsZQCBSaHEO7n6mUHw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// blake3 circuit where the input is 5 bytes\n// not five field elements since blake3 operates over\n// bytes.\n//\n// If you do not cast, it will take all the bytes from the field element!\nfn main(x: [u8; 5], result: pub [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index a0efb03ee40..4fa2cde6dd2 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -56,12 +56,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 37 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U8) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U8) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U8) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(1), source: Relative(3) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(2), source: Relative(3) }, Call { location: 83 }, Call { location: 84 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 82 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 75 }, Return, Return, Call { location: 139 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 91 }, Call { location: 145 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(6), size: Relative(7) }, output: HeapArray { pointer: Relative(8), size: 32 } }), Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U1), value: 1 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(4) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 111 }, Call { location: 145 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(3), source: Relative(7) }, Jump { location: 118 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, JumpIf { condition: Relative(5), location: 126 }, Jump { location: 121 }, Load { destination: Relative(2), source_pointer: Relative(1) }, JumpIf { condition: Relative(2), location: 125 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, Return, Load { destination: Relative(5), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(11) }, Store { destination_pointer: Relative(1), source: Relative(7) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(10) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 118 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 144 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tdTNioMwEAfwd8nZQ2YSP+KrlFKsTYsQVFJdWIrvvjPNuHYPXUqXvfTXSZw/cSDe1Mkf58uh68/DVdW7mzrGLoTucghD20zd0NPqTWn+cUbVkClnE3miSJSJKuHugNYiqNqwKBrRipRl2UIsxUp0SdAiiCjKc0jrOUvryBrRipKPlF+wleiShvJLFkQUKcexNuWbXKS8fFkytQ7rMEXveVYP06OZjk30/aTqfg4hUx9NmO8PXcemvzs1kXZ1pnx/Iinw3AXP/5Zs69bPWzEHacYSvtvzl/uNtdJvCv2sH/+vH1y1BoBzdkt4NQC1dusEtHHvBMAWgMU7AUZvJ6j+eoJnr1D9MkSEch0iGv0YsKeiabv441YvHBW75hi8lOe5bx92p89x3Vm/CmMcWn+ao+ek7dNA92NXYlbhnm8rFWBcBtZyCVzanMpyv/BRvgA=", + "debug_symbols": "tZTBjoMgEED/hbMHBlDEX2maxlramBA1VDfZNP77zpSxtgc3TTd78TnAPIZJ4CZO/jhdDm137q+i2t3EMbYhtJdD6Jt6bPsOR29C0sdpUalMOJOQJxQJNqFMcHeAlEwQlSEqpmYaJrpyYsG0zJLpEkEygamYvE7heEHEcU3UTMNkv0K/JZZMl6jRXxKBqZjoAUk/Jm2gcyYKi3nOxNKtwxi9p2Y9tQ+bOtTRd6OouimETHzVYbovug51d+dYR5zFHXx3QqLw3AZPf3O2ZsvtVJUDJysLj/T8NR+28/EkiwC0LR4GcO9WoI1hgS7kVgX6//LBlYsAnDOr4V2BktItPZTafSKAVaCKTwRarhWUf61g6wjulyYqsEsTlZbPgj0GddPGl4dhJlVs62PwHJ6nrnmaHb+HZWZ5WIbYN/40RU+m9XXBK7azKivVni48BqBdBsZQCBSaHEO7n6mUHw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// blake3 circuit where the input is 5 bytes\n// not five field elements since blake3 operates over\n// bytes.\n//\n// If you do not cast, it will take all the bytes from the field element!\nfn main(x: [u8; 5], result: pub [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__expanded.snap index 3b128cd4b85..e4487c61706 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__expanded.snap @@ -18,8 +18,8 @@ unconstrained fn decode_hex(s: str) -> [u8; M] { for i in 0..N { if (i % 2) != 0 { continue; }; { - let i_3786: u32 = i / 2; - result[i_3786] = (decode_ascii(as_bytes[i]) * 16) + decode_ascii(as_bytes[i + 1]); + let i_3789: u32 = i / 2; + result[i_3789] = (decode_ascii(as_bytes[i]) * 16) + decode_ascii(as_bytes[i + 1]); } } result diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__expanded.snap index d58fc156567..113305bc4b7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__expanded.snap @@ -7,8 +7,8 @@ unconstrained fn main(x: u32) { for i in 0..5 { let mut a2: [Field; 5] = [1, 2, 3, 4, 5]; { - let i_3773: u32 = x + i; - a2[i_3773] = 128; + let i_3776: u32 = x + i; + a2[i_3776] = 128; }; println(a2); if i != 0 { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__expanded.snap index ba8ddb931a0..f7d31f1c4fa 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__expanded.snap @@ -17,12 +17,12 @@ fn compute_root(leaf: [u8; 32], path: [u8; 64], _index: u32, root: [u8; 32]) { let b: u32 = if is_right { 0 } else { 32 }; for j in 0..32 { { - let i_3787: u32 = j + a; - hash_input[i_3787] = current[j]; + let i_3790: u32 = j + a; + hash_input[i_3790] = current[j]; }; { - let i_3788: u32 = j + b; - hash_input[i_3788] = path[offset + j]; + let i_3791: u32 = j + b; + hash_input[i_3791] = path[offset + j]; } } current = std::hash::blake3(hash_input); diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 34953a4992c..442fc6e15b6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -1222,8 +1222,12 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(leaf: [u8; 32], path: [u8; 64], index: u32, root: [u8; 32]) {\n compute_root(leaf, path, index, root);\n}\n\nfn compute_root(leaf: [u8; 32], path: [u8; 64], _index: u32, root: [u8; 32]) {\n let mut current = leaf;\n let mut index = _index;\n\n for i in 0..2 {\n let mut hash_input = [0; 64];\n let offset = i * 32;\n let is_right = (index & 1) != 0;\n let a = if is_right { 32 } else { 0 };\n let b = if is_right { 0 } else { 32 };\n\n for j in 0..32 {\n hash_input[j + a] = current[j];\n hash_input[j + b] = path[offset + j];\n }\n\n current = std::hash::blake3(hash_input);\n index = index >> 1;\n }\n\n // Regression for issue #4258\n assert(root == current);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_0.snap index 34953a4992c..442fc6e15b6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_0.snap @@ -1222,8 +1222,12 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(leaf: [u8; 32], path: [u8; 64], index: u32, root: [u8; 32]) {\n compute_root(leaf, path, index, root);\n}\n\nfn compute_root(leaf: [u8; 32], path: [u8; 64], _index: u32, root: [u8; 32]) {\n let mut current = leaf;\n let mut index = _index;\n\n for i in 0..2 {\n let mut hash_input = [0; 64];\n let offset = i * 32;\n let is_right = (index & 1) != 0;\n let a = if is_right { 32 } else { 0 };\n let b = if is_right { 0 } else { 32 };\n\n for j in 0..32 {\n hash_input[j + a] = current[j];\n hash_input[j + b] = path[offset + j];\n }\n\n current = std::hash::blake3(hash_input);\n index = index >> 1;\n }\n\n // Regression for issue #4258\n assert(root == current);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 34953a4992c..442fc6e15b6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -1222,8 +1222,12 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "nZrNblxHDoXfRWsvqoos/uRVBkHgJEpgQLANxQ4wCPzuc2/zYyVZeDFakbZ8D63+xK5Tp/XX06/PP3/9/acPH3/79MfTD//56+nn1w8vLx9+/+nl0y/vv3z49PH627++vXvqP/705fX5+fqrp398/Xrq8/vX549fnn74+PXl5d3Tn+9fvj7+0R+f33981C/vX6+vjndPzx9/veol+NuHl+e7+/bu76fH9x915dk553l6//vx+f3HZSyelyFved6kn/f1pufPfI83PL+ln9/6lvl7nudXvuV5t34+3zR/n+f9La//XnL+/296/czP/Lf8/+3Mt/2m571/9i3GG5536Z9/1+/zk+8LrDEThTWW/S3xfyjIOAoS/1T48frD+18+vP7rTeNprrx+3N89TRnUSV1UefpB76rUTbVL9a5ODWpW1UvP7jqpiypUpV56flejOjWol15cdQ/qpZd3XTVnC1Wpm2qlvy+9Oe4GwZ1VbVAnddUAkxpgCBqCxjdsfMMWNcCSAY6gI+iLKlStAb5rgCPoCDqvoPMKBq9gTAYEgoFgKJWXMKwGhNeAQDAQzEGdVJCkMCARTAQTJgmTjBqQ+RiwRgleP7bURRVqMV5j14A1SnANpwa1mKxZkNcsyGsiOBGcSt3UgrwmkNdEcCK4BnVSC/JaBXktBBeCy6hOLchrAXkJgoKgLKpQC/KSgrxYk8WaLNZksSaLNVkK5KUIKoKq1E0tyEsL8lIEFcENkw2TXZDXBvLaCG4EN0w2THZBXhvIhqAhaDAxmBiQrSEbgoagwcRg4kB2IDuCjqDDxGHiQPaG7Ag6ggGTgEkAOYAcCAaCAZOASQA5GnIimAgmTBImCeQEciKYCCZMspjIKMgygCyjBGUIVambWpBlFGQZgRCCc1AntSDLBLJMBCeC06hOLcgyC7IsBBeCa1GFWpBlAVkWggvBFdRiIlKQRQqyCIKCoCh1UwuyCJBFEBQEdVAntSCLFmRRBBVBNapTC7IokGUjuBHcMNkw2QVZdkGWjeBGcMNkw8SAbA3ZEDQEDSYGEwOyAdkQNAQdJg4TB7I3ZEfQEXSYOEwcyA7kQDAQDJgETALI0ZADwUAwYBIwSSAnkBPBRDBhkjBJIGdDTgSzBHUM6qQWZB0FWUcJ6thUozq1IOsAsk4EJ4JzUYVakHUWZJ0ITgRnUIuJroKsC8i6EFwILqVuakHWVZB1IbgQlEGd1IKsAmQVBAVBMapTC7JKQVZFUBHURRVqQVYFsmK8FOOlGC9VmGC8FOOlGC/FeCnGSzFeivHSNl6K8VKMl2K8FOOlGC/FeCnGSzFeivFSjJdivLSNl2K8FOOlGC/FeCnGSzFeivFSjJdivBTjpRgvbeOlGC/FeCnGSzFeivFSjJdivBTjpRgvxXgpxkvbeCnGSzFeivFSjJdivBTjtTFeG+O1MV4b47UxXruN18Z4bYzXxnhtjNfGeG2M18Z4bYzXxnhtjNfGeO02XhvjtTFeG+O1MV4b47XvPZnzbrSb3Y11491EN0lzr0s1s5vVTStLK0srSytLK0srSytrK2sraytrK2sraytrK2sraytrK+9W3q28W3m38m7l3cq7lXcr71berWytbK1srWytbK1srWytbK1srWyt7K3sreyt7K3sreyt7K3sreyt7K0crRytHK0crRytHK0crRytHK0crZytnK2crZytnK2crZytnK2crZwo2xjdzG5WN9KNdrO7sW68m+imlWcrz1aerTxbebbybOXZyrOVZyvPVl6tvFp5tXLvoPUOWu+g9Q5a76D1DlrvoPUOWu+g9Q5a76D1DlrvoPUOWu+g9Q5a76D1DlrvoPUOWu+g9Q5a76D1DlrvoPUOWu+g9Q7aYwfX3axupBvtZj+iD7tX8FGdGtR8RCB2r9+jTmq9aRo3I+MgMw4ys3rTtHvvHrXeM42LkXGOGeeYeb1n2r1xj6qPN2fjYmScY8Y5Zpxjdu/arf9YtXE3CHKOGeeYcY7ZvWb3gHvL7gFcjIxzzDjHjHPMsjIde+zXPYCLkXGOGeeYcY7ZvVv3gHu17gFcjJxzzDnHnHPMR4VE/liqcTcl6JxjzjnmnGM+KiXye5/yrghyjjnnmHOO+b1K94DHJt0DuBg555hzjjnnmN9bdA+4l+gewMXICRCcAMEJEHwVY3+szz2Ai5ETIDgBghMguBRkl4LsXIycAMEJEJwAwaUguwLZuRg5AYITIDgBgmtBdi3IzsXICRCcAMEJEHwXZN9Adi5GToDgBAhOgOC7IPsuyM7FyAkQnADBWRM3IFtD5mLkBAhOgODsiRuQHchcjJwAwQkQnADBHcjekLkYOQGCEyA4AYIHkAPIXIycAMEJEJwAwQPI0ZC5GDkBghMgOAGCJ5ATyFyMnADBCRCcAMGzIMcAcnAxCgKEIEAIAoQYBTlGQQ4uRkGAEAQIQYAQsyDHBHJwMQoChCBACAKEmAU5ZkEOLkZBgBAECEGAEKsgxwJycDEKAoQgQAgChFgFOaQgBxejIEAIAoQgQAgpyCFADi5GQYAQBAhBgBBakEMLcnAxCgKEIEAIAoTQghwK5OBiFAQIQYAQBAixC3LsghxcjIIAIQgQggAhNpCtIXMxCgKEIEAIAoQwIBuQuRgFAUIQIAQBQjiQvSFzMQoChCBACAKEcCA7kLkYBQFCECAEAUIEkKMhczEKAoQgQAgChAggJ5C5GAUBQhAgBAFCJJCzIXMxCgKEIEBIAoQcBTlHQU4uRkmAkAQISYCQoyDnAHJyMUoChCRASAKEnAU5Z0FOLkZJgJAECEmAkLMg5wJycjFKAoQkQEgChFwFOVdBThLpJEBIAoQkQEgpyClAThLpJEBIAoQkQEgpyCkFOUmkkwAhCRCSACH54CYVyEkinQQISYCQBAjJJze5C3KSSCcBQhIgJAFC7oKcG8hJIp0ECEmAkAQIaUA2IOO7Et+V+K4kQEh8V1pDxnglxisxXkmAkBivxHglxisxXonxSoxXYryyjVdivBLjlRivxHglxisxXonxSoxXYrwS45UYr2zjlRivxHglxisxXonxSoxXYrzmwHldzexmdcMndKPd19XxgdDAf12NdxPd8EHdwINdTUvPlsaGXY12sxnWTuzqWnq2NGZsDtzY1UyG4ceupqVXS2PJrsa6cYa1K7u6lpaWxphdzepGGIY3u5qW7k9BR38MOvpz0IFBm6Md2tW1tLY0Ju1qtJvNsL7WXJ2fLk6X3fXV5urm6dbp5HR6un26M2OfGfvM2GeGnRl2ZtiZYWeGnRl2ZtiZYWeGnRl2ZviZ4WeGnxl+ZviZ4WeGnxl+ZviZ4WdGnBlxZsSZEWdGnBlxZsSZEWdGnBlxZuSZkWdGnhl5ZuSZkWdGnhl5ZuSZ0XnEnB1IXN083TqdnE5Pt09np/PTxenOjHlmPLIJeXTrdHI6Pd0+nZ3OTxeny+4ep2F1Z8Y6M9aZsc6MdWasM2OdGevMWGeGnBlyZsiZIWeGnBlyZsiZIWeGnBlyZuiZoWfGI7q4f43mz/evH97//PL8R/2S1m9fP/7yj9/Z+vLfz/2V/q2uz6+ffnn+9evr8/2rGo+vffvx2/8A", + "debug_symbols": "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", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(leaf: [u8; 32], path: [u8; 64], index: u32, root: [u8; 32]) {\n compute_root(leaf, path, index, root);\n}\n\nfn compute_root(leaf: [u8; 32], path: [u8; 64], _index: u32, root: [u8; 32]) {\n let mut current = leaf;\n let mut index = _index;\n\n for i in 0..2 {\n let mut hash_input = [0; 64];\n let offset = i * 32;\n let is_right = (index & 1) != 0;\n let a = if is_right { 32 } else { 0 };\n let b = if is_right { 0 } else { 32 };\n\n for j in 0..32 {\n hash_input[j + a] = current[j];\n hash_input[j + b] = path[offset + j];\n }\n\n current = std::hash::blake3(hash_input);\n index = index >> 1;\n }\n\n // Regression for issue #4258\n assert(root == current);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 63289adfe45..6cfe9fa0383 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -86,12 +86,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32968 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 129 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32839), size_address: Relative(5), offset_address: Relative(6) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Cast { destination: Direct(32878), source: Direct(32878), bit_size: Integer(U8) }, Cast { destination: Direct(32879), source: Direct(32879), bit_size: Integer(U8) }, Cast { destination: Direct(32880), source: Direct(32880), bit_size: Integer(U8) }, Cast { destination: Direct(32881), source: Direct(32881), bit_size: Integer(U8) }, Cast { destination: Direct(32882), source: Direct(32882), bit_size: Integer(U8) }, Cast { destination: Direct(32883), source: Direct(32883), bit_size: Integer(U8) }, Cast { destination: Direct(32884), source: Direct(32884), bit_size: Integer(U8) }, Cast { destination: Direct(32885), source: Direct(32885), bit_size: Integer(U8) }, Cast { destination: Direct(32886), source: Direct(32886), bit_size: Integer(U8) }, Cast { destination: Direct(32887), source: Direct(32887), bit_size: Integer(U8) }, Cast { destination: Direct(32888), source: Direct(32888), bit_size: Integer(U8) }, Cast { destination: Direct(32889), source: Direct(32889), bit_size: Integer(U8) }, Cast { destination: Direct(32890), source: Direct(32890), bit_size: Integer(U8) }, Cast { destination: Direct(32891), source: Direct(32891), bit_size: Integer(U8) }, Cast { destination: Direct(32892), source: Direct(32892), bit_size: Integer(U8) }, Cast { destination: Direct(32893), source: Direct(32893), bit_size: Integer(U8) }, Cast { destination: Direct(32894), source: Direct(32894), bit_size: Integer(U8) }, Cast { destination: Direct(32895), source: Direct(32895), bit_size: Integer(U8) }, Cast { destination: Direct(32896), source: Direct(32896), bit_size: Integer(U8) }, Cast { destination: Direct(32897), source: Direct(32897), bit_size: Integer(U8) }, Cast { destination: Direct(32898), source: Direct(32898), bit_size: Integer(U8) }, Cast { destination: Direct(32899), source: Direct(32899), bit_size: Integer(U8) }, Cast { destination: Direct(32900), source: Direct(32900), bit_size: Integer(U8) }, Cast { destination: Direct(32901), source: Direct(32901), bit_size: Integer(U8) }, Cast { destination: Direct(32902), source: Direct(32902), bit_size: Integer(U8) }, Cast { destination: Direct(32903), source: Direct(32903), bit_size: Integer(U8) }, Cast { destination: Direct(32904), source: Direct(32904), bit_size: Integer(U8) }, Cast { destination: Direct(32905), source: Direct(32905), bit_size: Integer(U8) }, Cast { destination: Direct(32906), source: Direct(32906), bit_size: Integer(U8) }, Cast { destination: Direct(32907), source: Direct(32907), bit_size: Integer(U8) }, Cast { destination: Direct(32908), source: Direct(32908), bit_size: Integer(U8) }, Cast { destination: Direct(32909), source: Direct(32909), bit_size: Integer(U8) }, Cast { destination: Direct(32910), source: Direct(32910), bit_size: Integer(U8) }, Cast { destination: Direct(32911), source: Direct(32911), bit_size: Integer(U8) }, Cast { destination: Direct(32912), source: Direct(32912), bit_size: Integer(U8) }, Cast { destination: Direct(32913), source: Direct(32913), bit_size: Integer(U8) }, Cast { destination: Direct(32914), source: Direct(32914), bit_size: Integer(U8) }, Cast { destination: Direct(32915), source: Direct(32915), bit_size: Integer(U8) }, Cast { destination: Direct(32916), source: Direct(32916), bit_size: Integer(U8) }, Cast { destination: Direct(32917), source: Direct(32917), bit_size: Integer(U8) }, Cast { destination: Direct(32918), source: Direct(32918), bit_size: Integer(U8) }, Cast { destination: Direct(32919), source: Direct(32919), bit_size: Integer(U8) }, Cast { destination: Direct(32920), source: Direct(32920), bit_size: Integer(U8) }, Cast { destination: Direct(32921), source: Direct(32921), bit_size: Integer(U8) }, Cast { destination: Direct(32922), source: Direct(32922), bit_size: Integer(U8) }, Cast { destination: Direct(32923), source: Direct(32923), bit_size: Integer(U8) }, Cast { destination: Direct(32924), source: Direct(32924), bit_size: Integer(U8) }, Cast { destination: Direct(32925), source: Direct(32925), bit_size: Integer(U8) }, Cast { destination: Direct(32926), source: Direct(32926), bit_size: Integer(U8) }, Cast { destination: Direct(32927), source: Direct(32927), bit_size: Integer(U8) }, Cast { destination: Direct(32928), source: Direct(32928), bit_size: Integer(U8) }, Cast { destination: Direct(32929), source: Direct(32929), bit_size: Integer(U8) }, Cast { destination: Direct(32930), source: Direct(32930), bit_size: Integer(U8) }, Cast { destination: Direct(32931), source: Direct(32931), bit_size: Integer(U8) }, Cast { destination: Direct(32932), source: Direct(32932), bit_size: Integer(U8) }, Cast { destination: Direct(32933), source: Direct(32933), bit_size: Integer(U8) }, Cast { destination: Direct(32934), source: Direct(32934), bit_size: Integer(U8) }, Cast { destination: Direct(32935), source: Direct(32935), bit_size: Integer(U32) }, Cast { destination: Direct(32936), source: Direct(32936), bit_size: Integer(U8) }, Cast { destination: Direct(32937), source: Direct(32937), bit_size: Integer(U8) }, Cast { destination: Direct(32938), source: Direct(32938), bit_size: Integer(U8) }, Cast { destination: Direct(32939), source: Direct(32939), bit_size: Integer(U8) }, Cast { destination: Direct(32940), source: Direct(32940), bit_size: Integer(U8) }, Cast { destination: Direct(32941), source: Direct(32941), bit_size: Integer(U8) }, Cast { destination: Direct(32942), source: Direct(32942), bit_size: Integer(U8) }, Cast { destination: Direct(32943), source: Direct(32943), bit_size: Integer(U8) }, Cast { destination: Direct(32944), source: Direct(32944), bit_size: Integer(U8) }, Cast { destination: Direct(32945), source: Direct(32945), bit_size: Integer(U8) }, Cast { destination: Direct(32946), source: Direct(32946), bit_size: Integer(U8) }, Cast { destination: Direct(32947), source: Direct(32947), bit_size: Integer(U8) }, Cast { destination: Direct(32948), source: Direct(32948), bit_size: Integer(U8) }, Cast { destination: Direct(32949), source: Direct(32949), bit_size: Integer(U8) }, Cast { destination: Direct(32950), source: Direct(32950), bit_size: Integer(U8) }, Cast { destination: Direct(32951), source: Direct(32951), bit_size: Integer(U8) }, Cast { destination: Direct(32952), source: Direct(32952), bit_size: Integer(U8) }, Cast { destination: Direct(32953), source: Direct(32953), bit_size: Integer(U8) }, Cast { destination: Direct(32954), source: Direct(32954), bit_size: Integer(U8) }, Cast { destination: Direct(32955), source: Direct(32955), bit_size: Integer(U8) }, Cast { destination: Direct(32956), source: Direct(32956), bit_size: Integer(U8) }, Cast { destination: Direct(32957), source: Direct(32957), bit_size: Integer(U8) }, Cast { destination: Direct(32958), source: Direct(32958), bit_size: Integer(U8) }, Cast { destination: Direct(32959), source: Direct(32959), bit_size: Integer(U8) }, Cast { destination: Direct(32960), source: Direct(32960), bit_size: Integer(U8) }, Cast { destination: Direct(32961), source: Direct(32961), bit_size: Integer(U8) }, Cast { destination: Direct(32962), source: Direct(32962), bit_size: Integer(U8) }, Cast { destination: Direct(32963), source: Direct(32963), bit_size: Integer(U8) }, Cast { destination: Direct(32964), source: Direct(32964), bit_size: Integer(U8) }, Cast { destination: Direct(32965), source: Direct(32965), bit_size: Integer(U8) }, Cast { destination: Direct(32966), source: Direct(32966), bit_size: Integer(U8) }, Cast { destination: Direct(32967), source: Direct(32967), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 177 }, Mov { destination: Relative(1), source: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32871 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 177 }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32935) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32936 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 177 }, Mov { destination: Relative(4), source: Relative(5) }, Call { location: 188 }, Call { location: 193 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32968 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 187 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 180 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32836), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 32 }, Return, Call { location: 204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(1) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 210 }, Mov { destination: Direct(0), source: Relative(0) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 209 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 204 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Mov { destination: Relative(10), source: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 232 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 226 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 64 }, Const { destination: Relative(9), bit_size: Integer(U8), value: 1 }, Mov { destination: Relative(5), source: Direct(32835) }, Jump { location: 237 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(10), location: 253 }, Jump { location: 240 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(4) }, Mov { destination: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 342 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(6) }, JumpIf { condition: Relative(2), location: 252 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, Return, Load { destination: Relative(11), source_pointer: Relative(7) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 259 }, Call { location: 374 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(7) }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(14), source_pointer: Relative(1) }, Cast { destination: Relative(16), source: Relative(14), bit_size: Integer(U1) }, Cast { destination: Relative(15), source: Relative(16), bit_size: Integer(U32) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Direct(32835) }, Not { destination: Relative(15), source: Relative(14), bit_size: U1 }, Cast { destination: Relative(16), source: Relative(14), bit_size: Integer(U32) }, Cast { destination: Relative(14), source: Relative(15), bit_size: Integer(U32) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(16), rhs: Direct(32838) }, Mov { destination: Relative(10), source: Direct(32835) }, Jump { location: 276 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Direct(32838) }, JumpIf { condition: Relative(12), location: 295 }, Jump { location: 279 }, Load { destination: Relative(10), source_pointer: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 64 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(12), size: Relative(13) }, output: HeapArray { pointer: Relative(14), size: 32 } }), Store { destination_pointer: Relative(6), source: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(11), op: Shr, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(1), source: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Mov { destination: Relative(5), source: Relative(10) }, Jump { location: 237 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(15) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(16), location: 299 }, Call { location: 377 }, Load { destination: Relative(16), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(10) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Load { destination: Relative(16), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(18), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, JumpIf { condition: Relative(18), location: 307 }, Call { location: 380 }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 65 }, Call { location: 383 }, Mov { destination: Relative(18), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(12) }, Store { destination_pointer: Relative(20), source: Relative(17) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(16), location: 318 }, Call { location: 377 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(16) }, JumpIf { condition: Relative(17), location: 322 }, Call { location: 377 }, BinaryIntOp { destination: Relative(17), op: LessThan, bit_size: U32, lhs: Relative(16), rhs: Relative(8) }, JumpIf { condition: Relative(17), location: 325 }, Call { location: 380 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, JumpIf { condition: Relative(16), location: 331 }, Call { location: 380 }, Mov { destination: Direct(32771), source: Relative(18) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 65 }, Call { location: 383 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(12) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32837) }, Mov { destination: Relative(10), source: Relative(12) }, Jump { location: 276 }, Call { location: 204 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 352 }, Call { location: 374 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32835) }, Jump { location: 356 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, JumpIf { condition: Relative(5), location: 361 }, Jump { location: 359 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U8, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 356 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 387 }, Jump { location: 389 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 404 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 401 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 394 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 404 }, Return]" ], - "debug_symbols": "pZZLbuMwEETvorUX/DU/uUoQBI6jBAYE21DsAQaB7z7dUpWdWWQQcDauR1FdapJNmp/D6/hyeX/eH96OH8PD4+fwMu+naf/+PB132/P+eNCnn4OzH9/S8OA3qgLN0AKt0LZocA7qoWFVj7ZnO0ITVKAZqv7BtELbqsFBPTRAIzRBBZqh8AvwC/CL8Ivwi/peVE36PJnqczEN0AhNUIFmaIFWaFtVHBR+gnwF+QryFeQryFeQryDfjHwz8s0Yf4ZfVr9sKlD1K6YFqn7VtK1atL+Z2vo5hWoLaCtQPSEQIiERhJAJhVAJDdAwpc1DA9RMLPelthYohEpoK8SlvqKBJwRCJCSCEDLBnJNBJTSAdwRPCIRIMGcxEEImFII5Z4MGsJpdwRMCIRISwZyLQSYUQiU0gFXvCn5dvhgDIRISQQiZUAiVgDKIqPOIOo+o82h17qtBIVRCA1itr+AJgRAJ9LHC9lqBMfPlpaQth6WmF0gE2yXeIBMKwTaKLXGmYXEEc27X62bgAfd8nsfRzrcvJ56eg6ftPB7Ow8PhMk2b4dd2uiwvfZy2h0XP21l7NZHx8Kqqhm/7aTS6bu7R7vvQkhDrvb9Fy4/DtdYRr8XeEa+7H/G6/zvic+HYc3Ud8SVy/CX1fF/LnOOPpSc+R8aX0BV/m/9SO+JTE8Sn1pO/SEa8lJ71z4Hjz9IzfrnFS+gZv0TOn6Su7/tbfOipH8nlNn9d36+sP2k9+1fKbf1az/f1tnU7QFpLd4cfHwDONZ4ALrYeA383CLnHILp7BvV/M/huCCH8YxaDZxl4vf99dXjSxna3n/+6CV/Nat5vX6YRzbfLYfel9/z7xB7epE/zcTe+XubRnO7Xaf15jDVukktP+sekLV/KxteiLbt/PAaXNsE1a3p7V3tjaU9XS+0P", + "debug_symbols": "pZbdbuIwEIXfhWsu/Df+6atUVUVpukKKAKWw0qri3XcmOSd0L5Aq7w3nc5w5Gdtj46/N+/B2/fV6OH6cPjdPz1+bt+kwjodfr+Npv7scTkd9+rVx9uNb2jz5rapAM7RAK7TNGpyDemhY1KPt2Y7QBBVohqp/MK3QtmhwUA8N0AhNUIFmKPwC/AL8Ivwi/KK+F1WTPk+m+lxMAzRCE1SgGVqgFdoWFQeFnyBfQb6CfAX5CvIV5CvINyPfjHwzxp/hl9UvmwpU/YppgapfNW2LFu1vprZ+TqHaAppT9YRAiIREEEImFIIVhq1kbYCGKW0eGqBmYnM+19YMhVAJbYE411cy8IRAiIREEEImmLMYVEIDeEfwhECIBHPOBkLIhEIw52LQAFazC3hCIERCIphzNciEQqiEBrDqXcAvyxdjIERCIgghEwqhElAGEXUeUecRdR6tzn0zKIRKaACr9QU8IRAigT5zYdsXM1+eS9obREIi2C4JBplQCLZRbIkzDYsj2F5xt9t2wwPu9TINg51v3048PQfPu2k4XjZPx+s4bje/d+N1funzvDvOetlN2quWw/FdVQ0/DuNgdNveo93j0JIQ671fo+XH4VrriNdi74jX3Y943f8d8blw7Lm6jvgSOf6Ser6vZc7xx9ITnyPjS+iKX+e/1I741ATxqfXkL5IRL6Vn/XPg+LM8HL+d1Y8MvO5SVnAsebXw7cdDWFOQ0DOFErkEknqWUPwaH3pKUHJZl6Dr+5UTKK3nCJCylkDr+b5e2NYzqLV0d/jxGeJc4yHiYusx8HeDkHsMortnUP83g0dDsEJ9OIvBswy8XiG/O7xoY7c/TP9cpm9mNR12b+OA5sf1uP/We/lzZg8v4+fptB/er9NgTvcbuf48xxq3yaUX/W/Tli9l62vRll1hnoNL2+CaNb29q72xtJebpfYX", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(leaf: [u8; 32], path: [u8; 64], index: u32, root: [u8; 32]) {\n compute_root(leaf, path, index, root);\n}\n\nfn compute_root(leaf: [u8; 32], path: [u8; 64], _index: u32, root: [u8; 32]) {\n let mut current = leaf;\n let mut index = _index;\n\n for i in 0..2 {\n let mut hash_input = [0; 64];\n let offset = i * 32;\n let is_right = (index & 1) != 0;\n let a = if is_right { 32 } else { 0 };\n let b = if is_right { 0 } else { 32 };\n\n for j in 0..32 {\n hash_input[j + a] = current[j];\n hash_input[j + b] = path[offset + j];\n }\n\n current = std::hash::blake3(hash_input);\n index = index >> 1;\n }\n\n // Regression for issue #4258\n assert(root == current);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap index fe6f602412e..15b56ecca52 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap @@ -86,12 +86,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32965 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 129 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(5), offset_address: Relative(6) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U8) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U8) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U8) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Cast { destination: Direct(32878), source: Direct(32878), bit_size: Integer(U8) }, Cast { destination: Direct(32879), source: Direct(32879), bit_size: Integer(U8) }, Cast { destination: Direct(32880), source: Direct(32880), bit_size: Integer(U8) }, Cast { destination: Direct(32881), source: Direct(32881), bit_size: Integer(U8) }, Cast { destination: Direct(32882), source: Direct(32882), bit_size: Integer(U8) }, Cast { destination: Direct(32883), source: Direct(32883), bit_size: Integer(U8) }, Cast { destination: Direct(32884), source: Direct(32884), bit_size: Integer(U8) }, Cast { destination: Direct(32885), source: Direct(32885), bit_size: Integer(U8) }, Cast { destination: Direct(32886), source: Direct(32886), bit_size: Integer(U8) }, Cast { destination: Direct(32887), source: Direct(32887), bit_size: Integer(U8) }, Cast { destination: Direct(32888), source: Direct(32888), bit_size: Integer(U8) }, Cast { destination: Direct(32889), source: Direct(32889), bit_size: Integer(U8) }, Cast { destination: Direct(32890), source: Direct(32890), bit_size: Integer(U8) }, Cast { destination: Direct(32891), source: Direct(32891), bit_size: Integer(U8) }, Cast { destination: Direct(32892), source: Direct(32892), bit_size: Integer(U8) }, Cast { destination: Direct(32893), source: Direct(32893), bit_size: Integer(U8) }, Cast { destination: Direct(32894), source: Direct(32894), bit_size: Integer(U8) }, Cast { destination: Direct(32895), source: Direct(32895), bit_size: Integer(U8) }, Cast { destination: Direct(32896), source: Direct(32896), bit_size: Integer(U8) }, Cast { destination: Direct(32897), source: Direct(32897), bit_size: Integer(U8) }, Cast { destination: Direct(32898), source: Direct(32898), bit_size: Integer(U8) }, Cast { destination: Direct(32899), source: Direct(32899), bit_size: Integer(U8) }, Cast { destination: Direct(32900), source: Direct(32900), bit_size: Integer(U8) }, Cast { destination: Direct(32901), source: Direct(32901), bit_size: Integer(U8) }, Cast { destination: Direct(32902), source: Direct(32902), bit_size: Integer(U8) }, Cast { destination: Direct(32903), source: Direct(32903), bit_size: Integer(U8) }, Cast { destination: Direct(32904), source: Direct(32904), bit_size: Integer(U8) }, Cast { destination: Direct(32905), source: Direct(32905), bit_size: Integer(U8) }, Cast { destination: Direct(32906), source: Direct(32906), bit_size: Integer(U8) }, Cast { destination: Direct(32907), source: Direct(32907), bit_size: Integer(U8) }, Cast { destination: Direct(32908), source: Direct(32908), bit_size: Integer(U8) }, Cast { destination: Direct(32909), source: Direct(32909), bit_size: Integer(U8) }, Cast { destination: Direct(32910), source: Direct(32910), bit_size: Integer(U8) }, Cast { destination: Direct(32911), source: Direct(32911), bit_size: Integer(U8) }, Cast { destination: Direct(32912), source: Direct(32912), bit_size: Integer(U8) }, Cast { destination: Direct(32913), source: Direct(32913), bit_size: Integer(U8) }, Cast { destination: Direct(32914), source: Direct(32914), bit_size: Integer(U8) }, Cast { destination: Direct(32915), source: Direct(32915), bit_size: Integer(U8) }, Cast { destination: Direct(32916), source: Direct(32916), bit_size: Integer(U8) }, Cast { destination: Direct(32917), source: Direct(32917), bit_size: Integer(U8) }, Cast { destination: Direct(32918), source: Direct(32918), bit_size: Integer(U8) }, Cast { destination: Direct(32919), source: Direct(32919), bit_size: Integer(U8) }, Cast { destination: Direct(32920), source: Direct(32920), bit_size: Integer(U8) }, Cast { destination: Direct(32921), source: Direct(32921), bit_size: Integer(U8) }, Cast { destination: Direct(32922), source: Direct(32922), bit_size: Integer(U8) }, Cast { destination: Direct(32923), source: Direct(32923), bit_size: Integer(U8) }, Cast { destination: Direct(32924), source: Direct(32924), bit_size: Integer(U8) }, Cast { destination: Direct(32925), source: Direct(32925), bit_size: Integer(U8) }, Cast { destination: Direct(32926), source: Direct(32926), bit_size: Integer(U8) }, Cast { destination: Direct(32927), source: Direct(32927), bit_size: Integer(U8) }, Cast { destination: Direct(32928), source: Direct(32928), bit_size: Integer(U8) }, Cast { destination: Direct(32929), source: Direct(32929), bit_size: Integer(U8) }, Cast { destination: Direct(32930), source: Direct(32930), bit_size: Integer(U8) }, Cast { destination: Direct(32931), source: Direct(32931), bit_size: Integer(U8) }, Cast { destination: Direct(32932), source: Direct(32932), bit_size: Integer(U32) }, Cast { destination: Direct(32933), source: Direct(32933), bit_size: Integer(U8) }, Cast { destination: Direct(32934), source: Direct(32934), bit_size: Integer(U8) }, Cast { destination: Direct(32935), source: Direct(32935), bit_size: Integer(U8) }, Cast { destination: Direct(32936), source: Direct(32936), bit_size: Integer(U8) }, Cast { destination: Direct(32937), source: Direct(32937), bit_size: Integer(U8) }, Cast { destination: Direct(32938), source: Direct(32938), bit_size: Integer(U8) }, Cast { destination: Direct(32939), source: Direct(32939), bit_size: Integer(U8) }, Cast { destination: Direct(32940), source: Direct(32940), bit_size: Integer(U8) }, Cast { destination: Direct(32941), source: Direct(32941), bit_size: Integer(U8) }, Cast { destination: Direct(32942), source: Direct(32942), bit_size: Integer(U8) }, Cast { destination: Direct(32943), source: Direct(32943), bit_size: Integer(U8) }, Cast { destination: Direct(32944), source: Direct(32944), bit_size: Integer(U8) }, Cast { destination: Direct(32945), source: Direct(32945), bit_size: Integer(U8) }, Cast { destination: Direct(32946), source: Direct(32946), bit_size: Integer(U8) }, Cast { destination: Direct(32947), source: Direct(32947), bit_size: Integer(U8) }, Cast { destination: Direct(32948), source: Direct(32948), bit_size: Integer(U8) }, Cast { destination: Direct(32949), source: Direct(32949), bit_size: Integer(U8) }, Cast { destination: Direct(32950), source: Direct(32950), bit_size: Integer(U8) }, Cast { destination: Direct(32951), source: Direct(32951), bit_size: Integer(U8) }, Cast { destination: Direct(32952), source: Direct(32952), bit_size: Integer(U8) }, Cast { destination: Direct(32953), source: Direct(32953), bit_size: Integer(U8) }, Cast { destination: Direct(32954), source: Direct(32954), bit_size: Integer(U8) }, Cast { destination: Direct(32955), source: Direct(32955), bit_size: Integer(U8) }, Cast { destination: Direct(32956), source: Direct(32956), bit_size: Integer(U8) }, Cast { destination: Direct(32957), source: Direct(32957), bit_size: Integer(U8) }, Cast { destination: Direct(32958), source: Direct(32958), bit_size: Integer(U8) }, Cast { destination: Direct(32959), source: Direct(32959), bit_size: Integer(U8) }, Cast { destination: Direct(32960), source: Direct(32960), bit_size: Integer(U8) }, Cast { destination: Direct(32961), source: Direct(32961), bit_size: Integer(U8) }, Cast { destination: Direct(32962), source: Direct(32962), bit_size: Integer(U8) }, Cast { destination: Direct(32963), source: Direct(32963), bit_size: Integer(U8) }, Cast { destination: Direct(32964), source: Direct(32964), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 177 }, Mov { destination: Relative(1), source: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32868 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 177 }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32932) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32933 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 177 }, Mov { destination: Relative(4), source: Relative(5) }, Call { location: 188 }, Call { location: 189 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32965 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 187 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 180 }, Return, Return, Call { location: 347 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Mov { destination: Relative(10), source: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 211 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 205 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(10), bit_size: Integer(U1), value: 1 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 64 }, Const { destination: Relative(13), bit_size: Integer(U8), value: 1 }, Mov { destination: Relative(5), source: Relative(3) }, Jump { location: 220 }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, JumpIf { condition: Relative(14), location: 258 }, Jump { location: 223 }, Load { destination: Relative(2), source_pointer: Relative(6) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 233 }, Call { location: 353 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Jump { location: 237 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(9) }, JumpIf { condition: Relative(3), location: 245 }, Jump { location: 240 }, Load { destination: Relative(1), source_pointer: Relative(5) }, JumpIf { condition: Relative(1), location: 244 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, Load { destination: Relative(3), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U8, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(3), rhs: Relative(8) }, Store { destination_pointer: Relative(5), source: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Mov { destination: Relative(1), source: Relative(3) }, Jump { location: 237 }, Load { destination: Relative(15), source_pointer: Relative(7) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(15) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 264 }, Call { location: 353 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(15) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, Load { destination: Relative(18), source_pointer: Relative(1) }, Cast { destination: Relative(20), source: Relative(18), bit_size: Integer(U1) }, Cast { destination: Relative(19), source: Relative(20), bit_size: Integer(U32) }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(3) }, Not { destination: Relative(19), source: Relative(18), bit_size: U1 }, Cast { destination: Relative(20), source: Relative(18), bit_size: Integer(U32) }, Cast { destination: Relative(18), source: Relative(19), bit_size: Integer(U32) }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(18), rhs: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Mul, bit_size: U32, lhs: Relative(20), rhs: Relative(9) }, Mov { destination: Relative(14), source: Relative(3) }, Jump { location: 281 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, JumpIf { condition: Relative(16), location: 300 }, Jump { location: 284 }, Load { destination: Relative(14), source_pointer: Relative(15) }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 64 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(16), size: Relative(17) }, output: HeapArray { pointer: Relative(18), size: 32 } }), Store { destination_pointer: Relative(6), source: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(15), op: Shr, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Store { destination_pointer: Relative(1), source: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(11) }, Mov { destination: Relative(5), source: Relative(14) }, Jump { location: 220 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(19) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(16) }, JumpIf { condition: Relative(20), location: 304 }, Call { location: 356 }, Load { destination: Relative(20), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(14) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Load { destination: Relative(20), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, JumpIf { condition: Relative(22), location: 312 }, Call { location: 359 }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 65 }, Call { location: 362 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(16) }, Store { destination_pointer: Relative(24), source: Relative(21) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(18) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(16) }, JumpIf { condition: Relative(20), location: 323 }, Call { location: 356 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(17), rhs: Relative(20) }, JumpIf { condition: Relative(21), location: 327 }, Call { location: 356 }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(12) }, JumpIf { condition: Relative(21), location: 330 }, Call { location: 359 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(20) }, Load { destination: Relative(21), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, JumpIf { condition: Relative(20), location: 336 }, Call { location: 359 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 65 }, Call { location: 362 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(16) }, Store { destination_pointer: Relative(24), source: Relative(21) }, Store { destination_pointer: Relative(15), source: Relative(20) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Mov { destination: Relative(14), source: Relative(16) }, Jump { location: 281 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 352 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 366 }, Jump { location: 368 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 383 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 380 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 373 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 383 }, Return]" ], - "debug_symbols": "tZZBbuMwDEXv4nUWpiRSUq8yKIo0dYsARhK4yQCDIncf0v502kWKgQbd5D3HJiXRtOyP7mV4vrw97Q+vx/fu4ddH9zztx3H/9jQed9vz/njQfz+63n6oKsJGSWAAI5hABqV7iMYMFrDODH0PEhjACCaQQQEzWEDkI+QLymTUPGzUPNnIoICapxgLWBfGHiQwgBFMIOKTXl+Ner0YAxhBxnU6LvUm2aW46NBEKty7kItmI1sWx2UYTiCDKAOjDIIyCMoqKKugrIKyCsoqKKugrIJ8YnOyOubexeZkFc3BRXOSrTEnSLFrrLrF/rFlFx2HbKJFXLJLcakQ67FFyCW4RJfkwssNtkabmWdGa6zQm5BLcIkuycW6lUzEJbsUlwqxFluEXCxzMIkuyYVdxCW7FBfLrNWO1rSLkEtwsczJJLmwi7hkl+JSIdbOwcpi/bxIcIkuyYVdZLl90bp8keJSIdb4i5BLcIkucxtcr5vOd5Sn8zQMtqF82mJ04zltp+Fw7h4Ol3HcdL+342W+6P20Pcw8byc9q3dsOLwoNeHrfhzMrptbdH8/NCfEEtEazV/D6cfCtQURrz3YEK+PJeL1wWyIl+ylk9K3LD/6+nO6O778XLy+PdYbUGu6ZfjXBPq6qV7BPtaWBHRLEKQlQexvMyj/O4N7S6DwTRWD7c1LFfU9dy/DN20cyds45pbHQKLH59AUvz5GuTTEp8qIT7Vl/syCeM4tj7EEX79wy/p5jefQsn6OXj9OTePTGh9atiGWvNavafzi/ce1ZRvmvN6/+nX8Rz3a7vbTly/fq2Wa9tvnccDh6+Ww+3T2/OfkZ/zL+TQdd8PLZRos0+3zWX9+WffGEh/1vahHlPOGStYjmk+mvIkc7JDsUDstcnm82tT+Ag==", + "debug_symbols": "tZbRbqswDIbfhete4Dh2kr3KNE2sYxMSohVrj3Q09d2PDTbdLlpNOdpN/4+Cndj5E/hsXvuX8/vzML0dPpqHx8/mZR7GcXh/Hg/77jQcJvn3s2n1B4pI2ImCaTBF02hKptw8oGoyzaZl0dC2pmAaTNE0mpIpmybTbGr5wPIF0agqeUhV8iRVMmVTyZNVs2lZFVtTMA2maBpNLT7K80VVnmfVYIqmZM/JuNAqJIfsIEMDCFDrAA6SDbQswnUYiqZkam0gawNbG9jaytZWtraytZWtrWxtZWsrWz7WOWkfU+ugc9KOpuAgOUFrTNEg6zPa3az/aNlZ7aBFZnZIDtmhGCweWwAcgoOOpQWrz1agdYHVaIumRVGNFUABHIIDOkQHnV5QYIfkkB2KgVpsBXDQzKiADtGBHNghOWQHzSy9RTXtCuAQHDSz1qVGXoEc2CE5ZIdioHYOrAAOwQEdogM58Lp8qC5fITsUAzX+CuAQHNBhscHlsmv8RHk+zX2vB8qXI0YOnmM399OpeZjO47hr/nTjeXno49hNi566We6KEfrpVVQSvg1jr3TZXaPb26EpWiwAbNH0PRx+LVwsaPHiwYp42ZYWLxuzIp6Tt45zW1M+ev0p3hyffy9e3h7bApQSrxl+mkBeN8U72GKpSQDXBIFrEmB7nUH+3xncKgHCnS4GPZvXLsp77laGOzZGcBtjqtkGjB6fQlX8to1SroiPhSw+lpr5E7HFU6rZxhy8fqbb9Zc7K4jsKwCYri6E8uMStilQqGkhoS8BxZolJNjiQ81JRpy2JagaP3sDqdSc5JQ2C5Tv4z/JVbcf5m8fzxfNNA/dy9jb5dt52n+5e/p79Dv+8X2cD/v+9Tz3mun6BS4/j7oBMOOTvFrlClLaQU5yBcvNmHZIQS9BL8WsSPnpolP7Bw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(leaf: [u8; 32], path: [u8; 64], index: u32, root: [u8; 32]) {\n compute_root(leaf, path, index, root);\n}\n\nfn compute_root(leaf: [u8; 32], path: [u8; 64], _index: u32, root: [u8; 32]) {\n let mut current = leaf;\n let mut index = _index;\n\n for i in 0..2 {\n let mut hash_input = [0; 64];\n let offset = i * 32;\n let is_right = (index & 1) != 0;\n let a = if is_right { 32 } else { 0 };\n let b = if is_right { 0 } else { 32 };\n\n for j in 0..32 {\n hash_input[j + a] = current[j];\n hash_input[j + b] = path[offset + j];\n }\n\n current = std::hash::blake3(hash_input);\n index = index >> 1;\n }\n\n // Regression for issue #4258\n assert(root == current);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index fe6f602412e..15b56ecca52 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -86,12 +86,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32965 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 129 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(5), offset_address: Relative(6) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U8) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U8) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U8) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Cast { destination: Direct(32878), source: Direct(32878), bit_size: Integer(U8) }, Cast { destination: Direct(32879), source: Direct(32879), bit_size: Integer(U8) }, Cast { destination: Direct(32880), source: Direct(32880), bit_size: Integer(U8) }, Cast { destination: Direct(32881), source: Direct(32881), bit_size: Integer(U8) }, Cast { destination: Direct(32882), source: Direct(32882), bit_size: Integer(U8) }, Cast { destination: Direct(32883), source: Direct(32883), bit_size: Integer(U8) }, Cast { destination: Direct(32884), source: Direct(32884), bit_size: Integer(U8) }, Cast { destination: Direct(32885), source: Direct(32885), bit_size: Integer(U8) }, Cast { destination: Direct(32886), source: Direct(32886), bit_size: Integer(U8) }, Cast { destination: Direct(32887), source: Direct(32887), bit_size: Integer(U8) }, Cast { destination: Direct(32888), source: Direct(32888), bit_size: Integer(U8) }, Cast { destination: Direct(32889), source: Direct(32889), bit_size: Integer(U8) }, Cast { destination: Direct(32890), source: Direct(32890), bit_size: Integer(U8) }, Cast { destination: Direct(32891), source: Direct(32891), bit_size: Integer(U8) }, Cast { destination: Direct(32892), source: Direct(32892), bit_size: Integer(U8) }, Cast { destination: Direct(32893), source: Direct(32893), bit_size: Integer(U8) }, Cast { destination: Direct(32894), source: Direct(32894), bit_size: Integer(U8) }, Cast { destination: Direct(32895), source: Direct(32895), bit_size: Integer(U8) }, Cast { destination: Direct(32896), source: Direct(32896), bit_size: Integer(U8) }, Cast { destination: Direct(32897), source: Direct(32897), bit_size: Integer(U8) }, Cast { destination: Direct(32898), source: Direct(32898), bit_size: Integer(U8) }, Cast { destination: Direct(32899), source: Direct(32899), bit_size: Integer(U8) }, Cast { destination: Direct(32900), source: Direct(32900), bit_size: Integer(U8) }, Cast { destination: Direct(32901), source: Direct(32901), bit_size: Integer(U8) }, Cast { destination: Direct(32902), source: Direct(32902), bit_size: Integer(U8) }, Cast { destination: Direct(32903), source: Direct(32903), bit_size: Integer(U8) }, Cast { destination: Direct(32904), source: Direct(32904), bit_size: Integer(U8) }, Cast { destination: Direct(32905), source: Direct(32905), bit_size: Integer(U8) }, Cast { destination: Direct(32906), source: Direct(32906), bit_size: Integer(U8) }, Cast { destination: Direct(32907), source: Direct(32907), bit_size: Integer(U8) }, Cast { destination: Direct(32908), source: Direct(32908), bit_size: Integer(U8) }, Cast { destination: Direct(32909), source: Direct(32909), bit_size: Integer(U8) }, Cast { destination: Direct(32910), source: Direct(32910), bit_size: Integer(U8) }, Cast { destination: Direct(32911), source: Direct(32911), bit_size: Integer(U8) }, Cast { destination: Direct(32912), source: Direct(32912), bit_size: Integer(U8) }, Cast { destination: Direct(32913), source: Direct(32913), bit_size: Integer(U8) }, Cast { destination: Direct(32914), source: Direct(32914), bit_size: Integer(U8) }, Cast { destination: Direct(32915), source: Direct(32915), bit_size: Integer(U8) }, Cast { destination: Direct(32916), source: Direct(32916), bit_size: Integer(U8) }, Cast { destination: Direct(32917), source: Direct(32917), bit_size: Integer(U8) }, Cast { destination: Direct(32918), source: Direct(32918), bit_size: Integer(U8) }, Cast { destination: Direct(32919), source: Direct(32919), bit_size: Integer(U8) }, Cast { destination: Direct(32920), source: Direct(32920), bit_size: Integer(U8) }, Cast { destination: Direct(32921), source: Direct(32921), bit_size: Integer(U8) }, Cast { destination: Direct(32922), source: Direct(32922), bit_size: Integer(U8) }, Cast { destination: Direct(32923), source: Direct(32923), bit_size: Integer(U8) }, Cast { destination: Direct(32924), source: Direct(32924), bit_size: Integer(U8) }, Cast { destination: Direct(32925), source: Direct(32925), bit_size: Integer(U8) }, Cast { destination: Direct(32926), source: Direct(32926), bit_size: Integer(U8) }, Cast { destination: Direct(32927), source: Direct(32927), bit_size: Integer(U8) }, Cast { destination: Direct(32928), source: Direct(32928), bit_size: Integer(U8) }, Cast { destination: Direct(32929), source: Direct(32929), bit_size: Integer(U8) }, Cast { destination: Direct(32930), source: Direct(32930), bit_size: Integer(U8) }, Cast { destination: Direct(32931), source: Direct(32931), bit_size: Integer(U8) }, Cast { destination: Direct(32932), source: Direct(32932), bit_size: Integer(U32) }, Cast { destination: Direct(32933), source: Direct(32933), bit_size: Integer(U8) }, Cast { destination: Direct(32934), source: Direct(32934), bit_size: Integer(U8) }, Cast { destination: Direct(32935), source: Direct(32935), bit_size: Integer(U8) }, Cast { destination: Direct(32936), source: Direct(32936), bit_size: Integer(U8) }, Cast { destination: Direct(32937), source: Direct(32937), bit_size: Integer(U8) }, Cast { destination: Direct(32938), source: Direct(32938), bit_size: Integer(U8) }, Cast { destination: Direct(32939), source: Direct(32939), bit_size: Integer(U8) }, Cast { destination: Direct(32940), source: Direct(32940), bit_size: Integer(U8) }, Cast { destination: Direct(32941), source: Direct(32941), bit_size: Integer(U8) }, Cast { destination: Direct(32942), source: Direct(32942), bit_size: Integer(U8) }, Cast { destination: Direct(32943), source: Direct(32943), bit_size: Integer(U8) }, Cast { destination: Direct(32944), source: Direct(32944), bit_size: Integer(U8) }, Cast { destination: Direct(32945), source: Direct(32945), bit_size: Integer(U8) }, Cast { destination: Direct(32946), source: Direct(32946), bit_size: Integer(U8) }, Cast { destination: Direct(32947), source: Direct(32947), bit_size: Integer(U8) }, Cast { destination: Direct(32948), source: Direct(32948), bit_size: Integer(U8) }, Cast { destination: Direct(32949), source: Direct(32949), bit_size: Integer(U8) }, Cast { destination: Direct(32950), source: Direct(32950), bit_size: Integer(U8) }, Cast { destination: Direct(32951), source: Direct(32951), bit_size: Integer(U8) }, Cast { destination: Direct(32952), source: Direct(32952), bit_size: Integer(U8) }, Cast { destination: Direct(32953), source: Direct(32953), bit_size: Integer(U8) }, Cast { destination: Direct(32954), source: Direct(32954), bit_size: Integer(U8) }, Cast { destination: Direct(32955), source: Direct(32955), bit_size: Integer(U8) }, Cast { destination: Direct(32956), source: Direct(32956), bit_size: Integer(U8) }, Cast { destination: Direct(32957), source: Direct(32957), bit_size: Integer(U8) }, Cast { destination: Direct(32958), source: Direct(32958), bit_size: Integer(U8) }, Cast { destination: Direct(32959), source: Direct(32959), bit_size: Integer(U8) }, Cast { destination: Direct(32960), source: Direct(32960), bit_size: Integer(U8) }, Cast { destination: Direct(32961), source: Direct(32961), bit_size: Integer(U8) }, Cast { destination: Direct(32962), source: Direct(32962), bit_size: Integer(U8) }, Cast { destination: Direct(32963), source: Direct(32963), bit_size: Integer(U8) }, Cast { destination: Direct(32964), source: Direct(32964), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 177 }, Mov { destination: Relative(1), source: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32868 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 177 }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32932) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32933 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 177 }, Mov { destination: Relative(4), source: Relative(5) }, Call { location: 188 }, Call { location: 189 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32965 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 187 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 180 }, Return, Return, Call { location: 347 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Mov { destination: Relative(10), source: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 211 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 205 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(10), bit_size: Integer(U1), value: 1 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 64 }, Const { destination: Relative(13), bit_size: Integer(U8), value: 1 }, Mov { destination: Relative(5), source: Relative(3) }, Jump { location: 220 }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, JumpIf { condition: Relative(14), location: 258 }, Jump { location: 223 }, Load { destination: Relative(2), source_pointer: Relative(6) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 233 }, Call { location: 353 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Jump { location: 237 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(9) }, JumpIf { condition: Relative(3), location: 245 }, Jump { location: 240 }, Load { destination: Relative(1), source_pointer: Relative(5) }, JumpIf { condition: Relative(1), location: 244 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, Load { destination: Relative(3), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U8, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(3), rhs: Relative(8) }, Store { destination_pointer: Relative(5), source: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Mov { destination: Relative(1), source: Relative(3) }, Jump { location: 237 }, Load { destination: Relative(15), source_pointer: Relative(7) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(15) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 264 }, Call { location: 353 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(15) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, Load { destination: Relative(18), source_pointer: Relative(1) }, Cast { destination: Relative(20), source: Relative(18), bit_size: Integer(U1) }, Cast { destination: Relative(19), source: Relative(20), bit_size: Integer(U32) }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(3) }, Not { destination: Relative(19), source: Relative(18), bit_size: U1 }, Cast { destination: Relative(20), source: Relative(18), bit_size: Integer(U32) }, Cast { destination: Relative(18), source: Relative(19), bit_size: Integer(U32) }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(18), rhs: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Mul, bit_size: U32, lhs: Relative(20), rhs: Relative(9) }, Mov { destination: Relative(14), source: Relative(3) }, Jump { location: 281 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, JumpIf { condition: Relative(16), location: 300 }, Jump { location: 284 }, Load { destination: Relative(14), source_pointer: Relative(15) }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 64 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(16), size: Relative(17) }, output: HeapArray { pointer: Relative(18), size: 32 } }), Store { destination_pointer: Relative(6), source: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(15), op: Shr, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Store { destination_pointer: Relative(1), source: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(11) }, Mov { destination: Relative(5), source: Relative(14) }, Jump { location: 220 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(19) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(16) }, JumpIf { condition: Relative(20), location: 304 }, Call { location: 356 }, Load { destination: Relative(20), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(14) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Load { destination: Relative(20), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, JumpIf { condition: Relative(22), location: 312 }, Call { location: 359 }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 65 }, Call { location: 362 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(16) }, Store { destination_pointer: Relative(24), source: Relative(21) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(18) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(16) }, JumpIf { condition: Relative(20), location: 323 }, Call { location: 356 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(17), rhs: Relative(20) }, JumpIf { condition: Relative(21), location: 327 }, Call { location: 356 }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(12) }, JumpIf { condition: Relative(21), location: 330 }, Call { location: 359 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(20) }, Load { destination: Relative(21), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, JumpIf { condition: Relative(20), location: 336 }, Call { location: 359 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 65 }, Call { location: 362 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(16) }, Store { destination_pointer: Relative(24), source: Relative(21) }, Store { destination_pointer: Relative(15), source: Relative(20) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Mov { destination: Relative(14), source: Relative(16) }, Jump { location: 281 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 352 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 366 }, Jump { location: 368 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 383 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 380 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 373 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 383 }, Return]" ], - "debug_symbols": "tZZBbuMwDEXv4nUWpiRSUq8yKIo0dYsARhK4yQCDIncf0v502kWKgQbd5D3HJiXRtOyP7mV4vrw97Q+vx/fu4ddH9zztx3H/9jQed9vz/njQfz+63n6oKsJGSWAAI5hABqV7iMYMFrDODH0PEhjACCaQQQEzWEDkI+QLymTUPGzUPNnIoICapxgLWBfGHiQwgBFMIOKTXl+Ner0YAxhBxnU6LvUm2aW46NBEKty7kItmI1sWx2UYTiCDKAOjDIIyCMoqKKugrIKyCsoqKKugrIJ8YnOyOubexeZkFc3BRXOSrTEnSLFrrLrF/rFlFx2HbKJFXLJLcakQ67FFyCW4RJfkwssNtkabmWdGa6zQm5BLcIkuycW6lUzEJbsUlwqxFluEXCxzMIkuyYVdxCW7FBfLrNWO1rSLkEtwsczJJLmwi7hkl+JSIdbOwcpi/bxIcIkuyYVdZLl90bp8keJSIdb4i5BLcIkucxtcr5vOd5Sn8zQMtqF82mJ04zltp+Fw7h4Ol3HcdL+342W+6P20Pcw8byc9q3dsOLwoNeHrfhzMrptbdH8/NCfEEtEazV/D6cfCtQURrz3YEK+PJeL1wWyIl+ylk9K3LD/6+nO6O778XLy+PdYbUGu6ZfjXBPq6qV7BPtaWBHRLEKQlQexvMyj/O4N7S6DwTRWD7c1LFfU9dy/DN20cyds45pbHQKLH59AUvz5GuTTEp8qIT7Vl/syCeM4tj7EEX79wy/p5jefQsn6OXj9OTePTGh9atiGWvNavafzi/ce1ZRvmvN6/+nX8Rz3a7vbTly/fq2Wa9tvnccDh6+Ww+3T2/OfkZ/zL+TQdd8PLZRos0+3zWX9+WffGEh/1vahHlPOGStYjmk+mvIkc7JDsUDstcnm82tT+Ag==", + "debug_symbols": "tZbRbqswDIbfhete4Dh2kr3KNE2sYxMSohVrj3Q09d2PDTbdLlpNOdpN/4+Cndj5E/hsXvuX8/vzML0dPpqHx8/mZR7GcXh/Hg/77jQcJvn3s2n1B4pI2ImCaTBF02hKptw8oGoyzaZl0dC2pmAaTNE0mpIpmybTbGr5wPIF0agqeUhV8iRVMmVTyZNVs2lZFVtTMA2maBpNLT7K80VVnmfVYIqmZM/JuNAqJIfsIEMDCFDrAA6SDbQswnUYiqZkam0gawNbG9jaytZWtraytZWtrWxtZWsrWz7WOWkfU+ugc9KOpuAgOUFrTNEg6zPa3az/aNlZ7aBFZnZIDtmhGCweWwAcgoOOpQWrz1agdYHVaIumRVGNFUABHIIDOkQHnV5QYIfkkB2KgVpsBXDQzKiADtGBHNghOWQHzSy9RTXtCuAQHDSz1qVGXoEc2CE5ZIdioHYOrAAOwQEdogM58Lp8qC5fITsUAzX+CuAQHNBhscHlsmv8RHk+zX2vB8qXI0YOnmM399OpeZjO47hr/nTjeXno49hNi566We6KEfrpVVQSvg1jr3TZXaPb26EpWiwAbNH0PRx+LVwsaPHiwYp42ZYWLxuzIp6Tt45zW1M+ev0p3hyffy9e3h7bApQSrxl+mkBeN8U72GKpSQDXBIFrEmB7nUH+3xncKgHCnS4GPZvXLsp77laGOzZGcBtjqtkGjB6fQlX8to1SroiPhSw+lpr5E7HFU6rZxhy8fqbb9Zc7K4jsKwCYri6E8uMStilQqGkhoS8BxZolJNjiQ81JRpy2JagaP3sDqdSc5JQ2C5Tv4z/JVbcf5m8fzxfNNA/dy9jb5dt52n+5e/p79Dv+8X2cD/v+9Tz3mun6BS4/j7oBMOOTvFrlClLaQU5yBcvNmHZIQS9BL8WsSPnpolP7Bw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(leaf: [u8; 32], path: [u8; 64], index: u32, root: [u8; 32]) {\n compute_root(leaf, path, index, root);\n}\n\nfn compute_root(leaf: [u8; 32], path: [u8; 64], _index: u32, root: [u8; 32]) {\n let mut current = leaf;\n let mut index = _index;\n\n for i in 0..2 {\n let mut hash_input = [0; 64];\n let offset = i * 32;\n let is_right = (index & 1) != 0;\n let a = if is_right { 32 } else { 0 };\n let b = if is_right { 0 } else { 32 };\n\n for j in 0..32 {\n hash_input[j + a] = current[j];\n hash_input[j + b] = path[offset + j];\n }\n\n current = std::hash::blake3(hash_input);\n index = index >> 1;\n }\n\n // Regression for issue #4258\n assert(root == current);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__expanded.snap index f3d50b7c517..c16cdbdad86 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__expanded.snap @@ -14,13 +14,13 @@ struct Foo { fn main(mut x: [Foo; 3], y: pub Field, hash_result: pub [u8; 32]) { { - let i_3772: Field = y - 1; - x[i_3772].bar.inner = [106, 107, 10]; + let i_3775: Field = y - 1; + x[i_3775].bar.inner = [106, 107, 10]; }; let mut hash_input: [u8; 3] = x[y - 1].bar.inner; { - let i_3774: Field = y - 1; - hash_input[i_3774] = 0; + let i_3777: Field = y - 1; + hash_input[i_3777] = 0; }; let hash: [u8; 32] = std::hash::blake3(hash_input); assert(hash == hash_result); diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 548aa0ff1ed..5f141f1d002 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -225,8 +225,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "ndTNasJAFIbhe5l1FnPO/GSmt1KKRB1LIERJk0KR3HuP+U6sXbRIVq8av0ckQ67mWPbT+67tT+cP8/J6Nfuh7br2fdedD83Ynnv59DpXZn27G4dS5CPzcF1Wl2Yo/Whe+qnrKvPZdNPypY9L0y8dm0Gu2sqU/igV8NR25fZqrn7W9u8pO6djduk+D8/v430fw5a9o/vv5y37vP6+s7Rh70PUva/dln32ug+8ZR9cXvch/rWv//n/llaALT8IzwPO3oHHIzDPb/KmObTDrzNrPMs3K+Md4pGARLkPkhpJSF4SLEIIIw7xSECgBCgBSoASoUQoEUqEEqFEKBFKFEVuUUxIXlJbhBBGHOKRgEQESg2lhpKgJCgJSoKSoCQoCUqCkqAkKFmUICGEEVHkYGaPBCQi9XJDc0LyErJWS1rWOq3XBm3U1tqkVY/UI/VIPVKP1CP1SD1Sj9Qj9Vg9Vo/VY/VYPVaP1WP1+ObNt3M8tM2+K/r8PE394eFxOn5d1ivrA/cynA/lOA3ldoyXa3KwvwE=", + "debug_symbols": "ndTBbqswEIXhd/GahWdsD3Zf5eoqIolTISESUahURbx7Hc5A00WqKKs/wcwHAourOeb99L5r+9P5w7z9u5r90HZd+77rzodmbM99OXqdK7P+3Y1DzuWQuVsvU5dmyP1o3vqp6yrz2XTTctLHpemXjs1QVm1lcn8sLeCp7fLt11z9TNvHo+ycDrOL23h4fl62eQmvzDvarp9emU/r9Z2lF+Z9EJ33tXtlPnmdD/xwXh7Pk5P1AZCrZRMoPXsHwaX1DoI8uoP4xxO0tAJs+U54HnB2A+430Tz/L3+aQzv82vXGczmzMt4hHgmIlDdZUiMRSUuCRQhhxCEeCQiUACVACVAEikARKAJFoAgUgSJFKS9ZIpKW1BYhhBGHeCQggkCpodRQIpQIJUKJUCKUCCVCiVAilAglFSWUEMJIUeoSjwREkHp5oSkiaQlZqyUta53Wa4NWtLU2atUj9Ug9Uo/UI/VIPVKP1CP1SD1Wj9Vj9Vg9Vo/VY/VYPb55820fD22z77J+gU9Tf7j7II9fl3Vl/WRfhvMhH6ch37bxslY29jc=", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "struct Bar {\n inner: [u8; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nfn main(mut x: [Foo; 3], y: pub Field, hash_result: pub [u8; 32]) {\n // Simple dynamic array set for entire inner most array\n x[y - 1].bar.inner = [106, 107, 10];\n let mut hash_input = x[y - 1].bar.inner;\n // Make sure that we are passing a dynamic array to the black box function call\n // by setting the array using a dynamic index here\n hash_input[y - 1] = 0;\n let hash = std::hash::blake3(hash_input);\n assert_eq(hash, hash_result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_0.snap index 548aa0ff1ed..5f141f1d002 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_0.snap @@ -225,8 +225,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "ndTNasJAFIbhe5l1FnPO/GSmt1KKRB1LIERJk0KR3HuP+U6sXbRIVq8av0ckQ67mWPbT+67tT+cP8/J6Nfuh7br2fdedD83Ynnv59DpXZn27G4dS5CPzcF1Wl2Yo/Whe+qnrKvPZdNPypY9L0y8dm0Gu2sqU/igV8NR25fZqrn7W9u8pO6djduk+D8/v430fw5a9o/vv5y37vP6+s7Rh70PUva/dln32ug+8ZR9cXvch/rWv//n/llaALT8IzwPO3oHHIzDPb/KmObTDrzNrPMs3K+Md4pGARLkPkhpJSF4SLEIIIw7xSECgBCgBSoASoUQoEUqEEqFEKBFKFEVuUUxIXlJbhBBGHOKRgEQESg2lhpKgJCgJSoKSoCQoCUqCkqAkKFmUICGEEVHkYGaPBCQi9XJDc0LyErJWS1rWOq3XBm3U1tqkVY/UI/VIPVKP1CP1SD1Sj9Qj9Vg9Vo/VY/VYPVaP1WP1+ObNt3M8tM2+K/r8PE394eFxOn5d1ivrA/cynA/lOA3ldoyXa3KwvwE=", + "debug_symbols": "ndTBbqswEIXhd/GahWdsD3Zf5eoqIolTISESUahURbx7Hc5A00WqKKs/wcwHAourOeb99L5r+9P5w7z9u5r90HZd+77rzodmbM99OXqdK7P+3Y1DzuWQuVsvU5dmyP1o3vqp6yrz2XTTctLHpemXjs1QVm1lcn8sLeCp7fLt11z9TNvHo+ycDrOL23h4fl62eQmvzDvarp9emU/r9Z2lF+Z9EJ33tXtlPnmdD/xwXh7Pk5P1AZCrZRMoPXsHwaX1DoI8uoP4xxO0tAJs+U54HnB2A+430Tz/L3+aQzv82vXGczmzMt4hHgmIlDdZUiMRSUuCRQhhxCEeCQiUACVACVAEikARKAJFoAgUgSJFKS9ZIpKW1BYhhBGHeCQggkCpodRQIpQIJUKJUCKUCCVCiVAilAglFSWUEMJIUeoSjwREkHp5oSkiaQlZqyUta53Wa4NWtLU2atUj9Ug9Uo/UI/VIPVKP1CP1SD1Wj9Vj9Vg9Vo/VY/VYPb55820fD22z77J+gU9Tf7j7II9fl3Vl/WRfhvMhH6ch37bxslY29jc=", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "struct Bar {\n inner: [u8; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nfn main(mut x: [Foo; 3], y: pub Field, hash_result: pub [u8; 32]) {\n // Simple dynamic array set for entire inner most array\n x[y - 1].bar.inner = [106, 107, 10];\n let mut hash_input = x[y - 1].bar.inner;\n // Make sure that we are passing a dynamic array to the black box function call\n // by setting the array using a dynamic index here\n hash_input[y - 1] = 0;\n let hash = std::hash::blake3(hash_input);\n assert_eq(hash, hash_result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 548aa0ff1ed..5f141f1d002 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -225,8 +225,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "ndTNasJAFIbhe5l1FnPO/GSmt1KKRB1LIERJk0KR3HuP+U6sXbRIVq8av0ckQ67mWPbT+67tT+cP8/J6Nfuh7br2fdedD83Ynnv59DpXZn27G4dS5CPzcF1Wl2Yo/Whe+qnrKvPZdNPypY9L0y8dm0Gu2sqU/igV8NR25fZqrn7W9u8pO6djduk+D8/v430fw5a9o/vv5y37vP6+s7Rh70PUva/dln32ug+8ZR9cXvch/rWv//n/llaALT8IzwPO3oHHIzDPb/KmObTDrzNrPMs3K+Md4pGARLkPkhpJSF4SLEIIIw7xSECgBCgBSoASoUQoEUqEEqFEKBFKFEVuUUxIXlJbhBBGHOKRgEQESg2lhpKgJCgJSoKSoCQoCUqCkqAkKFmUICGEEVHkYGaPBCQi9XJDc0LyErJWS1rWOq3XBm3U1tqkVY/UI/VIPVKP1CP1SD1Sj9Qj9Vg9Vo/VY/VYPVaP1WP1+ObNt3M8tM2+K/r8PE394eFxOn5d1ivrA/cynA/lOA3ldoyXa3KwvwE=", + "debug_symbols": "ndTBbqswEIXhd/GahWdsD3Zf5eoqIolTISESUahURbx7Hc5A00WqKKs/wcwHAourOeb99L5r+9P5w7z9u5r90HZd+77rzodmbM99OXqdK7P+3Y1DzuWQuVsvU5dmyP1o3vqp6yrz2XTTctLHpemXjs1QVm1lcn8sLeCp7fLt11z9TNvHo+ycDrOL23h4fl62eQmvzDvarp9emU/r9Z2lF+Z9EJ33tXtlPnmdD/xwXh7Pk5P1AZCrZRMoPXsHwaX1DoI8uoP4xxO0tAJs+U54HnB2A+430Tz/L3+aQzv82vXGczmzMt4hHgmIlDdZUiMRSUuCRQhhxCEeCQiUACVACVAEikARKAJFoAgUgSJFKS9ZIpKW1BYhhBGHeCQggkCpodRQIpQIJUKJUCKUCCVCiVAilAglFSWUEMJIUeoSjwREkHp5oSkiaQlZqyUta53Wa4NWtLU2atUj9Ug9Uo/UI/VIPVKP1CP1SD1Wj9Vj9Vg9Vo/VY/VYPb55820fD22z77J+gU9Tf7j7II9fl3Vl/WRfhvMhH6ch37bxslY29jc=", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "struct Bar {\n inner: [u8; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nfn main(mut x: [Foo; 3], y: pub Field, hash_result: pub [u8; 32]) {\n // Simple dynamic array set for entire inner most array\n x[y - 1].bar.inner = [106, 107, 10];\n let mut hash_input = x[y - 1].bar.inner;\n // Make sure that we are passing a dynamic array to the black box function call\n // by setting the array using a dynamic index here\n hash_input[y - 1] = 0;\n let hash = std::hash::blake3(hash_input);\n assert_eq(hash, hash_result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index d961367729b..a4c82516c34 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -105,12 +105,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32891 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 54 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32837), size_address: Relative(4), offset_address: Relative(5) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Cast { destination: Direct(32878), source: Direct(32878), bit_size: Integer(U8) }, Cast { destination: Direct(32879), source: Direct(32879), bit_size: Integer(U8) }, Cast { destination: Direct(32880), source: Direct(32880), bit_size: Integer(U8) }, Cast { destination: Direct(32881), source: Direct(32881), bit_size: Integer(U8) }, Cast { destination: Direct(32882), source: Direct(32882), bit_size: Integer(U8) }, Cast { destination: Direct(32883), source: Direct(32883), bit_size: Integer(U8) }, Cast { destination: Direct(32884), source: Direct(32884), bit_size: Integer(U8) }, Cast { destination: Direct(32885), source: Direct(32885), bit_size: Integer(U8) }, Cast { destination: Direct(32886), source: Direct(32886), bit_size: Integer(U8) }, Cast { destination: Direct(32887), source: Direct(32887), bit_size: Integer(U8) }, Cast { destination: Direct(32888), source: Direct(32888), bit_size: Integer(U8) }, Cast { destination: Direct(32889), source: Direct(32889), bit_size: Integer(U8) }, Cast { destination: Direct(32890), source: Direct(32890), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 14 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 18 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Mov { destination: Relative(1), source: Relative(4) }, Mov { destination: Relative(2), source: Direct(32858) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32859 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(6) }, Mov { destination: Direct(32773), source: Relative(5) }, Call { location: 181 }, Mov { destination: Relative(3), source: Relative(4) }, Call { location: 192 }, Call { location: 195 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32891 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 191 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 184 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 1 }, Return, Call { location: 268 }, Const { destination: Relative(4), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Relative(5), op: Sub, lhs: Relative(2), rhs: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 106 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 107 }, Const { destination: Relative(6), bit_size: Integer(U8), value: 10 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Cast { destination: Relative(2), source: Relative(5), bit_size: Integer(U32) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 217 }, Call { location: 274 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 277 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 238 }, Call { location: 299 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 0 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 277 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(2), size: Relative(4) }, output: HeapArray { pointer: Relative(7), size: 32 } }), Const { destination: Relative(4), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(1) }, Mov { destination: Relative(8), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 302 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(7) }, JumpIf { condition: Relative(2), location: 267 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 273 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 281 }, Jump { location: 283 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 298 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 295 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 288 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 298 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 268 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 312 }, Call { location: 299 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 318 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, JumpIf { condition: Relative(5), location: 323 }, Jump { location: 321 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U8, lhs: Relative(6), rhs: Relative(8) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(9) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 318 }]" ], - "debug_symbols": "pdVBjqMwEAXQu7Bm4XLZxs5VWlFEEtJCQiSiYaRRxN2nCr5DZtGjFrPJszH1cTCYZ3FtztPnqe1v96/i8PEszkPbde3nqbtf6rG993L0WRj9oRSKA5ViBWNxsGpatMZAghYydNDDACsYIfIIeYQ8Qh4hj5BHyCPkkeSxGmFatQYStJChgx4GKHlOjTCtsoEELWTooIcBIo+Rx8hzkudVghYydNDDACsoeUFNq95AghYydNBDyavUCkaYVoOBBC1k6KCHax4bhg56KONRrWCEaVXXf5GghQxxvq5nUnFc15GMNnxuhNzQR5e0EXMjoaGrSawNxOlyLkpsmueyyK/EaRyaRt+It3dE3pxHPTT9WBz6qevK4lfdTctJX4+6XxzrQUZlFk1/FSXw1naNtuZyqzbfl8qDhWJ5dF7l/uf14VUf/J56ptf10576lK/PhnbUOx9Q7yreU58c6r3dU+855XofdtTLhpknIHum2xJ+fAONyTOQTTXtCaAtwIY9AWy2GcT/ncF3f4HsP+6i7O/5LsoW/J5wlE59aYe/Pl6zRg1tfe4adG9Tf3kbHX8/8kj++D2G+6W5TkOjSdsXUH4+bFWVNsWjbAzSo0glJZIeLYMhlrZi7ZJ2UyrlUT/OOrU/", + "debug_symbols": "pdXLrqJAEAbgd2HNoqurr77KiTGoeEJC0HB0konx3acK/hZn4cQwG79q2/ptaC736tjub9+7bjidf6rN173aj13fd9+7/nxort15kG/vldEPyqHaUC1GmKqNVfOkNQYStJChgx4GGGGCyCPkEfIIeYQ8Qh4hj5BHksdqgnnWGkjQQoYOehig5Dk1wTzLBhK0kKGDHgaIPEYeI89JnlcJWsjQQQ8DjFDyoppnvYEELWTooIeSl9QIE8yzwUCCFjJ00MM5jw1DBz2U+axGmGCe1f2fJGghQ/xe95OMFpjQjSTSwpcilEKvXatFKkVGodtJTouSpxs6F6zF41FX5bbYXce21bvi5T6Ru+fSjO1wrTbDre/r6lfT36Yf/VyaYfLajDIrke1wFCXw1PWtVo966TbvW+XiQrNcPs92/3l/ePYHv6af6fn/eU1/Lv/Phlb0Ox/Q7yKv6c8O/d6+7Q/v+4lDOQHEMTwTKH+6As+5rMCHFUcgj91yCPLkdUvCx1tgTFmBPJrzmgBaAmxYE8BmWUH63xW8OwTif5xFeUuUsygP8teErQyaQzf+9Qp8aNTYNfu+xfB0Gw4vs9fflzJTXqGX8Xxoj7ex1aTlPSofXzbG2ua0lWeLjChRTZlkRNNkSLWNrEPSYc613Czbhy7tDw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "struct Bar {\n inner: [u8; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nfn main(mut x: [Foo; 3], y: pub Field, hash_result: pub [u8; 32]) {\n // Simple dynamic array set for entire inner most array\n x[y - 1].bar.inner = [106, 107, 10];\n let mut hash_input = x[y - 1].bar.inner;\n // Make sure that we are passing a dynamic array to the black box function call\n // by setting the array using a dynamic index here\n hash_input[y - 1] = 0;\n let hash = std::hash::blake3(hash_input);\n assert_eq(hash, hash_result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap index 02a2f59f336..6ca12d6b056 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap @@ -105,12 +105,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32890 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 54 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(4), offset_address: Relative(5) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Cast { destination: Direct(32878), source: Direct(32878), bit_size: Integer(U8) }, Cast { destination: Direct(32879), source: Direct(32879), bit_size: Integer(U8) }, Cast { destination: Direct(32880), source: Direct(32880), bit_size: Integer(U8) }, Cast { destination: Direct(32881), source: Direct(32881), bit_size: Integer(U8) }, Cast { destination: Direct(32882), source: Direct(32882), bit_size: Integer(U8) }, Cast { destination: Direct(32883), source: Direct(32883), bit_size: Integer(U8) }, Cast { destination: Direct(32884), source: Direct(32884), bit_size: Integer(U8) }, Cast { destination: Direct(32885), source: Direct(32885), bit_size: Integer(U8) }, Cast { destination: Direct(32886), source: Direct(32886), bit_size: Integer(U8) }, Cast { destination: Direct(32887), source: Direct(32887), bit_size: Integer(U8) }, Cast { destination: Direct(32888), source: Direct(32888), bit_size: Integer(U8) }, Cast { destination: Direct(32889), source: Direct(32889), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 14 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 18 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Mov { destination: Relative(1), source: Relative(4) }, Mov { destination: Relative(2), source: Direct(32857) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32858 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(6) }, Mov { destination: Direct(32773), source: Relative(5) }, Call { location: 181 }, Mov { destination: Relative(3), source: Relative(4) }, Call { location: 192 }, Call { location: 193 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32890 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 191 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 184 }, Return, Return, Call { location: 292 }, Const { destination: Relative(5), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Relative(6), op: Sub, lhs: Relative(2), rhs: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 106 }, Const { destination: Relative(5), bit_size: Integer(U8), value: 107 }, Const { destination: Relative(7), bit_size: Integer(U8), value: 10 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Cast { destination: Relative(2), source: Relative(6), bit_size: Integer(U32) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(6), location: 216 }, Call { location: 298 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 301 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Load { destination: Relative(1), source_pointer: Relative(10) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 238 }, Call { location: 323 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 0 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 301 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(2) }, Store { destination_pointer: Relative(11), source: Relative(6) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(2), size: Relative(6) }, output: HeapArray { pointer: Relative(10), size: 32 } }), Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 265 }, Call { location: 323 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 271 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(6), location: 279 }, Jump { location: 274 }, Load { destination: Relative(1), source_pointer: Relative(2) }, JumpIf { condition: Relative(1), location: 278 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, Load { destination: Relative(6), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Load { destination: Relative(8), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, Load { destination: Relative(9), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(8), rhs: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(6), rhs: Relative(11) }, Store { destination_pointer: Relative(2), source: Relative(8) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 271 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 297 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 305 }, Jump { location: 307 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 322 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 319 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 312 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 322 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tdXfjqowEAbwd+k1F53+r69ijEHFDQlBw8JJTgzvfmb0q3gu3GzY7I2/QTpfEWq5qVNzmD72bX++fKrN9qYOQ9t17ce+uxzrsb30/O1Nafmg7NSGKtbDoDZGjDDBfNdoDQkaaKGDHgYYYYLII+QR8gh5hDxCHiGPOM+KESaYHxoNCRpooYMeIs9wnhMTzA+thgQNtNBBDwNEnkWeRZ7jPC8SNNBCBz0MMELOC2J+6DUkaKCFDnrIeUmMMEHOy2zQkKCBFjroYXgYMT7KetJS8IAoBhghJko8EZEUVApTCp6L5GEnVwpfCk4juY8pYp6USpGlmOdKlWW+H4emkVX+su7533Cth6Yf1aafuq5Sf+puug/6vNb93bEe+CxHNv2J5cBz2zVSzdXSrd+38uJAMz/+Z7v/fn949ge/pt/Sc/68pj+X+a2mFf3OB/S7aNf0Z4d+b9b0e5tLvw/v+uPv9fOmWX4A75tuSfhuAO+y5Qp4Y81rAmgJMGFNgNXLFaSfXsG7n0D2i7vIe3y5i7wNvybs+KA+tsN/L7RZooa2PnQNDs9Tf3w5O/69ljPlhXgdLsfmNA2NJC1vRf7Y8tKvrDG7SvFutKVEFWXiI3lhbU02lclRDknGGstj/W6WS/sH", + "debug_symbols": "tZXLruIwEET/Jess3H6bX0EIBQhXkaKAcmGkEeLfpxuqCbPICGV0Nzll4io3jh+36tDurl/bbjievqvV+lbtxq7vu69tf9o3l+408K+3ysiDiq9WVDMDGKuVFSYwg+VBawxIoAUd6MEARjCBGUQeIY+QR8gj5BHyCHnEeU6YwAyWJ60BCbSgAz0YQORZzvPCDJYnnQEJtKADPRjACCLPIc8hz3NeEBJoQQd6MIARTCDnJWF5MhiQQAs60IMB5LwiTGAGOY8Mi2hUkAqrwqnwKoKKCJHUlaQPieA+WRjBBOqIWUaUb5tJhVUhI8rnyV5FUCEjyozkhIFyViHJdL/XlS747WVsW1nvbzuA98W5GdvhUq2Ga9/X1a+mvz46fZ+b4cFLM/JbrrEdDkwOPHZ9K+peT24zb+VlAjMvhJc9fO6PL38MS/yOXuOXJf6i4ztDC/w+RPh9ckv8xcMf7Kw/zvvJRZ0Acim+Eqh8WkFwRSsIca6C/HN+PoB1CvgM9lPCpwF8YmsFfEiXJQE0Bdi4JMCZqYL8vxXM/QXy/5hFvi90FvlIf0/YcKPZd+Nfl+Ndosau2fUtmsfrsH97e/l91jd6uZ7H0749XMdWkqYblh9r3jy1s3ZTV3yerSlTTYW4JZff2hZb25KkSdLXOu4bNncp7Q8=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "struct Bar {\n inner: [u8; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nfn main(mut x: [Foo; 3], y: pub Field, hash_result: pub [u8; 32]) {\n // Simple dynamic array set for entire inner most array\n x[y - 1].bar.inner = [106, 107, 10];\n let mut hash_input = x[y - 1].bar.inner;\n // Make sure that we are passing a dynamic array to the black box function call\n // by setting the array using a dynamic index here\n hash_input[y - 1] = 0;\n let hash = std::hash::blake3(hash_input);\n assert_eq(hash, hash_result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 02a2f59f336..6ca12d6b056 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -105,12 +105,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32890 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 54 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(4), offset_address: Relative(5) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Cast { destination: Direct(32878), source: Direct(32878), bit_size: Integer(U8) }, Cast { destination: Direct(32879), source: Direct(32879), bit_size: Integer(U8) }, Cast { destination: Direct(32880), source: Direct(32880), bit_size: Integer(U8) }, Cast { destination: Direct(32881), source: Direct(32881), bit_size: Integer(U8) }, Cast { destination: Direct(32882), source: Direct(32882), bit_size: Integer(U8) }, Cast { destination: Direct(32883), source: Direct(32883), bit_size: Integer(U8) }, Cast { destination: Direct(32884), source: Direct(32884), bit_size: Integer(U8) }, Cast { destination: Direct(32885), source: Direct(32885), bit_size: Integer(U8) }, Cast { destination: Direct(32886), source: Direct(32886), bit_size: Integer(U8) }, Cast { destination: Direct(32887), source: Direct(32887), bit_size: Integer(U8) }, Cast { destination: Direct(32888), source: Direct(32888), bit_size: Integer(U8) }, Cast { destination: Direct(32889), source: Direct(32889), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 14 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 18 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 181 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Mov { destination: Relative(1), source: Relative(4) }, Mov { destination: Relative(2), source: Direct(32857) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32858 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(6) }, Mov { destination: Direct(32773), source: Relative(5) }, Call { location: 181 }, Mov { destination: Relative(3), source: Relative(4) }, Call { location: 192 }, Call { location: 193 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32890 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 191 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 184 }, Return, Return, Call { location: 292 }, Const { destination: Relative(5), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Relative(6), op: Sub, lhs: Relative(2), rhs: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 106 }, Const { destination: Relative(5), bit_size: Integer(U8), value: 107 }, Const { destination: Relative(7), bit_size: Integer(U8), value: 10 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Cast { destination: Relative(2), source: Relative(6), bit_size: Integer(U32) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(6), location: 216 }, Call { location: 298 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 301 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Load { destination: Relative(1), source_pointer: Relative(10) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 238 }, Call { location: 323 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 0 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 301 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(2) }, Store { destination_pointer: Relative(11), source: Relative(6) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(2), size: Relative(6) }, output: HeapArray { pointer: Relative(10), size: 32 } }), Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 265 }, Call { location: 323 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 271 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(6), location: 279 }, Jump { location: 274 }, Load { destination: Relative(1), source_pointer: Relative(2) }, JumpIf { condition: Relative(1), location: 278 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, Load { destination: Relative(6), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Load { destination: Relative(8), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, Load { destination: Relative(9), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(8), rhs: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(6), rhs: Relative(11) }, Store { destination_pointer: Relative(2), source: Relative(8) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 271 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 297 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 305 }, Jump { location: 307 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 322 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 319 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 312 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 322 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tdXfjqowEAbwd+k1F53+r69ijEHFDQlBw8JJTgzvfmb0q3gu3GzY7I2/QTpfEWq5qVNzmD72bX++fKrN9qYOQ9t17ce+uxzrsb30/O1Nafmg7NSGKtbDoDZGjDDBfNdoDQkaaKGDHgYYYYLII+QR8gh5hDxCHiGPOM+KESaYHxoNCRpooYMeIs9wnhMTzA+thgQNtNBBDwNEnkWeRZ7jPC8SNNBCBz0MMELOC2J+6DUkaKCFDnrIeUmMMEHOy2zQkKCBFjroYXgYMT7KetJS8IAoBhghJko8EZEUVApTCp6L5GEnVwpfCk4juY8pYp6USpGlmOdKlWW+H4emkVX+su7533Cth6Yf1aafuq5Sf+puug/6vNb93bEe+CxHNv2J5cBz2zVSzdXSrd+38uJAMz/+Z7v/fn949ge/pt/Sc/68pj+X+a2mFf3OB/S7aNf0Z4d+b9b0e5tLvw/v+uPv9fOmWX4A75tuSfhuAO+y5Qp4Y81rAmgJMGFNgNXLFaSfXsG7n0D2i7vIe3y5i7wNvybs+KA+tsN/L7RZooa2PnQNDs9Tf3w5O/69ljPlhXgdLsfmNA2NJC1vRf7Y8tKvrDG7SvFutKVEFWXiI3lhbU02lclRDknGGstj/W6WS/sH", + "debug_symbols": "tZXLruIwEET/Jess3H6bX0EIBQhXkaKAcmGkEeLfpxuqCbPICGV0Nzll4io3jh+36tDurl/bbjievqvV+lbtxq7vu69tf9o3l+408K+3ysiDiq9WVDMDGKuVFSYwg+VBawxIoAUd6MEARjCBGUQeIY+QR8gj5BHyCHnEeU6YwAyWJ60BCbSgAz0YQORZzvPCDJYnnQEJtKADPRjACCLPIc8hz3NeEBJoQQd6MIARTCDnJWF5MhiQQAs60IMB5LwiTGAGOY8Mi2hUkAqrwqnwKoKKCJHUlaQPieA+WRjBBOqIWUaUb5tJhVUhI8rnyV5FUCEjyozkhIFyViHJdL/XlS747WVsW1nvbzuA98W5GdvhUq2Ga9/X1a+mvz46fZ+b4cFLM/JbrrEdDkwOPHZ9K+peT24zb+VlAjMvhJc9fO6PL38MS/yOXuOXJf6i4ztDC/w+RPh9ckv8xcMf7Kw/zvvJRZ0Acim+Eqh8WkFwRSsIca6C/HN+PoB1CvgM9lPCpwF8YmsFfEiXJQE0Bdi4JMCZqYL8vxXM/QXy/5hFvi90FvlIf0/YcKPZd+Nfl+Ndosau2fUtmsfrsH97e/l91jd6uZ7H0749XMdWkqYblh9r3jy1s3ZTV3yerSlTTYW4JZff2hZb25KkSdLXOu4bNncp7Q8=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "struct Bar {\n inner: [u8; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nfn main(mut x: [Foo; 3], y: pub Field, hash_result: pub [u8; 32]) {\n // Simple dynamic array set for entire inner most array\n x[y - 1].bar.inner = [106, 107, 10];\n let mut hash_input = x[y - 1].bar.inner;\n // Make sure that we are passing a dynamic array to the black box function call\n // by setting the array using a dynamic index here\n hash_input[y - 1] = 0;\n let hash = std::hash::blake3(hash_input);\n assert_eq(hash, hash_result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 2c546821614..c2d8c6cbc72 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -114,8 +114,12 @@ expression: artifact "EXPR [ (-1, _35) (1, _67) 0 ]", "EXPR [ (-1, _36) (1, _68) 0 ]" ], - "debug_symbols": "jdLBioMwFAXQf8naRTS+Z+2vDINEjSUQoqQ6MIj/PtGrHbsQurom8R7lkVm0pp4elfVd/xT3r1nUwTpnH5XrGz3a3sfdeUnEsazGYEzcEqfz2Bp0MH4Udz85l4gf7abtpeeg/ZajDvFUJsL4NmYEO+vM+rQk/215XaVi7xbFq0wft8vjy6nkq3p2Xc9kWu5AJrOT8Dmg5AtQtzPwHRe6seFt4EIV8V8ToW4bq8otcolIERlCIXIEIRhRIKDkUAgKQSEoBIWgEBSCQlAICkFhKAyFoTAUhsJQGApDYSi8Kss6sGB17cx+y7rJN6dLN/4Ox8lxLYfQN6adglnntZ3FCf4B", + "debug_symbols": "jdLBjoMgFAXQf2HtAqTvWfsrk0lDFRsSgobqJBPjvw961bELk66uAvdIkFHU9jE87y407UvcvkbxiM5797z7tjK9a0MaHadMbK/3PlqbhsRhPrU6E23oxS0M3mfix/hhWfTqTFiyNzHNykzYUKdMYOO8nZ+m7L8tz6tUrN2i2Mv03lbnbaVZrX2lC94FVX76/XLbu5J8tgF9Xs+lKlcgl/lB+BzQcgf09Qh8pxdTufj2y4Qu0spM6OvC6nKJi0QoRI7QiAuCEIwoEFAuUAgKQSEoBIWgEBSCQlAICkFhKAyFoTAUhsJQGApDYSg8K9N8YNGZh7frPW2GUB2ubf/bbTPbxe5iW9l6iHY+r2UuneAf", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(x: [u8; 5], result: [u8; 32]) {\n let digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_0.snap index 2c546821614..c2d8c6cbc72 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_0.snap @@ -114,8 +114,12 @@ expression: artifact "EXPR [ (-1, _35) (1, _67) 0 ]", "EXPR [ (-1, _36) (1, _68) 0 ]" ], - "debug_symbols": "jdLBioMwFAXQf8naRTS+Z+2vDINEjSUQoqQ6MIj/PtGrHbsQurom8R7lkVm0pp4elfVd/xT3r1nUwTpnH5XrGz3a3sfdeUnEsazGYEzcEqfz2Bp0MH4Udz85l4gf7abtpeeg/ZajDvFUJsL4NmYEO+vM+rQk/215XaVi7xbFq0wft8vjy6nkq3p2Xc9kWu5AJrOT8Dmg5AtQtzPwHRe6seFt4EIV8V8ToW4bq8otcolIERlCIXIEIRhRIKDkUAgKQSEoBIWgEBSCQlAICkFhKAyFoTAUhsJQGApDYSi8Kss6sGB17cx+y7rJN6dLN/4Ox8lxLYfQN6adglnntZ3FCf4B", + "debug_symbols": "jdLBjoMgFAXQf2HtAqTvWfsrk0lDFRsSgobqJBPjvw961bELk66uAvdIkFHU9jE87y407UvcvkbxiM5797z7tjK9a0MaHadMbK/3PlqbhsRhPrU6E23oxS0M3mfix/hhWfTqTFiyNzHNykzYUKdMYOO8nZ+m7L8tz6tUrN2i2Mv03lbnbaVZrX2lC94FVX76/XLbu5J8tgF9Xs+lKlcgl/lB+BzQcgf09Qh8pxdTufj2y4Qu0spM6OvC6nKJi0QoRI7QiAuCEIwoEFAuUAgKQSEoBIWgEBSCQlAICkFhKAyFoTAUhsJQGApDYSg8K9N8YNGZh7frPW2GUB2ubf/bbTPbxe5iW9l6iHY+r2UuneAf", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(x: [u8; 5], result: [u8; 32]) {\n let digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 2c546821614..c2d8c6cbc72 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -114,8 +114,12 @@ expression: artifact "EXPR [ (-1, _35) (1, _67) 0 ]", "EXPR [ (-1, _36) (1, _68) 0 ]" ], - "debug_symbols": "jdLBioMwFAXQf8naRTS+Z+2vDINEjSUQoqQ6MIj/PtGrHbsQurom8R7lkVm0pp4elfVd/xT3r1nUwTpnH5XrGz3a3sfdeUnEsazGYEzcEqfz2Bp0MH4Udz85l4gf7abtpeeg/ZajDvFUJsL4NmYEO+vM+rQk/215XaVi7xbFq0wft8vjy6nkq3p2Xc9kWu5AJrOT8Dmg5AtQtzPwHRe6seFt4EIV8V8ToW4bq8otcolIERlCIXIEIRhRIKDkUAgKQSEoBIWgEBSCQlAICkFhKAyFoTAUhsJQGApDYSi8Kss6sGB17cx+y7rJN6dLN/4Ox8lxLYfQN6adglnntZ3FCf4B", + "debug_symbols": "jdLBjoMgFAXQf2HtAqTvWfsrk0lDFRsSgobqJBPjvw961bELk66uAvdIkFHU9jE87y407UvcvkbxiM5797z7tjK9a0MaHadMbK/3PlqbhsRhPrU6E23oxS0M3mfix/hhWfTqTFiyNzHNykzYUKdMYOO8nZ+m7L8tz6tUrN2i2Mv03lbnbaVZrX2lC94FVX76/XLbu5J8tgF9Xs+lKlcgl/lB+BzQcgf09Qh8pxdTufj2y4Qu0spM6OvC6nKJi0QoRI7QiAuCEIwoEFAuUAgKQSEoBIWgEBSCQlAICkFhKAyFoTAUhsJQGApDYSg8K9N8YNGZh7frPW2GUB2ubf/bbTPbxe5iW9l6iHY+r2UuneAf", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(x: [u8; 5], result: [u8; 32]) {\n let digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 3761ff19ddf..fff1be0e36b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -56,12 +56,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 37 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U8) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U8) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U8) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(1), source: Relative(3) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(2), source: Relative(3) }, Call { location: 83 }, Call { location: 85 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 82 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 75 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Return, Call { location: 106 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(4), size: Relative(5) }, output: HeapArray { pointer: Relative(6), size: 32 } }), Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(3) }, Mov { destination: Relative(7), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 112 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(6) }, JumpIf { condition: Relative(1), location: 105 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 111 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 106 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 122 }, Call { location: 147 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 129 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, JumpIf { condition: Relative(5), location: 134 }, Jump { location: 132 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U8, lhs: Relative(6), rhs: Relative(9) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(10) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 129 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pdTBjoMgEAbgd+HMgQEU8FU2TWMtbUyIGqqbbBrffQcZ1u6hm6Z76dcR5xcRvbOzPy3XYz9cxhtrPu7sFPsQ+usxjF079+OAR+9MpB9bswY4syZjM27DiQxkZEZlNGskUmXqjMnYjNsAIUggJanIHAVANZS6IjFcJQ1pSZeVggRSkoqk8xQe10lNNeZXyZo0JObXSZfVgsR8m6QcrUjM0+vKWVnd4xy9T4v7sNz4EKY2+mFmzbCEwNlnG5btpNvUDptzG3FUcOaHM4qBlz749G/le7d43loZ6jXmp7l6uduVK4Oo32gHZ3UJcE7vCa8GSCEcBUih3DsBsAfI+p0AJfYZ2P/O4NktmD8WUUJ5hrh9xWPAAYu26+Ovd3hNUbFvT8FTeVmG7mF0/prKSPkGTHHs/HmJPiXtHwLczB9GcisP6ZXEArcBB4BUQiq14aDdYU1T+QY=", + "debug_symbols": "pZTBjoMgEED/hTMHBlCgv9I0jbW0MSFqqG6yafz3HWSs7cGm6V58jjDPcQTu7OxP4/XYtJfuxnb7OzvFJoTmegxdXQ1N1+LTOxPpYku2k5xZk2Ez3AwnMiBDZqgMzXYKUWSUGSbDZrgZIAQRiJKoiFkFQDEscUFEuU40REt0mVIQgSiJikjzFD4vEjXF6C8TS6Ihot8kukwtiOh3ieTRioi+Ypo4W7p7HKL3qblP7caf0FfRtwPbtWMInP1UYZwn3fqqnTlUEUcFZ749I1F4aYJPdxNfs8V2amEo15hHcvGaDdvZ2AegfGxF+TCA+/T9bqkdRLlVwJt0cFYvAuf0avhUIIVwJJBCuW8EsApk+Y1AibUC+98Ktj7BvmmihGUV4AYQz4IDBlXdxJdTYEqq2FSn4Cm8jG39NDr89svIcor0sav9eYw+mdajBLfD3khu5SFtagxwGXAASCGkUBsO2h2mVMof", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(x: [u8; 5], result: [u8; 32]) {\n let digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_0.snap index de46089a8f5..b99da3cd5eb 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_0.snap @@ -56,12 +56,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 37 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U8) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U8) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U8) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(1), source: Relative(3) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(2), source: Relative(3) }, Call { location: 83 }, Call { location: 84 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 82 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 75 }, Return, Return, Call { location: 131 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(7), size: 32 } }), Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Store { destination_pointer: Relative(1), source: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 103 }, Call { location: 137 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 110 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, JumpIf { condition: Relative(6), location: 118 }, Jump { location: 113 }, Load { destination: Relative(2), source_pointer: Relative(1) }, JumpIf { condition: Relative(2), location: 117 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, Return, Load { destination: Relative(6), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(7), rhs: Relative(10) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(6), rhs: Relative(11) }, Store { destination_pointer: Relative(1), source: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 110 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 136 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tZTNjoMgEIDfhbMHBpQfX6VpGmtpY0LQUN1k0/juO8i4dg9umm724ucA84kThge7uPN0O3Xh2t9ZfXiwc+y8724n37fN2PUBRx+Mp4epWA0FMypDZ5gMu8DyDMgQGZLVElFmVBkqAy0lwmTYBcA5EYiCKIllJtA6wPEqEcdFYkVUREPr0K+QghOBiH6dKIklET02UWW/0ET0VfNcsLVIpzE6l2r0VDWs5dBEF0ZWh8n7gn00floW3YcmLBybiLO8YC5ckCi8dt6lt7nYsvl+aqUpV+vv5OrlbLt+GbjaSxf/lg7WlKvA2nIzvCoQnFsSCC7tOwLYBEK9I5B824H56w72fsH8UkQB6xHA08ufBUcMmraLPzp5TqrYNWfvKLxOoX2aHT+HdWa9CYbYt+4yRZdM23WAvXLQojDimDoSA5BQgFQphCXUGNrjnLbyBQ==", + "debug_symbols": "tZTNjoMgEIDfhbMHBpQfX6VpGmtpY0LUUN1k0/juO8hY7cFN081e/BxgPsaJ8GAXdx5vp6a9dndWHh7sHBrvm9vJd3U1NF2Low/G48MUrBQZMypBJ5gEO8PyBEgQCZKVOSJPKBJUAloKhEmwM4BzIhAFURLzRKB1gOMqEsdlZEFUREPr0K+RghOBiH4TKYk5ET3A44tKGwhNRKGapowtXToNwbnYpE3bsJl9FVw7sLIdvc/YV+XHedG9r9qZQxVwFndw7QWJwmvjXXybsjWb76cWmnK1fiYXr9mwnw1SAeWD1OppAPvu/napHbjaK0D+WzpYky8Ca/PV8K5AcG5JILi0nwhgFQj1iUDytQLz1wr2PsH+0kQBy0+EB4BvBUcMqroJL5fBFFWhqc7eUXgd23ozO3z3y8xymfShq91lDC6a1hsFj9tBi8yIYzzUGICEDH/KGMIcagztcYql/AA=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(x: [u8; 5], result: [u8; 32]) {\n let digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index de46089a8f5..b99da3cd5eb 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -56,12 +56,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 37 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U8) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U8) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U8) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(1), source: Relative(3) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 72 }, Mov { destination: Relative(2), source: Relative(3) }, Call { location: 83 }, Call { location: 84 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32873 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 82 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 75 }, Return, Return, Call { location: 131 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(7), size: 32 } }), Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Store { destination_pointer: Relative(1), source: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 103 }, Call { location: 137 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 110 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, JumpIf { condition: Relative(6), location: 118 }, Jump { location: 113 }, Load { destination: Relative(2), source_pointer: Relative(1) }, JumpIf { condition: Relative(2), location: 117 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, Return, Load { destination: Relative(6), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(7), rhs: Relative(10) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(6), rhs: Relative(11) }, Store { destination_pointer: Relative(1), source: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 110 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 136 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tZTNjoMgEIDfhbMHBpQfX6VpGmtpY0LQUN1k0/juO8i4dg9umm724ucA84kThge7uPN0O3Xh2t9ZfXiwc+y8724n37fN2PUBRx+Mp4epWA0FMypDZ5gMu8DyDMgQGZLVElFmVBkqAy0lwmTYBcA5EYiCKIllJtA6wPEqEcdFYkVUREPr0K+QghOBiH6dKIklET02UWW/0ET0VfNcsLVIpzE6l2r0VDWs5dBEF0ZWh8n7gn00floW3YcmLBybiLO8YC5ckCi8dt6lt7nYsvl+aqUpV+vv5OrlbLt+GbjaSxf/lg7WlKvA2nIzvCoQnFsSCC7tOwLYBEK9I5B824H56w72fsH8UkQB6xHA08ufBUcMmraLPzp5TqrYNWfvKLxOoX2aHT+HdWa9CYbYt+4yRZdM23WAvXLQojDimDoSA5BQgFQphCXUGNrjnLbyBQ==", + "debug_symbols": "tZTNjoMgEIDfhbMHBpQfX6VpGmtpY0LUUN1k0/juO8hY7cFN081e/BxgPsaJ8GAXdx5vp6a9dndWHh7sHBrvm9vJd3U1NF2Low/G48MUrBQZMypBJ5gEO8PyBEgQCZKVOSJPKBJUAloKhEmwM4BzIhAFURLzRKB1gOMqEsdlZEFUREPr0K+RghOBiH4TKYk5ET3A44tKGwhNRKGapowtXToNwbnYpE3bsJl9FVw7sLIdvc/YV+XHedG9r9qZQxVwFndw7QWJwmvjXXybsjWb76cWmnK1fiYXr9mwnw1SAeWD1OppAPvu/napHbjaK0D+WzpYky8Ca/PV8K5AcG5JILi0nwhgFQj1iUDytQLz1wr2PsH+0kQBy0+EB4BvBUcMqroJL5fBFFWhqc7eUXgd23ozO3z3y8xymfShq91lDC6a1hsFj9tBi8yIYzzUGICEDH/KGMIcagztcYql/AA=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(x: [u8; 5], result: [u8; 32]) {\n let digest = std::hash::blake3(x);\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__expanded.snap index 24b7c30aa9c..0676c216288 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__expanded.snap @@ -22,8 +22,8 @@ fn modify_in_inlined_constrained(original: [Field; 5], index: u64) -> ExecutionR modified[index] = 27; let modified_once: [Field; 5] = modified; { - let i_3784: u64 = index + 1; - modified[i_3784] = 27; + let i_3787: u64 = index + 1; + modified[i_3787] = 27; }; ExecutionResult { original: original, modified_once: modified_once, modified_twice: modified } } @@ -33,8 +33,8 @@ unconstrained fn modify_in_unconstrained(original: [Field; 5], index: u64) -> Ex modified[index] = 27; let modified_once: [Field; 5] = modified; { - let i_3787: u64 = index + 1; - modified[i_3787] = 27; + let i_3790: u64 = index + 1; + modified[i_3790] = 27; }; ExecutionResult { original: original, modified_once: modified_once, modified_twice: modified } } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__expanded.snap index a35808f14fc..acce0deeaa3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__expanded.snap @@ -148,33 +148,33 @@ unconstrained fn main(kernel_data: DataToHash) -> pub [Field; 2] { let mut offset: u32 = 0; for j in 0..MAX_NOTE_HASHES_PER_TX { { - let i_3796: u32 = offset + j; - tx_effects_hash_inputs[i_3796] = new_note_hashes[j]; + let i_3799: u32 = offset + j; + tx_effects_hash_inputs[i_3799] = new_note_hashes[j]; } } offset = offset + MAX_NOTE_HASHES_PER_TX; for j in 0..MAX_NULLIFIERS_PER_TX { { - let i_3798: u32 = offset + j; - tx_effects_hash_inputs[i_3798] = new_nullifiers[j]; + let i_3801: u32 = offset + j; + tx_effects_hash_inputs[i_3801] = new_nullifiers[j]; } } offset = offset + MAX_NULLIFIERS_PER_TX; for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX { { - let i_3800: u32 = offset + (j * 2); - tx_effects_hash_inputs[i_3800] = public_data_update_requests[j].leaf_slot; + let i_3803: u32 = offset + (j * 2); + tx_effects_hash_inputs[i_3803] = public_data_update_requests[j].leaf_slot; }; { - let i_3801: u32 = (offset + (j * 2)) + 1; - tx_effects_hash_inputs[i_3801] = public_data_update_requests[j].new_value; + let i_3804: u32 = (offset + (j * 2)) + 1; + tx_effects_hash_inputs[i_3804] = public_data_update_requests[j].new_value; } } offset = offset + (MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2); for j in 0..MAX_L2_TO_L1_MSGS_PER_TX { { - let i_3803: u32 = offset + j; - tx_effects_hash_inputs[i_3803] = l2ToL1Msgs[j]; + let i_3806: u32 = offset + j; + tx_effects_hash_inputs[i_3806] = l2ToL1Msgs[j]; } } offset = offset + MAX_L2_TO_L1_MSGS_PER_TX; @@ -184,21 +184,21 @@ unconstrained fn main(kernel_data: DataToHash) -> pub [Field; 2] { let new_contracts: [NewContractData; 1] = kernel_data.new_contracts; tx_effects_hash_inputs[offset] = new_contracts[0].contract_address; { - let i_3806: u32 = offset + 1; - tx_effects_hash_inputs[i_3806] = new_contracts[0].portal_contract_address; + let i_3809: u32 = offset + 1; + tx_effects_hash_inputs[i_3809] = new_contracts[0].portal_contract_address; }; offset = offset + (MAX_NEW_CONTRACTS_PER_TX * 2); for j in 0..NUM_FIELDS_PER_SHA256 { { - let i_3808: u32 = offset + j; - tx_effects_hash_inputs[i_3808] = encryptedLogsHash[j]; + let i_3811: u32 = offset + j; + tx_effects_hash_inputs[i_3811] = encryptedLogsHash[j]; } } offset = offset + (NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256); for j in 0..NUM_FIELDS_PER_SHA256 { { - let i_3810: u32 = offset + j; - tx_effects_hash_inputs[i_3810] = unencryptedLogsHash[j]; + let i_3813: u32 = offset + j; + tx_effects_hash_inputs[i_3813] = unencryptedLogsHash[j]; } } offset = offset + (NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256); @@ -208,8 +208,8 @@ unconstrained fn main(kernel_data: DataToHash) -> pub [Field; 2] { let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes(); for byte_index in 0..32 { { - let i_3815: u32 = (offset * 32) + byte_index; - hash_input_flattened[i_3815] = input_as_bytes[byte_index]; + let i_3818: u32 = (offset * 32) + byte_index; + hash_input_flattened[i_3818] = input_as_bytes[byte_index]; } } } @@ -218,12 +218,12 @@ unconstrained fn main(kernel_data: DataToHash) -> pub [Field; 2] { tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes(); for byte_index in 0..16 { { - let i_3819: u32 = + let i_3822: u32 = ((TX_EFFECT_HASH_FULL_FIELDS * 32) + (log_field_index * 16)) + byte_index; - hash_input_flattened[i_3819] = input_as_bytes[byte_index]; + hash_input_flattened[i_3822] = input_as_bytes[byte_index]; } } } - let blake3_digest: [u8; 32] = std::hash::blake3(hash_input_flattened); - U256::from_bytes32(blake3_digest).to_u128_limbs() + let blake2_digest: [u8; 32] = std::hash::blake2s(hash_input_flattened); + U256::from_bytes32(blake2_digest).to_u128_limbs() } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 6adf8503cec..3b706fe22be 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -165,9 +165,9 @@ expression: artifact "return value indices : [_184, _185]", "BRILLIG CALL func 0: inputs: [Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(3))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(4))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(5))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(6))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(7))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(8))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(9))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(11))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(12))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(13))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(14))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(17))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(20))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(23))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(26))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(29))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(32))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(35))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(38))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(41))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(45))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(46))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(47))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(48))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(49))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(50))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(51))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(52))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(53))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(54))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(55))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(56))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(57))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(58))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(60))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(61))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(62))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(63))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(64))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(65))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(66))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(67))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(68))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(69))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(71))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(72))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(73))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(74))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(75))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(76))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(77))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(78))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(79))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(80))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(82))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(83))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(84))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(85))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(86))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(87))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(88))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(89))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(90))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(91))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(92))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(93))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(94))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(95))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(96))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(97))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(98))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(100))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(101))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(102))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(103))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(104))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(105))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(106))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(107))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(108))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(109))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(110))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(111))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(112))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(113))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(114))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(115))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(116))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(117))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(118))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(119))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(120))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(121))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(122))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(124))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(125))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(126))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(127))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(128))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(129))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(130))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(131))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(132))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(133))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(135))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(136))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(137))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(138))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(139))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(140))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(141))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(142))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(143))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(144))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(148))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(149))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(150))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(151))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(153))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(154))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(155))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(156))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(157))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(158))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(159))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(160))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(161))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(162))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(163))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(167))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(168))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(169))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(170))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(171))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(172))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(173))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(174))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(175))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(177))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(178))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(179))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(180))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(181))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(182))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 }])], outputs: [Array([Witness(184), Witness(185)])]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33038 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32852), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32852 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32916 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32980 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33028 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33030 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33032 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33034 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 131 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33036 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33036 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Const { destination: Direct(32843), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32844), bit_size: Field, value: 2 }, Const { destination: Direct(32845), bit_size: Integer(U32), value: 3 }, Const { destination: Direct(32846), bit_size: Integer(U32), value: 5 }, Const { destination: Direct(32847), bit_size: Integer(U32), value: 6 }, Const { destination: Direct(32848), bit_size: Integer(U32), value: 7 }, Const { destination: Direct(32849), bit_size: Integer(U32), value: 8 }, Const { destination: Direct(32850), bit_size: Integer(U32), value: 9 }, Const { destination: Direct(32851), bit_size: Integer(U32), value: 32 }, Return, Call { location: 823 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 147 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 141 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 156 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 164 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 172 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 180 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 188 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 196 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 204 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 800 }, Jump { location: 207 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 212 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 215 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 777 }, Jump { location: 218 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 223 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 226 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(2), location: 734 }, Jump { location: 229 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32851) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(8), location: 234 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(12), location: 240 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(3) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 251 }, Call { location: 832 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 256 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Store { destination_pointer: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 267 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(12) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(12) }, Const { destination: Relative(15), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 351 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(16), location: 664 }, Jump { location: 354 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32846) }, Store { destination_pointer: Relative(16), source: Direct(32844) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32847) }, Store { destination_pointer: Relative(16), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32848) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32849) }, Store { destination_pointer: Relative(16), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32850) }, Store { destination_pointer: Relative(15), source: Relative(12) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(13), size: Relative(14) }, scalars: HeapVector { pointer: Relative(15), size: Relative(16) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(9), location: 405 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(2) }, Store { destination_pointer: Relative(13), source: Relative(7) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(7), location: 416 }, Call { location: 832 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(2), location: 419 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Store { destination_pointer: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(7), location: 430 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(7), location: 433 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Store { destination_pointer: Relative(12), source: Relative(8) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 444 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 449 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(2) }, Store { destination_pointer: Relative(9), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(7), location: 460 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 465 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Store { destination_pointer: Relative(9), source: Relative(7) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 476 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 481 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 492 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 497 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 509 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(3), location: 514 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Const { destination: Relative(2), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Mov { destination: Relative(6), source: Relative(4) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 529 }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Jump { location: 523 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 536 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(5), location: 621 }, Jump { location: 539 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 542 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 570 }, Jump { location: 545 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(3), size: Relative(4) }, output: HeapArray { pointer: Relative(5), size: 32 } }), Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 860 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(5) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 1139 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, JumpIf { condition: Relative(9), location: 575 }, Call { location: 835 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Const { destination: Relative(8), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(9), radix: Relative(3), output_pointer: Relative(10), num_limbs: Relative(12), output_bits: Relative(8) }), BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 591 }, Call { location: 832 }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 593 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 599 }, Jump { location: 596 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 542 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 603 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(13) }, Load { destination: Relative(12), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(13), location: 610 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 838 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 593 }, Load { destination: Relative(6), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Const { destination: Relative(8), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(7), radix: Relative(3), output_pointer: Relative(9), num_limbs: Relative(10), output_bits: Relative(8) }), BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32851) }, Mov { destination: Relative(5), source: Relative(18) }, Jump { location: 636 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32851) }, JumpIf { condition: Relative(8), location: 642 }, Jump { location: 639 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(5) }, Jump { location: 536 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 646 }, Call { location: 832 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 653 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Mov { destination: Relative(5), source: Relative(8) }, Jump { location: 636 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(16), source_pointer: Relative(19) }, Cast { destination: Relative(19), source: Relative(16), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(19), bit_size: Field }, BinaryFieldOp { destination: Relative(19), op: Sub, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(19), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Direct(32842), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(22), op: Add, lhs: Relative(17), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(16), rhs: Relative(22) }, JumpIf { condition: Relative(19), location: 677 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(23) } }, Load { destination: Relative(16), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(19) }, Store { destination_pointer: Relative(24), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Store { destination_pointer: Relative(23), source: Relative(21) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Load { destination: Relative(21), source_pointer: Relative(23) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(22) }, Load { destination: Relative(23), source_pointer: Relative(25) }, Load { destination: Relative(22), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(16) }, Store { destination_pointer: Relative(26), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(24) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(19) }, Store { destination_pointer: Relative(22), source: Relative(21) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(23) }, Store { destination_pointer: Relative(14), source: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(16) }, Jump { location: 351 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 740 }, Call { location: 832 }, BinaryIntOp { destination: Relative(2), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 748 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 759 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Load { destination: Relative(2), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, JumpIf { condition: Relative(12), location: 766 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(2) }, Jump { location: 226 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 782 }, Call { location: 832 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 789 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 215 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 805 }, Call { location: 832 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 812 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 204 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 828 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 842 }, Jump { location: 844 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 859 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 856 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 849 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 859 }, Return, Call { location: 823 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(3), bit_size: Integer(U64) }, Const { destination: Relative(3), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(7), location: 875 }, Call { location: 832 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Cast { destination: Relative(6), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(7), op: Shl, bit_size: U64, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(7) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 884 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Cast { destination: Relative(7), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(8), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(5) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(8) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 893 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32846) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Cast { destination: Relative(8), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(9), op: Shl, bit_size: U64, lhs: Relative(8), rhs: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(9) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 902 }, Call { location: 832 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32847) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Cast { destination: Relative(9), source: Relative(7), bit_size: Integer(U64) }, Const { destination: Relative(7), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U64, lhs: Relative(8), rhs: Relative(9) }, JumpIf { condition: Relative(11), location: 911 }, Call { location: 832 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32848) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(8), bit_size: Integer(U64) }, Const { destination: Relative(8), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 920 }, Call { location: 832 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32849) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 927 }, Call { location: 832 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32850) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(2) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 940 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 949 }, Call { location: 832 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(5) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 958 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 967 }, Call { location: 832 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 976 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 985 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, Load { destination: Relative(11), source_pointer: Relative(12) }, Cast { destination: Relative(12), source: Relative(11), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 992 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1006 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1015 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1024 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1033 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1042 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1051 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1059 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(14) }, Cast { destination: Relative(2), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, BinaryIntOp { destination: Relative(3), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 1073 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Cast { destination: Relative(3), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 1082 }, Call { location: 832 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(10) }, Cast { destination: Relative(2), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 1091 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 1100 }, Call { location: 832 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(2), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 1109 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 1118 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32851) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Cast { destination: Relative(1), source: Relative(2), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(1) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 1125 }, Call { location: 832 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(9) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(13) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Call { location: 823 }, Const { destination: Relative(2), bit_size: Field, value: 64 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Direct(32844) }, Mov { destination: Relative(7), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1175 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Cast { destination: Relative(4), source: Relative(2), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(4), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(4), op: Add, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, Load { destination: Relative(2), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(2), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Add, lhs: Relative(2), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Return, Call { location: 823 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(8), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(2), radix: Relative(7), output_pointer: Relative(9), num_limbs: Relative(10), output_bits: Relative(8) }), Const { destination: Relative(11), bit_size: Integer(U32), value: 32 }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(11) }, Call { location: 1223 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 1196 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(7), location: 1201 }, Jump { location: 1199 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(7), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(8), op: Mul, lhs: Relative(7), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Sub, bit_size: U32, lhs: Direct(32851), rhs: Relative(3) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Direct(32851) }, JumpIf { condition: Relative(9), location: 1207 }, Call { location: 1242 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32851) }, JumpIf { condition: Relative(9), location: 1210 }, Call { location: 835 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Cast { destination: Relative(7), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(9), op: Mul, lhs: Relative(8), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(7), rhs: Relative(9) }, BinaryFieldOp { destination: Relative(9), op: Sub, lhs: Relative(5), rhs: Relative(7) }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(9), rhs: Relative(8) }, BinaryFieldOp { destination: Relative(8), op: Add, lhs: Relative(10), rhs: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Mov { destination: Relative(3), source: Relative(7) }, Jump { location: 1196 }, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 1241 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 1227 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33038 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32852), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32852 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32916 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32980 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33028 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33030 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33032 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33034 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 131 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33036 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33036 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Const { destination: Direct(32843), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32844), bit_size: Field, value: 2 }, Const { destination: Direct(32845), bit_size: Integer(U32), value: 3 }, Const { destination: Direct(32846), bit_size: Integer(U32), value: 5 }, Const { destination: Direct(32847), bit_size: Integer(U32), value: 6 }, Const { destination: Direct(32848), bit_size: Integer(U32), value: 7 }, Const { destination: Direct(32849), bit_size: Integer(U32), value: 8 }, Const { destination: Direct(32850), bit_size: Integer(U32), value: 9 }, Const { destination: Direct(32851), bit_size: Integer(U32), value: 32 }, Return, Call { location: 823 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 147 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 141 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 156 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 164 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 172 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 180 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 188 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 196 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 204 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 800 }, Jump { location: 207 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 212 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 215 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 777 }, Jump { location: 218 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 223 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 226 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(2), location: 734 }, Jump { location: 229 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32851) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(8), location: 234 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(12), location: 240 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(3) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 251 }, Call { location: 832 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 256 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Store { destination_pointer: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 267 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(12) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(12) }, Const { destination: Relative(15), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 351 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(16), location: 664 }, Jump { location: 354 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32846) }, Store { destination_pointer: Relative(16), source: Direct(32844) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32847) }, Store { destination_pointer: Relative(16), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32848) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32849) }, Store { destination_pointer: Relative(16), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32850) }, Store { destination_pointer: Relative(15), source: Relative(12) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(13), size: Relative(14) }, scalars: HeapVector { pointer: Relative(15), size: Relative(16) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(9), location: 405 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(2) }, Store { destination_pointer: Relative(13), source: Relative(7) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(7), location: 416 }, Call { location: 832 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(2), location: 419 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Store { destination_pointer: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(7), location: 430 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(7), location: 433 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Store { destination_pointer: Relative(12), source: Relative(8) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 444 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 449 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(2) }, Store { destination_pointer: Relative(9), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(7), location: 460 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 465 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Store { destination_pointer: Relative(9), source: Relative(7) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 476 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 481 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 492 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 497 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 509 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(3), location: 514 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Const { destination: Relative(2), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Mov { destination: Relative(6), source: Relative(4) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 529 }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Jump { location: 523 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 536 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(5), location: 621 }, Jump { location: 539 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 542 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 570 }, Jump { location: 545 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(3), size: Relative(4) }, output: HeapArray { pointer: Relative(5), size: 32 } }), Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 860 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(5) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 1139 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, JumpIf { condition: Relative(9), location: 575 }, Call { location: 835 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Const { destination: Relative(8), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(9), radix: Relative(3), output_pointer: Relative(10), num_limbs: Relative(12), output_bits: Relative(8) }), BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 591 }, Call { location: 832 }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 593 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 599 }, Jump { location: 596 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 542 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 603 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(13) }, Load { destination: Relative(12), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(13), location: 610 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 838 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 593 }, Load { destination: Relative(6), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Const { destination: Relative(8), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(7), radix: Relative(3), output_pointer: Relative(9), num_limbs: Relative(10), output_bits: Relative(8) }), BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32851) }, Mov { destination: Relative(5), source: Relative(18) }, Jump { location: 636 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32851) }, JumpIf { condition: Relative(8), location: 642 }, Jump { location: 639 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(5) }, Jump { location: 536 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 646 }, Call { location: 832 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 653 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Mov { destination: Relative(5), source: Relative(8) }, Jump { location: 636 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(16), source_pointer: Relative(19) }, Cast { destination: Relative(19), source: Relative(16), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(19), bit_size: Field }, BinaryFieldOp { destination: Relative(19), op: Sub, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(19), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Direct(32842), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(22), op: Add, lhs: Relative(17), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(16), rhs: Relative(22) }, JumpIf { condition: Relative(19), location: 677 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(23) } }, Load { destination: Relative(16), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(19) }, Store { destination_pointer: Relative(24), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Store { destination_pointer: Relative(23), source: Relative(21) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Load { destination: Relative(21), source_pointer: Relative(23) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(22) }, Load { destination: Relative(23), source_pointer: Relative(25) }, Load { destination: Relative(22), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(16) }, Store { destination_pointer: Relative(26), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(24) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(19) }, Store { destination_pointer: Relative(22), source: Relative(21) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(23) }, Store { destination_pointer: Relative(14), source: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(16) }, Jump { location: 351 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 740 }, Call { location: 832 }, BinaryIntOp { destination: Relative(2), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 748 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 759 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Load { destination: Relative(2), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, JumpIf { condition: Relative(12), location: 766 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(2) }, Jump { location: 226 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 782 }, Call { location: 832 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 789 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 215 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 805 }, Call { location: 832 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 812 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 204 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 828 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 842 }, Jump { location: 844 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 859 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 856 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 849 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 859 }, Return, Call { location: 823 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(3), bit_size: Integer(U64) }, Const { destination: Relative(3), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(7), location: 875 }, Call { location: 832 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Cast { destination: Relative(6), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(7), op: Shl, bit_size: U64, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(7) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 884 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Cast { destination: Relative(7), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(8), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(5) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(8) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 893 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32846) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Cast { destination: Relative(8), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(9), op: Shl, bit_size: U64, lhs: Relative(8), rhs: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(9) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 902 }, Call { location: 832 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32847) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Cast { destination: Relative(9), source: Relative(7), bit_size: Integer(U64) }, Const { destination: Relative(7), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U64, lhs: Relative(8), rhs: Relative(9) }, JumpIf { condition: Relative(11), location: 911 }, Call { location: 832 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32848) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(8), bit_size: Integer(U64) }, Const { destination: Relative(8), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 920 }, Call { location: 832 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32849) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 927 }, Call { location: 832 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32850) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(2) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 940 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 949 }, Call { location: 832 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(5) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 958 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 967 }, Call { location: 832 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 976 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 985 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, Load { destination: Relative(11), source_pointer: Relative(12) }, Cast { destination: Relative(12), source: Relative(11), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 992 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1006 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1015 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1024 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1033 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1042 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1051 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1059 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(14) }, Cast { destination: Relative(2), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, BinaryIntOp { destination: Relative(3), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 1073 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Cast { destination: Relative(3), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 1082 }, Call { location: 832 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(10) }, Cast { destination: Relative(2), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 1091 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 1100 }, Call { location: 832 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(2), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 1109 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 1118 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32851) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Cast { destination: Relative(1), source: Relative(2), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(1) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 1125 }, Call { location: 832 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(9) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(13) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Call { location: 823 }, Const { destination: Relative(2), bit_size: Field, value: 64 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Direct(32844) }, Mov { destination: Relative(7), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1175 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Cast { destination: Relative(4), source: Relative(2), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(4), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(4), op: Add, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, Load { destination: Relative(2), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(2), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Add, lhs: Relative(2), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Return, Call { location: 823 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(8), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(2), radix: Relative(7), output_pointer: Relative(9), num_limbs: Relative(10), output_bits: Relative(8) }), Const { destination: Relative(11), bit_size: Integer(U32), value: 32 }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(11) }, Call { location: 1223 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 1196 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(7), location: 1201 }, Jump { location: 1199 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(7), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(8), op: Mul, lhs: Relative(7), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Sub, bit_size: U32, lhs: Direct(32851), rhs: Relative(3) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Direct(32851) }, JumpIf { condition: Relative(9), location: 1207 }, Call { location: 1242 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32851) }, JumpIf { condition: Relative(9), location: 1210 }, Call { location: 835 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Cast { destination: Relative(7), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(9), op: Mul, lhs: Relative(8), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(7), rhs: Relative(9) }, BinaryFieldOp { destination: Relative(9), op: Sub, lhs: Relative(5), rhs: Relative(7) }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(9), rhs: Relative(8) }, BinaryFieldOp { destination: Relative(8), op: Add, lhs: Relative(10), rhs: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Mov { destination: Relative(3), source: Relative(7) }, Jump { location: 1196 }, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 1241 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 1227 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -178,11 +178,11 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { - "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = std::hash::blake3(hash_input_flattened);\n U256::from_bytes32(blake3_digest).to_u128_limbs()\n}\n", + "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake2_digest = std::hash::blake2s(hash_input_flattened);\n U256::from_bytes32(blake2_digest).to_u128_limbs()\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_0.snap index b965fc13940..f5637baf343 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_0.snap @@ -165,9 +165,9 @@ expression: artifact "return value indices : [_184, _185]", "BRILLIG CALL func 0: inputs: [Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(3))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(4))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(5))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(6))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(7))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(8))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(9))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(11))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(12))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(13))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(14))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(17))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(20))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(23))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(26))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(29))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(32))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(35))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(38))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(41))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(45))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(46))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(47))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(48))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(49))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(50))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(51))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(52))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(53))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(54))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(55))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(56))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(57))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(58))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(60))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(61))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(62))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(63))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(64))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(65))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(66))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(67))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(68))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(69))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(71))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(72))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(73))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(74))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(75))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(76))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(77))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(78))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(79))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(80))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(82))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(83))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(84))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(85))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(86))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(87))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(88))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(89))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(90))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(91))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(92))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(93))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(94))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(95))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(96))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(97))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(98))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(100))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(101))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(102))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(103))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(104))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(105))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(106))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(107))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(108))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(109))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(110))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(111))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(112))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(113))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(114))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(115))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(116))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(117))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(118))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(119))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(120))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(121))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(122))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(124))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(125))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(126))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(127))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(128))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(129))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(130))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(131))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(132))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(133))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(135))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(136))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(137))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(138))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(139))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(140))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(141))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(142))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(143))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(144))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(148))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(149))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(150))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(151))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(153))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(154))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(155))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(156))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(157))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(158))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(159))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(160))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(161))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(162))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(163))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(167))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(168))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(169))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(170))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(171))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(172))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(173))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(174))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(175))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(177))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(178))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(179))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(180))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(181))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(182))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 }])], outputs: [Array([Witness(184), Witness(185)])]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33029 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32843), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32843 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32907 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32971 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33019 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33021 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33023 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33025 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 122 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 1195 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 138 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 132 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 147 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 155 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 163 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 171 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 179 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 187 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Const { destination: Relative(19), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 196 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 1172 }, Jump { location: 199 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 204 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 207 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 1149 }, Jump { location: 210 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 215 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 219 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 1106 }, Jump { location: 222 }, Load { destination: Relative(3), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 228 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 234 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(13), location: 245 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 250 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 262 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(15), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(16), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(20), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(21), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(21), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Mov { destination: Relative(23), source: Relative(22) }, Store { destination_pointer: Relative(23), source: Relative(12) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(15) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(17) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(20) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Const { destination: Relative(12), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 347 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(15), location: 1036 }, Jump { location: 350 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Const { destination: Relative(12), bit_size: Field, value: 2 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(12) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(21), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(20) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(13) }, Store { destination_pointer: Relative(23), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Store { destination_pointer: Relative(14), source: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(22), size: Relative(23) }, scalars: HeapVector { pointer: Relative(24), size: Relative(25) }, outputs: HeapArray { pointer: Relative(26), size: 3 } }), BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, Load { destination: Relative(20), source_pointer: Relative(21) }, Load { destination: Relative(14), source_pointer: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(21), rhs: Direct(32839) }, JumpIf { condition: Relative(22), location: 409 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Store { destination_pointer: Relative(24), source: Relative(20) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, JumpIf { condition: Relative(20), location: 420 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Direct(32839) }, JumpIf { condition: Relative(20), location: 423 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(21), location: 434 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 437 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(3) }, Store { destination_pointer: Relative(23), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 448 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 453 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(20), location: 464 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(20), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 469 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(4) }, Store { destination_pointer: Relative(22), source: Relative(20) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(14), location: 480 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 485 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Store { destination_pointer: Relative(21), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 496 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 501 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 513 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 518 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 533 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 527 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(6), location: 993 }, Jump { location: 543 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(10), location: 942 }, Jump { location: 549 }, Load { destination: Relative(4), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(10), size: 32 } }), BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 572 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Cast { destination: Relative(2), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(14), location: 581 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, Const { destination: Relative(10), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(14), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(11) }, JumpIf { condition: Relative(18), location: 590 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(2), source_pointer: Relative(14) }, Cast { destination: Relative(14), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(14), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(14) }, JumpIf { condition: Relative(18), location: 599 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Cast { destination: Relative(7), source: Relative(11), bit_size: Integer(U64) }, Const { destination: Relative(11), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(14), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(14), rhs: Relative(7) }, JumpIf { condition: Relative(18), location: 608 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(17) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(14), bit_size: Integer(U64) }, Const { destination: Relative(14), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 617 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(7), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(7) }, JumpIf { condition: Relative(17), location: 624 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(9), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 637 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 646 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 655 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 664 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 673 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 682 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, Load { destination: Relative(9), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 689 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 703 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 712 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 721 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 730 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 739 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 748 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, JumpIf { condition: Relative(18), location: 756 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(18) }, Cast { destination: Relative(4), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 770 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(5), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(13) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 779 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 788 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Cast { destination: Relative(5), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 797 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 806 }, Call { location: 1204 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(2), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 815 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 822 }, Call { location: 1204 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(1), source: Direct(32838) }, Jump { location: 898 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(6) }, JumpIf { condition: Relative(10), location: 920 }, Jump { location: 901 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Cast { destination: Relative(2), source: Relative(7), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(2), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(3), rhs: Relative(2) }, Cast { destination: Relative(2), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(1), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Relative(10), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 926 }, Call { location: 1232 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 929 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Field }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(14), op: Mul, lhs: Relative(10), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Sub, lhs: Relative(3), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(13), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(14), rhs: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 898 }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 947 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(20) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(21), radix: Relative(4), output_pointer: Relative(22), num_limbs: Relative(23), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(20) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(21) }, JumpIf { condition: Relative(22), location: 963 }, Call { location: 1204 }, Mov { destination: Relative(10), source: Relative(18) }, Jump { location: 965 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, JumpIf { condition: Relative(20), location: 971 }, Jump { location: 968 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(20) }, JumpIf { condition: Relative(22), location: 975 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(10) }, Load { destination: Relative(22), source_pointer: Relative(24) }, Load { destination: Relative(23), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(24), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(24), location: 982 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(20) }, Store { destination_pointer: Relative(26), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(24) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32838) }, Mov { destination: Relative(10), source: Relative(20) }, Jump { location: 965 }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(21) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(14), radix: Relative(4), output_pointer: Relative(21), num_limbs: Relative(22), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(20), location: 1014 }, Jump { location: 1011 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(20) }, JumpIf { condition: Relative(21), location: 1018 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Load { destination: Relative(22), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(23), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(23), location: 1025 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(21) }, Store { destination_pointer: Relative(3), source: Relative(23) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(20) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(20) }, Cast { destination: Relative(20), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(20), bit_size: Field }, BinaryFieldOp { destination: Relative(20), op: Sub, lhs: Relative(15), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(20), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Direct(32842), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(17), rhs: Relative(20) }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(15), rhs: Relative(23) }, JumpIf { condition: Relative(20), location: 1049 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(15), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(20) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(15) }, Store { destination_pointer: Relative(27), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(20) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(17) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(14), source: Relative(20) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(15) }, Jump { location: 347 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1112 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1120 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1131 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(13), location: 1138 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 219 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1154 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 1161 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 207 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1177 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1184 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 196 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 1200 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 1214 }, Jump { location: 1216 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1231 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 1228 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 1221 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 1231 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33029 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32843), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32843 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32907 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32971 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33019 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33021 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33023 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33025 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 122 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 1195 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 138 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 132 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 147 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 155 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 163 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 171 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 179 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 187 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Const { destination: Relative(19), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 196 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 1172 }, Jump { location: 199 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 204 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 207 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 1149 }, Jump { location: 210 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 215 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 219 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 1106 }, Jump { location: 222 }, Load { destination: Relative(3), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 228 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 234 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(13), location: 245 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 250 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 262 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(15), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(16), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(20), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(21), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(21), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Mov { destination: Relative(23), source: Relative(22) }, Store { destination_pointer: Relative(23), source: Relative(12) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(15) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(17) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(20) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Const { destination: Relative(12), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 347 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(15), location: 1036 }, Jump { location: 350 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Const { destination: Relative(12), bit_size: Field, value: 2 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(12) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(21), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(20) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(13) }, Store { destination_pointer: Relative(23), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Store { destination_pointer: Relative(14), source: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(22), size: Relative(23) }, scalars: HeapVector { pointer: Relative(24), size: Relative(25) }, outputs: HeapArray { pointer: Relative(26), size: 3 } }), BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, Load { destination: Relative(20), source_pointer: Relative(21) }, Load { destination: Relative(14), source_pointer: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(21), rhs: Direct(32839) }, JumpIf { condition: Relative(22), location: 409 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Store { destination_pointer: Relative(24), source: Relative(20) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, JumpIf { condition: Relative(20), location: 420 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Direct(32839) }, JumpIf { condition: Relative(20), location: 423 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(21), location: 434 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 437 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(3) }, Store { destination_pointer: Relative(23), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 448 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 453 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(20), location: 464 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(20), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 469 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(4) }, Store { destination_pointer: Relative(22), source: Relative(20) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(14), location: 480 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 485 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Store { destination_pointer: Relative(21), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 496 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 501 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 513 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 518 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 533 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 527 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(6), location: 993 }, Jump { location: 543 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(10), location: 942 }, Jump { location: 549 }, Load { destination: Relative(4), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(10), size: 32 } }), BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 572 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Cast { destination: Relative(2), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(14), location: 581 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, Const { destination: Relative(10), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(14), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(11) }, JumpIf { condition: Relative(18), location: 590 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(2), source_pointer: Relative(14) }, Cast { destination: Relative(14), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(14), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(14) }, JumpIf { condition: Relative(18), location: 599 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Cast { destination: Relative(7), source: Relative(11), bit_size: Integer(U64) }, Const { destination: Relative(11), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(14), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(14), rhs: Relative(7) }, JumpIf { condition: Relative(18), location: 608 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(17) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(14), bit_size: Integer(U64) }, Const { destination: Relative(14), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 617 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(7), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(7) }, JumpIf { condition: Relative(17), location: 624 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(9), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 637 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 646 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 655 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 664 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 673 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 682 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, Load { destination: Relative(9), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 689 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 703 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 712 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 721 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 730 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 739 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 748 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, JumpIf { condition: Relative(18), location: 756 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(18) }, Cast { destination: Relative(4), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 770 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(5), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(13) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 779 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 788 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Cast { destination: Relative(5), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 797 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 806 }, Call { location: 1204 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(2), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 815 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 822 }, Call { location: 1204 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(1), source: Direct(32838) }, Jump { location: 898 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(6) }, JumpIf { condition: Relative(10), location: 920 }, Jump { location: 901 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Cast { destination: Relative(2), source: Relative(7), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(2), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(3), rhs: Relative(2) }, Cast { destination: Relative(2), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(1), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Relative(10), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 926 }, Call { location: 1232 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 929 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Field }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(14), op: Mul, lhs: Relative(10), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Sub, lhs: Relative(3), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(13), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(14), rhs: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 898 }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 947 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(20) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(21), radix: Relative(4), output_pointer: Relative(22), num_limbs: Relative(23), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(20) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(21) }, JumpIf { condition: Relative(22), location: 963 }, Call { location: 1204 }, Mov { destination: Relative(10), source: Relative(18) }, Jump { location: 965 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, JumpIf { condition: Relative(20), location: 971 }, Jump { location: 968 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(20) }, JumpIf { condition: Relative(22), location: 975 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(10) }, Load { destination: Relative(22), source_pointer: Relative(24) }, Load { destination: Relative(23), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(24), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(24), location: 982 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(20) }, Store { destination_pointer: Relative(26), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(24) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32838) }, Mov { destination: Relative(10), source: Relative(20) }, Jump { location: 965 }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(21) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(14), radix: Relative(4), output_pointer: Relative(21), num_limbs: Relative(22), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(20), location: 1014 }, Jump { location: 1011 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(20) }, JumpIf { condition: Relative(21), location: 1018 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Load { destination: Relative(22), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(23), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(23), location: 1025 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(21) }, Store { destination_pointer: Relative(3), source: Relative(23) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(20) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(20) }, Cast { destination: Relative(20), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(20), bit_size: Field }, BinaryFieldOp { destination: Relative(20), op: Sub, lhs: Relative(15), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(20), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Direct(32842), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(17), rhs: Relative(20) }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(15), rhs: Relative(23) }, JumpIf { condition: Relative(20), location: 1049 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(15), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(20) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(15) }, Store { destination_pointer: Relative(27), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(20) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(17) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(14), source: Relative(20) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(15) }, Jump { location: 347 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1112 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1120 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1131 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(13), location: 1138 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 219 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1154 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 1161 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 207 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1177 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1184 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 196 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 1200 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 1214 }, Jump { location: 1216 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1231 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 1228 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 1221 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 1231 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -178,11 +178,11 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { - "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = std::hash::blake3(hash_input_flattened);\n U256::from_bytes32(blake3_digest).to_u128_limbs()\n}\n", + "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake2_digest = std::hash::blake2s(hash_input_flattened);\n U256::from_bytes32(blake2_digest).to_u128_limbs()\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index b965fc13940..f5637baf343 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -165,9 +165,9 @@ expression: artifact "return value indices : [_184, _185]", "BRILLIG CALL func 0: inputs: [Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(3))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(4))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(5))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(6))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(7))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(8))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(9))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(11))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(12))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(13))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(14))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(17))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(20))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(23))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(26))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(29))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(32))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(35))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(38))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(41))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(45))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(46))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(47))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(48))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(49))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(50))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(51))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(52))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(53))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(54))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(55))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(56))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(57))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(58))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(60))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(61))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(62))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(63))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(64))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(65))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(66))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(67))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(68))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(69))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(71))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(72))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(73))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(74))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(75))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(76))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(77))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(78))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(79))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(80))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(82))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(83))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(84))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(85))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(86))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(87))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(88))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(89))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(90))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(91))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(92))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(93))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(94))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(95))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(96))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(97))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(98))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(100))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(101))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(102))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(103))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(104))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(105))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(106))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(107))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(108))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(109))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(110))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(111))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(112))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(113))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(114))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(115))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(116))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(117))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(118))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(119))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(120))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(121))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(122))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(124))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(125))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(126))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(127))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(128))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(129))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(130))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(131))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(132))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(133))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(135))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(136))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(137))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(138))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(139))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(140))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(141))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(142))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(143))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(144))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(148))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(149))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(150))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(151))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(153))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(154))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(155))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(156))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(157))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(158))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(159))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(160))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(161))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(162))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(163))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(167))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(168))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(169))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(170))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(171))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(172))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(173))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(174))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(175))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(177))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(178))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(179))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(180))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(181))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(182))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 }])], outputs: [Array([Witness(184), Witness(185)])]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33029 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32843), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32843 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32907 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32971 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33019 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33021 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33023 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33025 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 122 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 1195 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 138 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 132 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 147 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 155 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 163 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 171 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 179 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 187 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Const { destination: Relative(19), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 196 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 1172 }, Jump { location: 199 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 204 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 207 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 1149 }, Jump { location: 210 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 215 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 219 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 1106 }, Jump { location: 222 }, Load { destination: Relative(3), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 228 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 234 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(13), location: 245 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 250 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 262 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(15), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(16), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(20), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(21), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(21), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Mov { destination: Relative(23), source: Relative(22) }, Store { destination_pointer: Relative(23), source: Relative(12) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(15) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(17) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(20) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Const { destination: Relative(12), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 347 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(15), location: 1036 }, Jump { location: 350 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Const { destination: Relative(12), bit_size: Field, value: 2 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(12) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(21), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(20) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(13) }, Store { destination_pointer: Relative(23), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Store { destination_pointer: Relative(14), source: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(22), size: Relative(23) }, scalars: HeapVector { pointer: Relative(24), size: Relative(25) }, outputs: HeapArray { pointer: Relative(26), size: 3 } }), BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, Load { destination: Relative(20), source_pointer: Relative(21) }, Load { destination: Relative(14), source_pointer: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(21), rhs: Direct(32839) }, JumpIf { condition: Relative(22), location: 409 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Store { destination_pointer: Relative(24), source: Relative(20) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, JumpIf { condition: Relative(20), location: 420 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Direct(32839) }, JumpIf { condition: Relative(20), location: 423 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(21), location: 434 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 437 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(3) }, Store { destination_pointer: Relative(23), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 448 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 453 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(20), location: 464 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(20), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 469 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(4) }, Store { destination_pointer: Relative(22), source: Relative(20) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(14), location: 480 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 485 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Store { destination_pointer: Relative(21), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 496 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 501 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 513 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 518 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 533 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 527 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(6), location: 993 }, Jump { location: 543 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(10), location: 942 }, Jump { location: 549 }, Load { destination: Relative(4), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(10), size: 32 } }), BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 572 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Cast { destination: Relative(2), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(14), location: 581 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, Const { destination: Relative(10), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(14), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(11) }, JumpIf { condition: Relative(18), location: 590 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(2), source_pointer: Relative(14) }, Cast { destination: Relative(14), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(14), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(14) }, JumpIf { condition: Relative(18), location: 599 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Cast { destination: Relative(7), source: Relative(11), bit_size: Integer(U64) }, Const { destination: Relative(11), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(14), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(14), rhs: Relative(7) }, JumpIf { condition: Relative(18), location: 608 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(17) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(14), bit_size: Integer(U64) }, Const { destination: Relative(14), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 617 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(7), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(7) }, JumpIf { condition: Relative(17), location: 624 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(9), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 637 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 646 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 655 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 664 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 673 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 682 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, Load { destination: Relative(9), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 689 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 703 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 712 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 721 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 730 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 739 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 748 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, JumpIf { condition: Relative(18), location: 756 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(18) }, Cast { destination: Relative(4), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 770 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(5), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(13) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 779 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 788 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Cast { destination: Relative(5), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 797 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 806 }, Call { location: 1204 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(2), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 815 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 822 }, Call { location: 1204 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(1), source: Direct(32838) }, Jump { location: 898 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(6) }, JumpIf { condition: Relative(10), location: 920 }, Jump { location: 901 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Cast { destination: Relative(2), source: Relative(7), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(2), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(3), rhs: Relative(2) }, Cast { destination: Relative(2), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(1), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Relative(10), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 926 }, Call { location: 1232 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 929 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Field }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(14), op: Mul, lhs: Relative(10), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Sub, lhs: Relative(3), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(13), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(14), rhs: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 898 }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 947 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(20) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(21), radix: Relative(4), output_pointer: Relative(22), num_limbs: Relative(23), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(20) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(21) }, JumpIf { condition: Relative(22), location: 963 }, Call { location: 1204 }, Mov { destination: Relative(10), source: Relative(18) }, Jump { location: 965 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, JumpIf { condition: Relative(20), location: 971 }, Jump { location: 968 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(20) }, JumpIf { condition: Relative(22), location: 975 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(10) }, Load { destination: Relative(22), source_pointer: Relative(24) }, Load { destination: Relative(23), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(24), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(24), location: 982 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(20) }, Store { destination_pointer: Relative(26), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(24) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32838) }, Mov { destination: Relative(10), source: Relative(20) }, Jump { location: 965 }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(21) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(14), radix: Relative(4), output_pointer: Relative(21), num_limbs: Relative(22), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(20), location: 1014 }, Jump { location: 1011 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(20) }, JumpIf { condition: Relative(21), location: 1018 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Load { destination: Relative(22), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(23), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(23), location: 1025 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(21) }, Store { destination_pointer: Relative(3), source: Relative(23) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(20) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(20) }, Cast { destination: Relative(20), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(20), bit_size: Field }, BinaryFieldOp { destination: Relative(20), op: Sub, lhs: Relative(15), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(20), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Direct(32842), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(17), rhs: Relative(20) }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(15), rhs: Relative(23) }, JumpIf { condition: Relative(20), location: 1049 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(15), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(20) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(15) }, Store { destination_pointer: Relative(27), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(20) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(17) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(14), source: Relative(20) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(15) }, Jump { location: 347 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1112 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1120 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1131 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(13), location: 1138 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 219 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1154 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 1161 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 207 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1177 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1184 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 196 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 1200 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 1214 }, Jump { location: 1216 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1231 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 1228 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 1221 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 1231 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33029 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32843), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32843 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32907 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32971 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33019 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33021 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33023 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33025 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 122 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 1195 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 138 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 132 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 147 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 155 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 163 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 171 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 179 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 187 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Const { destination: Relative(19), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 196 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 1172 }, Jump { location: 199 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 204 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 207 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 1149 }, Jump { location: 210 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 215 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 219 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 1106 }, Jump { location: 222 }, Load { destination: Relative(3), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 228 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 234 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(13), location: 245 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 250 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 262 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(15), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(16), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(20), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(21), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(21), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Mov { destination: Relative(23), source: Relative(22) }, Store { destination_pointer: Relative(23), source: Relative(12) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(15) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(17) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(20) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Const { destination: Relative(12), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 347 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(15), location: 1036 }, Jump { location: 350 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Const { destination: Relative(12), bit_size: Field, value: 2 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(12) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(21), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(20) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(13) }, Store { destination_pointer: Relative(23), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Store { destination_pointer: Relative(14), source: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(22), size: Relative(23) }, scalars: HeapVector { pointer: Relative(24), size: Relative(25) }, outputs: HeapArray { pointer: Relative(26), size: 3 } }), BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, Load { destination: Relative(20), source_pointer: Relative(21) }, Load { destination: Relative(14), source_pointer: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(21), rhs: Direct(32839) }, JumpIf { condition: Relative(22), location: 409 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Store { destination_pointer: Relative(24), source: Relative(20) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, JumpIf { condition: Relative(20), location: 420 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Direct(32839) }, JumpIf { condition: Relative(20), location: 423 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(21), location: 434 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 437 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(3) }, Store { destination_pointer: Relative(23), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 448 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 453 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(20), location: 464 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(20), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 469 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(4) }, Store { destination_pointer: Relative(22), source: Relative(20) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(14), location: 480 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 485 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Store { destination_pointer: Relative(21), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 496 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 501 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 513 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 518 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 533 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 527 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(6), location: 993 }, Jump { location: 543 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(10), location: 942 }, Jump { location: 549 }, Load { destination: Relative(4), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(10), size: 32 } }), BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 572 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Cast { destination: Relative(2), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(14), location: 581 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, Const { destination: Relative(10), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(14), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(11) }, JumpIf { condition: Relative(18), location: 590 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(2), source_pointer: Relative(14) }, Cast { destination: Relative(14), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(14), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(14) }, JumpIf { condition: Relative(18), location: 599 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Cast { destination: Relative(7), source: Relative(11), bit_size: Integer(U64) }, Const { destination: Relative(11), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(14), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(14), rhs: Relative(7) }, JumpIf { condition: Relative(18), location: 608 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(17) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(14), bit_size: Integer(U64) }, Const { destination: Relative(14), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 617 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(7), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(7) }, JumpIf { condition: Relative(17), location: 624 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(9), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 637 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 646 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 655 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 664 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 673 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 682 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, Load { destination: Relative(9), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 689 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 703 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 712 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 721 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 730 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 739 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 748 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, JumpIf { condition: Relative(18), location: 756 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(18) }, Cast { destination: Relative(4), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 770 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(5), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(13) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 779 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 788 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Cast { destination: Relative(5), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 797 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 806 }, Call { location: 1204 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(2), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 815 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 822 }, Call { location: 1204 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(1), source: Direct(32838) }, Jump { location: 898 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(6) }, JumpIf { condition: Relative(10), location: 920 }, Jump { location: 901 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Cast { destination: Relative(2), source: Relative(7), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(2), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(3), rhs: Relative(2) }, Cast { destination: Relative(2), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(1), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Relative(10), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 926 }, Call { location: 1232 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 929 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Field }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(14), op: Mul, lhs: Relative(10), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Sub, lhs: Relative(3), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(13), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(14), rhs: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 898 }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 947 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(20) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(21), radix: Relative(4), output_pointer: Relative(22), num_limbs: Relative(23), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(20) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(21) }, JumpIf { condition: Relative(22), location: 963 }, Call { location: 1204 }, Mov { destination: Relative(10), source: Relative(18) }, Jump { location: 965 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, JumpIf { condition: Relative(20), location: 971 }, Jump { location: 968 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(20) }, JumpIf { condition: Relative(22), location: 975 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(10) }, Load { destination: Relative(22), source_pointer: Relative(24) }, Load { destination: Relative(23), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(24), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(24), location: 982 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(20) }, Store { destination_pointer: Relative(26), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(24) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32838) }, Mov { destination: Relative(10), source: Relative(20) }, Jump { location: 965 }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(21) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(14), radix: Relative(4), output_pointer: Relative(21), num_limbs: Relative(22), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(20), location: 1014 }, Jump { location: 1011 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(20) }, JumpIf { condition: Relative(21), location: 1018 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Load { destination: Relative(22), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(23), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(23), location: 1025 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(21) }, Store { destination_pointer: Relative(3), source: Relative(23) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(20) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(20) }, Cast { destination: Relative(20), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(20), bit_size: Field }, BinaryFieldOp { destination: Relative(20), op: Sub, lhs: Relative(15), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(20), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Direct(32842), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(17), rhs: Relative(20) }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(15), rhs: Relative(23) }, JumpIf { condition: Relative(20), location: 1049 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(15), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(20) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(15) }, Store { destination_pointer: Relative(27), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(20) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(17) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(14), source: Relative(20) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(15) }, Jump { location: 347 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1112 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1120 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1131 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(13), location: 1138 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 219 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1154 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 1161 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 207 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1177 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1184 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 196 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 1200 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 1214 }, Jump { location: 1216 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1231 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 1228 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 1221 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 1231 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -178,11 +178,11 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { - "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = std::hash::blake3(hash_input_flattened);\n U256::from_bytes32(blake3_digest).to_u128_limbs()\n}\n", + "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake2_digest = std::hash::blake2s(hash_input_flattened);\n U256::from_bytes32(blake2_digest).to_u128_limbs()\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 6adf8503cec..3b706fe22be 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -165,9 +165,9 @@ expression: artifact "return value indices : [_184, _185]", "BRILLIG CALL func 0: inputs: [Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(3))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(4))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(5))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(6))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(7))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(8))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(9))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(11))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(12))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(13))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(14))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(17))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(20))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(23))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(26))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(29))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(32))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(35))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(38))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(41))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(45))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(46))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(47))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(48))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(49))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(50))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(51))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(52))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(53))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(54))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(55))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(56))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(57))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(58))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(60))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(61))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(62))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(63))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(64))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(65))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(66))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(67))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(68))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(69))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(71))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(72))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(73))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(74))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(75))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(76))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(77))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(78))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(79))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(80))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(82))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(83))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(84))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(85))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(86))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(87))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(88))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(89))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(90))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(91))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(92))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(93))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(94))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(95))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(96))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(97))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(98))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(100))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(101))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(102))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(103))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(104))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(105))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(106))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(107))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(108))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(109))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(110))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(111))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(112))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(113))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(114))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(115))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(116))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(117))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(118))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(119))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(120))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(121))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(122))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(124))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(125))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(126))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(127))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(128))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(129))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(130))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(131))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(132))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(133))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(135))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(136))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(137))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(138))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(139))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(140))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(141))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(142))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(143))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(144))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(148))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(149))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(150))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(151))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(153))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(154))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(155))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(156))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(157))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(158))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(159))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(160))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(161))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(162))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(163))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(167))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(168))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(169))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(170))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(171))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(172))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(173))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(174))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(175))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(177))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(178))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(179))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(180))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(181))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(182))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 }])], outputs: [Array([Witness(184), Witness(185)])]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33038 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32852), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32852 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32916 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32980 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33028 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33030 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33032 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33034 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 131 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33036 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33036 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Const { destination: Direct(32843), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32844), bit_size: Field, value: 2 }, Const { destination: Direct(32845), bit_size: Integer(U32), value: 3 }, Const { destination: Direct(32846), bit_size: Integer(U32), value: 5 }, Const { destination: Direct(32847), bit_size: Integer(U32), value: 6 }, Const { destination: Direct(32848), bit_size: Integer(U32), value: 7 }, Const { destination: Direct(32849), bit_size: Integer(U32), value: 8 }, Const { destination: Direct(32850), bit_size: Integer(U32), value: 9 }, Const { destination: Direct(32851), bit_size: Integer(U32), value: 32 }, Return, Call { location: 823 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 147 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 141 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 156 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 164 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 172 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 180 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 188 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 196 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 204 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 800 }, Jump { location: 207 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 212 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 215 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 777 }, Jump { location: 218 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 223 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 226 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(2), location: 734 }, Jump { location: 229 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32851) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(8), location: 234 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(12), location: 240 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(3) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 251 }, Call { location: 832 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 256 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Store { destination_pointer: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 267 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(12) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(12) }, Const { destination: Relative(15), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 351 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(16), location: 664 }, Jump { location: 354 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32846) }, Store { destination_pointer: Relative(16), source: Direct(32844) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32847) }, Store { destination_pointer: Relative(16), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32848) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32849) }, Store { destination_pointer: Relative(16), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32850) }, Store { destination_pointer: Relative(15), source: Relative(12) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(13), size: Relative(14) }, scalars: HeapVector { pointer: Relative(15), size: Relative(16) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(9), location: 405 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(2) }, Store { destination_pointer: Relative(13), source: Relative(7) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(7), location: 416 }, Call { location: 832 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(2), location: 419 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Store { destination_pointer: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(7), location: 430 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(7), location: 433 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Store { destination_pointer: Relative(12), source: Relative(8) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 444 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 449 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(2) }, Store { destination_pointer: Relative(9), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(7), location: 460 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 465 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Store { destination_pointer: Relative(9), source: Relative(7) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 476 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 481 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 492 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 497 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 509 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(3), location: 514 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Const { destination: Relative(2), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Mov { destination: Relative(6), source: Relative(4) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 529 }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Jump { location: 523 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 536 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(5), location: 621 }, Jump { location: 539 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 542 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 570 }, Jump { location: 545 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(3), size: Relative(4) }, output: HeapArray { pointer: Relative(5), size: 32 } }), Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 860 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(5) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 1139 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, JumpIf { condition: Relative(9), location: 575 }, Call { location: 835 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Const { destination: Relative(8), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(9), radix: Relative(3), output_pointer: Relative(10), num_limbs: Relative(12), output_bits: Relative(8) }), BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 591 }, Call { location: 832 }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 593 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 599 }, Jump { location: 596 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 542 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 603 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(13) }, Load { destination: Relative(12), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(13), location: 610 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 838 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 593 }, Load { destination: Relative(6), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Const { destination: Relative(8), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(7), radix: Relative(3), output_pointer: Relative(9), num_limbs: Relative(10), output_bits: Relative(8) }), BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32851) }, Mov { destination: Relative(5), source: Relative(18) }, Jump { location: 636 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32851) }, JumpIf { condition: Relative(8), location: 642 }, Jump { location: 639 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(5) }, Jump { location: 536 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 646 }, Call { location: 832 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 653 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Mov { destination: Relative(5), source: Relative(8) }, Jump { location: 636 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(16), source_pointer: Relative(19) }, Cast { destination: Relative(19), source: Relative(16), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(19), bit_size: Field }, BinaryFieldOp { destination: Relative(19), op: Sub, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(19), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Direct(32842), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(22), op: Add, lhs: Relative(17), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(16), rhs: Relative(22) }, JumpIf { condition: Relative(19), location: 677 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(23) } }, Load { destination: Relative(16), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(19) }, Store { destination_pointer: Relative(24), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Store { destination_pointer: Relative(23), source: Relative(21) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Load { destination: Relative(21), source_pointer: Relative(23) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(22) }, Load { destination: Relative(23), source_pointer: Relative(25) }, Load { destination: Relative(22), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(16) }, Store { destination_pointer: Relative(26), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(24) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(19) }, Store { destination_pointer: Relative(22), source: Relative(21) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(23) }, Store { destination_pointer: Relative(14), source: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(16) }, Jump { location: 351 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 740 }, Call { location: 832 }, BinaryIntOp { destination: Relative(2), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 748 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 759 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Load { destination: Relative(2), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, JumpIf { condition: Relative(12), location: 766 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(2) }, Jump { location: 226 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 782 }, Call { location: 832 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 789 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 215 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 805 }, Call { location: 832 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 812 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 204 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 828 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 842 }, Jump { location: 844 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 859 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 856 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 849 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 859 }, Return, Call { location: 823 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(3), bit_size: Integer(U64) }, Const { destination: Relative(3), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(7), location: 875 }, Call { location: 832 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Cast { destination: Relative(6), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(7), op: Shl, bit_size: U64, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(7) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 884 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Cast { destination: Relative(7), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(8), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(5) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(8) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 893 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32846) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Cast { destination: Relative(8), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(9), op: Shl, bit_size: U64, lhs: Relative(8), rhs: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(9) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 902 }, Call { location: 832 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32847) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Cast { destination: Relative(9), source: Relative(7), bit_size: Integer(U64) }, Const { destination: Relative(7), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U64, lhs: Relative(8), rhs: Relative(9) }, JumpIf { condition: Relative(11), location: 911 }, Call { location: 832 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32848) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(8), bit_size: Integer(U64) }, Const { destination: Relative(8), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 920 }, Call { location: 832 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32849) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 927 }, Call { location: 832 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32850) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(2) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 940 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 949 }, Call { location: 832 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(5) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 958 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 967 }, Call { location: 832 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 976 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 985 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, Load { destination: Relative(11), source_pointer: Relative(12) }, Cast { destination: Relative(12), source: Relative(11), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 992 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1006 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1015 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1024 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1033 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1042 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1051 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1059 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(14) }, Cast { destination: Relative(2), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, BinaryIntOp { destination: Relative(3), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 1073 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Cast { destination: Relative(3), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 1082 }, Call { location: 832 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(10) }, Cast { destination: Relative(2), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 1091 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 1100 }, Call { location: 832 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(2), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 1109 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 1118 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32851) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Cast { destination: Relative(1), source: Relative(2), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(1) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 1125 }, Call { location: 832 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(9) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(13) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Call { location: 823 }, Const { destination: Relative(2), bit_size: Field, value: 64 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Direct(32844) }, Mov { destination: Relative(7), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1175 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Cast { destination: Relative(4), source: Relative(2), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(4), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(4), op: Add, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, Load { destination: Relative(2), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(2), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Add, lhs: Relative(2), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Return, Call { location: 823 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(8), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(2), radix: Relative(7), output_pointer: Relative(9), num_limbs: Relative(10), output_bits: Relative(8) }), Const { destination: Relative(11), bit_size: Integer(U32), value: 32 }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(11) }, Call { location: 1223 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 1196 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(7), location: 1201 }, Jump { location: 1199 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(7), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(8), op: Mul, lhs: Relative(7), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Sub, bit_size: U32, lhs: Direct(32851), rhs: Relative(3) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Direct(32851) }, JumpIf { condition: Relative(9), location: 1207 }, Call { location: 1242 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32851) }, JumpIf { condition: Relative(9), location: 1210 }, Call { location: 835 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Cast { destination: Relative(7), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(9), op: Mul, lhs: Relative(8), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(7), rhs: Relative(9) }, BinaryFieldOp { destination: Relative(9), op: Sub, lhs: Relative(5), rhs: Relative(7) }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(9), rhs: Relative(8) }, BinaryFieldOp { destination: Relative(8), op: Add, lhs: Relative(10), rhs: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Mov { destination: Relative(3), source: Relative(7) }, Jump { location: 1196 }, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 1241 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 1227 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33038 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32852), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32852 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32916 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32980 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33028 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33030 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33032 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33034 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 131 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33036 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33036 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Const { destination: Direct(32843), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32844), bit_size: Field, value: 2 }, Const { destination: Direct(32845), bit_size: Integer(U32), value: 3 }, Const { destination: Direct(32846), bit_size: Integer(U32), value: 5 }, Const { destination: Direct(32847), bit_size: Integer(U32), value: 6 }, Const { destination: Direct(32848), bit_size: Integer(U32), value: 7 }, Const { destination: Direct(32849), bit_size: Integer(U32), value: 8 }, Const { destination: Direct(32850), bit_size: Integer(U32), value: 9 }, Const { destination: Direct(32851), bit_size: Integer(U32), value: 32 }, Return, Call { location: 823 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 147 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 141 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 156 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 164 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 172 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 180 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 188 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 196 }, Call { location: 829 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 204 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 800 }, Jump { location: 207 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 212 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 215 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 777 }, Jump { location: 218 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 223 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 226 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(2), location: 734 }, Jump { location: 229 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32851) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(8), location: 234 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(12), location: 240 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(3) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 251 }, Call { location: 832 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 256 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Store { destination_pointer: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 267 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(12) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(12) }, Const { destination: Relative(15), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 351 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(16), location: 664 }, Jump { location: 354 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32846) }, Store { destination_pointer: Relative(16), source: Direct(32844) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32847) }, Store { destination_pointer: Relative(16), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32848) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32849) }, Store { destination_pointer: Relative(16), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32850) }, Store { destination_pointer: Relative(15), source: Relative(12) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(13), size: Relative(14) }, scalars: HeapVector { pointer: Relative(15), size: Relative(16) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(9), location: 405 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(2) }, Store { destination_pointer: Relative(13), source: Relative(7) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(7), location: 416 }, Call { location: 832 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(2), location: 419 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Store { destination_pointer: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(7), location: 430 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(7), location: 433 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Store { destination_pointer: Relative(12), source: Relative(8) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 444 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 449 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(2) }, Store { destination_pointer: Relative(9), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(7), location: 460 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 465 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Store { destination_pointer: Relative(9), source: Relative(7) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 476 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 481 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 492 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 497 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 509 }, Call { location: 832 }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(3), location: 514 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Const { destination: Relative(2), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Mov { destination: Relative(6), source: Relative(4) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 529 }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Jump { location: 523 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 536 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(5), location: 621 }, Jump { location: 539 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 542 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 570 }, Jump { location: 545 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(3), size: Relative(4) }, output: HeapArray { pointer: Relative(5), size: 32 } }), Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 860 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(5) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 1139 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, JumpIf { condition: Relative(9), location: 575 }, Call { location: 835 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Const { destination: Relative(8), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(9), radix: Relative(3), output_pointer: Relative(10), num_limbs: Relative(12), output_bits: Relative(8) }), BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 591 }, Call { location: 832 }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 593 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 599 }, Jump { location: 596 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 542 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 603 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(13) }, Load { destination: Relative(12), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(13), location: 610 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 838 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 593 }, Load { destination: Relative(6), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Const { destination: Relative(8), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(7), radix: Relative(3), output_pointer: Relative(9), num_limbs: Relative(10), output_bits: Relative(8) }), BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32851) }, Mov { destination: Relative(5), source: Relative(18) }, Jump { location: 636 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32851) }, JumpIf { condition: Relative(8), location: 642 }, Jump { location: 639 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(5) }, Jump { location: 536 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 646 }, Call { location: 832 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 653 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Mov { destination: Relative(5), source: Relative(8) }, Jump { location: 636 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(16), source_pointer: Relative(19) }, Cast { destination: Relative(19), source: Relative(16), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(19), bit_size: Field }, BinaryFieldOp { destination: Relative(19), op: Sub, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(19), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Direct(32842), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(22), op: Add, lhs: Relative(17), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(16), rhs: Relative(22) }, JumpIf { condition: Relative(19), location: 677 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(23) } }, Load { destination: Relative(16), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(19) }, Store { destination_pointer: Relative(24), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 838 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Store { destination_pointer: Relative(23), source: Relative(21) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Load { destination: Relative(21), source_pointer: Relative(23) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(22) }, Load { destination: Relative(23), source_pointer: Relative(25) }, Load { destination: Relative(22), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(16) }, Store { destination_pointer: Relative(26), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(24) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(19) }, Store { destination_pointer: Relative(22), source: Relative(21) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 838 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(23) }, Store { destination_pointer: Relative(14), source: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(16) }, Jump { location: 351 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 740 }, Call { location: 832 }, BinaryIntOp { destination: Relative(2), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 748 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 759 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Load { destination: Relative(2), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, JumpIf { condition: Relative(12), location: 766 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(2) }, Jump { location: 226 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 782 }, Call { location: 832 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 789 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 215 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 805 }, Call { location: 832 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 812 }, Call { location: 835 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 838 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 204 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 828 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 842 }, Jump { location: 844 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 859 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 856 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 849 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 859 }, Return, Call { location: 823 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(3), bit_size: Integer(U64) }, Const { destination: Relative(3), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(7), location: 875 }, Call { location: 832 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Cast { destination: Relative(6), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(7), op: Shl, bit_size: U64, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(7) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 884 }, Call { location: 832 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Cast { destination: Relative(7), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(8), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(5) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(8) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 893 }, Call { location: 832 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32846) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Cast { destination: Relative(8), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(9), op: Shl, bit_size: U64, lhs: Relative(8), rhs: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(9) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 902 }, Call { location: 832 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32847) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Cast { destination: Relative(9), source: Relative(7), bit_size: Integer(U64) }, Const { destination: Relative(7), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U64, lhs: Relative(8), rhs: Relative(9) }, JumpIf { condition: Relative(11), location: 911 }, Call { location: 832 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32848) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(8), bit_size: Integer(U64) }, Const { destination: Relative(8), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 920 }, Call { location: 832 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32849) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 927 }, Call { location: 832 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32850) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(2) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 940 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 949 }, Call { location: 832 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(5) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 958 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 967 }, Call { location: 832 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 976 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 985 }, Call { location: 832 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, Load { destination: Relative(11), source_pointer: Relative(12) }, Cast { destination: Relative(12), source: Relative(11), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, JumpIf { condition: Relative(13), location: 992 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1006 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1015 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1024 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1033 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 1042 }, Call { location: 832 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1051 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1059 }, Call { location: 832 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, Cast { destination: Relative(10), source: Relative(12), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(12), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(14) }, Cast { destination: Relative(2), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, BinaryIntOp { destination: Relative(3), op: LessThanEquals, bit_size: U64, lhs: Relative(12), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 1073 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Cast { destination: Relative(3), source: Relative(10), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(10), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 1082 }, Call { location: 832 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(10) }, Cast { destination: Relative(2), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 1091 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 1100 }, Call { location: 832 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(2), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 1109 }, Call { location: 832 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Shl, bit_size: U64, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 1118 }, Call { location: 832 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32851) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Cast { destination: Relative(1), source: Relative(2), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(3), rhs: Relative(1) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U64, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 1125 }, Call { location: 832 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(9) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(13) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Call { location: 823 }, Const { destination: Relative(2), bit_size: Field, value: 64 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Direct(32844) }, Mov { destination: Relative(7), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1175 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Cast { destination: Relative(4), source: Relative(2), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(4), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(4), op: Add, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, Load { destination: Relative(2), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(2), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Add, lhs: Relative(2), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Return, Call { location: 823 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(8), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(2), radix: Relative(7), output_pointer: Relative(9), num_limbs: Relative(10), output_bits: Relative(8) }), Const { destination: Relative(11), bit_size: Integer(U32), value: 32 }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(11) }, Call { location: 1223 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 1196 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(7), location: 1201 }, Jump { location: 1199 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(7), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(8), op: Mul, lhs: Relative(7), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Sub, bit_size: U32, lhs: Direct(32851), rhs: Relative(3) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Direct(32851) }, JumpIf { condition: Relative(9), location: 1207 }, Call { location: 1242 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32851) }, JumpIf { condition: Relative(9), location: 1210 }, Call { location: 835 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Cast { destination: Relative(7), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(9), op: Mul, lhs: Relative(8), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(7), rhs: Relative(9) }, BinaryFieldOp { destination: Relative(9), op: Sub, lhs: Relative(5), rhs: Relative(7) }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(9), rhs: Relative(8) }, BinaryFieldOp { destination: Relative(8), op: Add, lhs: Relative(10), rhs: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Mov { destination: Relative(3), source: Relative(7) }, Jump { location: 1196 }, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 1241 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 1227 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -178,11 +178,11 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { - "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = std::hash::blake3(hash_input_flattened);\n U256::from_bytes32(blake3_digest).to_u128_limbs()\n}\n", + "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake2_digest = std::hash::blake2s(hash_input_flattened);\n U256::from_bytes32(blake2_digest).to_u128_limbs()\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_0.snap index b965fc13940..f5637baf343 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_0.snap @@ -165,9 +165,9 @@ expression: artifact "return value indices : [_184, _185]", "BRILLIG CALL func 0: inputs: [Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(3))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(4))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(5))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(6))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(7))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(8))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(9))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(11))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(12))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(13))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(14))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(17))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(20))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(23))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(26))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(29))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(32))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(35))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(38))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(41))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(45))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(46))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(47))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(48))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(49))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(50))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(51))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(52))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(53))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(54))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(55))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(56))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(57))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(58))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(60))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(61))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(62))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(63))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(64))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(65))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(66))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(67))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(68))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(69))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(71))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(72))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(73))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(74))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(75))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(76))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(77))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(78))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(79))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(80))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(82))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(83))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(84))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(85))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(86))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(87))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(88))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(89))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(90))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(91))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(92))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(93))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(94))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(95))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(96))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(97))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(98))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(100))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(101))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(102))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(103))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(104))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(105))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(106))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(107))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(108))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(109))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(110))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(111))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(112))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(113))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(114))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(115))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(116))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(117))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(118))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(119))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(120))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(121))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(122))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(124))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(125))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(126))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(127))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(128))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(129))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(130))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(131))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(132))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(133))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(135))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(136))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(137))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(138))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(139))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(140))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(141))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(142))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(143))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(144))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(148))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(149))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(150))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(151))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(153))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(154))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(155))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(156))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(157))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(158))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(159))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(160))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(161))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(162))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(163))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(167))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(168))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(169))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(170))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(171))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(172))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(173))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(174))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(175))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(177))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(178))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(179))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(180))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(181))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(182))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 }])], outputs: [Array([Witness(184), Witness(185)])]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33029 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32843), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32843 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32907 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32971 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33019 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33021 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33023 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33025 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 122 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 1195 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 138 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 132 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 147 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 155 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 163 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 171 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 179 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 187 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Const { destination: Relative(19), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 196 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 1172 }, Jump { location: 199 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 204 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 207 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 1149 }, Jump { location: 210 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 215 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 219 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 1106 }, Jump { location: 222 }, Load { destination: Relative(3), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 228 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 234 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(13), location: 245 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 250 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 262 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(15), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(16), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(20), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(21), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(21), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Mov { destination: Relative(23), source: Relative(22) }, Store { destination_pointer: Relative(23), source: Relative(12) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(15) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(17) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(20) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Const { destination: Relative(12), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 347 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(15), location: 1036 }, Jump { location: 350 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Const { destination: Relative(12), bit_size: Field, value: 2 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(12) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(21), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(20) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(13) }, Store { destination_pointer: Relative(23), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Store { destination_pointer: Relative(14), source: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(22), size: Relative(23) }, scalars: HeapVector { pointer: Relative(24), size: Relative(25) }, outputs: HeapArray { pointer: Relative(26), size: 3 } }), BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, Load { destination: Relative(20), source_pointer: Relative(21) }, Load { destination: Relative(14), source_pointer: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(21), rhs: Direct(32839) }, JumpIf { condition: Relative(22), location: 409 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Store { destination_pointer: Relative(24), source: Relative(20) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, JumpIf { condition: Relative(20), location: 420 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Direct(32839) }, JumpIf { condition: Relative(20), location: 423 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(21), location: 434 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 437 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(3) }, Store { destination_pointer: Relative(23), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 448 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 453 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(20), location: 464 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(20), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 469 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(4) }, Store { destination_pointer: Relative(22), source: Relative(20) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(14), location: 480 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 485 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Store { destination_pointer: Relative(21), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 496 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 501 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 513 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 518 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 533 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 527 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(6), location: 993 }, Jump { location: 543 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(10), location: 942 }, Jump { location: 549 }, Load { destination: Relative(4), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(10), size: 32 } }), BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 572 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Cast { destination: Relative(2), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(14), location: 581 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, Const { destination: Relative(10), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(14), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(11) }, JumpIf { condition: Relative(18), location: 590 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(2), source_pointer: Relative(14) }, Cast { destination: Relative(14), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(14), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(14) }, JumpIf { condition: Relative(18), location: 599 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Cast { destination: Relative(7), source: Relative(11), bit_size: Integer(U64) }, Const { destination: Relative(11), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(14), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(14), rhs: Relative(7) }, JumpIf { condition: Relative(18), location: 608 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(17) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(14), bit_size: Integer(U64) }, Const { destination: Relative(14), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 617 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(7), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(7) }, JumpIf { condition: Relative(17), location: 624 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(9), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 637 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 646 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 655 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 664 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 673 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 682 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, Load { destination: Relative(9), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 689 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 703 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 712 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 721 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 730 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 739 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 748 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, JumpIf { condition: Relative(18), location: 756 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(18) }, Cast { destination: Relative(4), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 770 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(5), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(13) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 779 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 788 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Cast { destination: Relative(5), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 797 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 806 }, Call { location: 1204 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(2), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 815 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 822 }, Call { location: 1204 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(1), source: Direct(32838) }, Jump { location: 898 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(6) }, JumpIf { condition: Relative(10), location: 920 }, Jump { location: 901 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Cast { destination: Relative(2), source: Relative(7), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(2), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(3), rhs: Relative(2) }, Cast { destination: Relative(2), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(1), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Relative(10), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 926 }, Call { location: 1232 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 929 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Field }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(14), op: Mul, lhs: Relative(10), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Sub, lhs: Relative(3), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(13), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(14), rhs: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 898 }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 947 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(20) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(21), radix: Relative(4), output_pointer: Relative(22), num_limbs: Relative(23), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(20) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(21) }, JumpIf { condition: Relative(22), location: 963 }, Call { location: 1204 }, Mov { destination: Relative(10), source: Relative(18) }, Jump { location: 965 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, JumpIf { condition: Relative(20), location: 971 }, Jump { location: 968 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(20) }, JumpIf { condition: Relative(22), location: 975 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(10) }, Load { destination: Relative(22), source_pointer: Relative(24) }, Load { destination: Relative(23), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(24), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(24), location: 982 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(20) }, Store { destination_pointer: Relative(26), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(24) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32838) }, Mov { destination: Relative(10), source: Relative(20) }, Jump { location: 965 }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(21) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(14), radix: Relative(4), output_pointer: Relative(21), num_limbs: Relative(22), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(20), location: 1014 }, Jump { location: 1011 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(20) }, JumpIf { condition: Relative(21), location: 1018 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Load { destination: Relative(22), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(23), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(23), location: 1025 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(21) }, Store { destination_pointer: Relative(3), source: Relative(23) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(20) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(20) }, Cast { destination: Relative(20), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(20), bit_size: Field }, BinaryFieldOp { destination: Relative(20), op: Sub, lhs: Relative(15), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(20), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Direct(32842), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(17), rhs: Relative(20) }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(15), rhs: Relative(23) }, JumpIf { condition: Relative(20), location: 1049 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(15), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(20) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(15) }, Store { destination_pointer: Relative(27), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(20) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(17) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(14), source: Relative(20) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(15) }, Jump { location: 347 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1112 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1120 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1131 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(13), location: 1138 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 219 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1154 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 1161 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 207 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1177 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1184 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 196 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 1200 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 1214 }, Jump { location: 1216 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1231 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 1228 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 1221 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 1231 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33029 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32843), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32843 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32907 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32971 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33019 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33021 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33023 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33025 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 122 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 1195 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 138 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 132 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 147 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 155 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 163 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 171 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 179 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 187 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Const { destination: Relative(19), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 196 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 1172 }, Jump { location: 199 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 204 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 207 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 1149 }, Jump { location: 210 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 215 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 219 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 1106 }, Jump { location: 222 }, Load { destination: Relative(3), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 228 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 234 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(13), location: 245 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 250 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 262 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(15), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(16), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(20), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(21), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(21), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Mov { destination: Relative(23), source: Relative(22) }, Store { destination_pointer: Relative(23), source: Relative(12) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(15) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(17) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(20) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Const { destination: Relative(12), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 347 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(15), location: 1036 }, Jump { location: 350 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Const { destination: Relative(12), bit_size: Field, value: 2 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(12) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(21), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(20) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(13) }, Store { destination_pointer: Relative(23), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Store { destination_pointer: Relative(14), source: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(22), size: Relative(23) }, scalars: HeapVector { pointer: Relative(24), size: Relative(25) }, outputs: HeapArray { pointer: Relative(26), size: 3 } }), BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, Load { destination: Relative(20), source_pointer: Relative(21) }, Load { destination: Relative(14), source_pointer: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(21), rhs: Direct(32839) }, JumpIf { condition: Relative(22), location: 409 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Store { destination_pointer: Relative(24), source: Relative(20) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, JumpIf { condition: Relative(20), location: 420 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Direct(32839) }, JumpIf { condition: Relative(20), location: 423 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(21), location: 434 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 437 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(3) }, Store { destination_pointer: Relative(23), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 448 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 453 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(20), location: 464 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(20), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 469 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(4) }, Store { destination_pointer: Relative(22), source: Relative(20) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(14), location: 480 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 485 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Store { destination_pointer: Relative(21), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 496 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 501 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 513 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 518 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 533 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 527 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(6), location: 993 }, Jump { location: 543 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(10), location: 942 }, Jump { location: 549 }, Load { destination: Relative(4), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(10), size: 32 } }), BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 572 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Cast { destination: Relative(2), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(14), location: 581 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, Const { destination: Relative(10), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(14), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(11) }, JumpIf { condition: Relative(18), location: 590 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(2), source_pointer: Relative(14) }, Cast { destination: Relative(14), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(14), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(14) }, JumpIf { condition: Relative(18), location: 599 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Cast { destination: Relative(7), source: Relative(11), bit_size: Integer(U64) }, Const { destination: Relative(11), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(14), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(14), rhs: Relative(7) }, JumpIf { condition: Relative(18), location: 608 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(17) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(14), bit_size: Integer(U64) }, Const { destination: Relative(14), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 617 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(7), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(7) }, JumpIf { condition: Relative(17), location: 624 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(9), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 637 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 646 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 655 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 664 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 673 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 682 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, Load { destination: Relative(9), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 689 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 703 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 712 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 721 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 730 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 739 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 748 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, JumpIf { condition: Relative(18), location: 756 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(18) }, Cast { destination: Relative(4), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 770 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(5), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(13) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 779 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 788 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Cast { destination: Relative(5), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 797 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 806 }, Call { location: 1204 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(2), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 815 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 822 }, Call { location: 1204 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(1), source: Direct(32838) }, Jump { location: 898 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(6) }, JumpIf { condition: Relative(10), location: 920 }, Jump { location: 901 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Cast { destination: Relative(2), source: Relative(7), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(2), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(3), rhs: Relative(2) }, Cast { destination: Relative(2), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(1), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Relative(10), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 926 }, Call { location: 1232 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 929 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Field }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(14), op: Mul, lhs: Relative(10), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Sub, lhs: Relative(3), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(13), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(14), rhs: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 898 }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 947 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(20) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(21), radix: Relative(4), output_pointer: Relative(22), num_limbs: Relative(23), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(20) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(21) }, JumpIf { condition: Relative(22), location: 963 }, Call { location: 1204 }, Mov { destination: Relative(10), source: Relative(18) }, Jump { location: 965 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, JumpIf { condition: Relative(20), location: 971 }, Jump { location: 968 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(20) }, JumpIf { condition: Relative(22), location: 975 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(10) }, Load { destination: Relative(22), source_pointer: Relative(24) }, Load { destination: Relative(23), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(24), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(24), location: 982 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(20) }, Store { destination_pointer: Relative(26), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(24) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32838) }, Mov { destination: Relative(10), source: Relative(20) }, Jump { location: 965 }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(21) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(14), radix: Relative(4), output_pointer: Relative(21), num_limbs: Relative(22), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(20), location: 1014 }, Jump { location: 1011 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(20) }, JumpIf { condition: Relative(21), location: 1018 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Load { destination: Relative(22), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(23), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(23), location: 1025 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(21) }, Store { destination_pointer: Relative(3), source: Relative(23) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(20) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(20) }, Cast { destination: Relative(20), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(20), bit_size: Field }, BinaryFieldOp { destination: Relative(20), op: Sub, lhs: Relative(15), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(20), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Direct(32842), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(17), rhs: Relative(20) }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(15), rhs: Relative(23) }, JumpIf { condition: Relative(20), location: 1049 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(15), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(20) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(15) }, Store { destination_pointer: Relative(27), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(20) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(17) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(14), source: Relative(20) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(15) }, Jump { location: 347 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1112 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1120 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1131 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(13), location: 1138 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 219 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1154 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 1161 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 207 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1177 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1184 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 196 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 1200 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 1214 }, Jump { location: 1216 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1231 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 1228 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 1221 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 1231 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -178,11 +178,11 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { - "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = std::hash::blake3(hash_input_flattened);\n U256::from_bytes32(blake3_digest).to_u128_limbs()\n}\n", + "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake2_digest = std::hash::blake2s(hash_input_flattened);\n U256::from_bytes32(blake2_digest).to_u128_limbs()\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index b965fc13940..f5637baf343 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -165,9 +165,9 @@ expression: artifact "return value indices : [_184, _185]", "BRILLIG CALL func 0: inputs: [Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(3))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(4))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(5))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(6))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(7))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(8))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(9))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(11))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(12))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(13))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(14))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(17))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(20))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(23))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(26))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(29))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(32))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(35))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(38))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(41))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(45))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(46))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(47))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(48))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(49))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(50))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(51))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(52))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(53))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(54))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(55))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(56))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(57))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(58))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(60))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(61))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(62))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(63))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(64))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(65))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(66))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(67))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(68))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(69))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(71))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(72))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(73))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(74))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(75))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(76))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(77))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(78))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(79))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(80))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(82))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(83))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(84))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(85))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(86))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(87))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(88))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(89))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(90))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(91))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(92))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(93))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(94))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(95))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(96))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(97))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(98))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(100))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(101))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(102))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(103))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(104))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(105))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(106))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(107))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(108))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(109))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(110))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(111))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(112))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(113))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(114))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(115))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(116))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(117))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(118))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(119))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(120))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(121))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(122))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(124))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(125))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(126))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(127))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(128))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(129))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(130))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(131))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(132))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(133))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(135))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(136))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(137))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(138))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(139))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(140))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(141))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(142))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(143))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(144))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(148))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(149))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(150))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(151))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(153))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(154))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(155))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(156))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(157))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(158))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(159))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(160))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(161))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(162))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(163))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(167))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(168))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(169))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(170))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(171))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(172))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(173))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(174))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(175))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(177))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(178))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(179))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(180))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(181))], q_c: 0 }]), Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(182))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 }])], outputs: [Array([Witness(184), Witness(185)])]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33029 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32843), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32843 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32907 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32971 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33019 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33021 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33023 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33025 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 122 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 1195 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 138 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 132 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 147 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 155 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 163 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 171 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 179 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 187 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Const { destination: Relative(19), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 196 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 1172 }, Jump { location: 199 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 204 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 207 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 1149 }, Jump { location: 210 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 215 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 219 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 1106 }, Jump { location: 222 }, Load { destination: Relative(3), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 228 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 234 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(13), location: 245 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 250 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 262 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(15), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(16), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(20), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(21), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(21), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Mov { destination: Relative(23), source: Relative(22) }, Store { destination_pointer: Relative(23), source: Relative(12) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(15) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(17) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(20) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Const { destination: Relative(12), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 347 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(15), location: 1036 }, Jump { location: 350 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Const { destination: Relative(12), bit_size: Field, value: 2 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(12) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(21), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(20) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(13) }, Store { destination_pointer: Relative(23), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Store { destination_pointer: Relative(14), source: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(22), size: Relative(23) }, scalars: HeapVector { pointer: Relative(24), size: Relative(25) }, outputs: HeapArray { pointer: Relative(26), size: 3 } }), BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, Load { destination: Relative(20), source_pointer: Relative(21) }, Load { destination: Relative(14), source_pointer: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(21), rhs: Direct(32839) }, JumpIf { condition: Relative(22), location: 409 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Store { destination_pointer: Relative(24), source: Relative(20) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, JumpIf { condition: Relative(20), location: 420 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Direct(32839) }, JumpIf { condition: Relative(20), location: 423 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(21), location: 434 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 437 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(3) }, Store { destination_pointer: Relative(23), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 448 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 453 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(20), location: 464 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(20), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 469 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(4) }, Store { destination_pointer: Relative(22), source: Relative(20) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(14), location: 480 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 485 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Store { destination_pointer: Relative(21), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 496 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 501 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 513 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 518 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 533 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 527 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(6), location: 993 }, Jump { location: 543 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(10), location: 942 }, Jump { location: 549 }, Load { destination: Relative(4), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(10), size: 32 } }), BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 572 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Cast { destination: Relative(2), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(14), location: 581 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, Const { destination: Relative(10), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(14), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(11) }, JumpIf { condition: Relative(18), location: 590 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(2), source_pointer: Relative(14) }, Cast { destination: Relative(14), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(14), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(14) }, JumpIf { condition: Relative(18), location: 599 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Cast { destination: Relative(7), source: Relative(11), bit_size: Integer(U64) }, Const { destination: Relative(11), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(14), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(14), rhs: Relative(7) }, JumpIf { condition: Relative(18), location: 608 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(17) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(14), bit_size: Integer(U64) }, Const { destination: Relative(14), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 617 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(7), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(7) }, JumpIf { condition: Relative(17), location: 624 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(9), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 637 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 646 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 655 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 664 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 673 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 682 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, Load { destination: Relative(9), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 689 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 703 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 712 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 721 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 730 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 739 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 748 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, JumpIf { condition: Relative(18), location: 756 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(18) }, Cast { destination: Relative(4), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 770 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(5), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(13) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 779 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 788 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Cast { destination: Relative(5), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 797 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 806 }, Call { location: 1204 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(2), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 815 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 822 }, Call { location: 1204 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(1), source: Direct(32838) }, Jump { location: 898 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(6) }, JumpIf { condition: Relative(10), location: 920 }, Jump { location: 901 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Cast { destination: Relative(2), source: Relative(7), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(2), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(3), rhs: Relative(2) }, Cast { destination: Relative(2), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(1), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Relative(10), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 926 }, Call { location: 1232 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 929 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Field }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(14), op: Mul, lhs: Relative(10), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Sub, lhs: Relative(3), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(13), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(14), rhs: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 898 }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 947 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(20) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(21), radix: Relative(4), output_pointer: Relative(22), num_limbs: Relative(23), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(20) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(21) }, JumpIf { condition: Relative(22), location: 963 }, Call { location: 1204 }, Mov { destination: Relative(10), source: Relative(18) }, Jump { location: 965 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, JumpIf { condition: Relative(20), location: 971 }, Jump { location: 968 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(20) }, JumpIf { condition: Relative(22), location: 975 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(10) }, Load { destination: Relative(22), source_pointer: Relative(24) }, Load { destination: Relative(23), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(24), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(24), location: 982 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(20) }, Store { destination_pointer: Relative(26), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(24) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32838) }, Mov { destination: Relative(10), source: Relative(20) }, Jump { location: 965 }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(21) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(14), radix: Relative(4), output_pointer: Relative(21), num_limbs: Relative(22), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(20), location: 1014 }, Jump { location: 1011 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(20) }, JumpIf { condition: Relative(21), location: 1018 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Load { destination: Relative(22), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(23), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(23), location: 1025 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(21) }, Store { destination_pointer: Relative(3), source: Relative(23) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(20) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(20) }, Cast { destination: Relative(20), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(20), bit_size: Field }, BinaryFieldOp { destination: Relative(20), op: Sub, lhs: Relative(15), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(20), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Direct(32842), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(17), rhs: Relative(20) }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(15), rhs: Relative(23) }, JumpIf { condition: Relative(20), location: 1049 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(15), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(20) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(15) }, Store { destination_pointer: Relative(27), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(20) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(17) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(14), source: Relative(20) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(15) }, Jump { location: 347 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1112 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1120 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1131 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(13), location: 1138 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 219 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1154 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 1161 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 207 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1177 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1184 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 196 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 1200 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 1214 }, Jump { location: 1216 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1231 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 1228 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 1221 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 1231 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33029 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 184 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32843), size_address: Relative(8), offset_address: Relative(9) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32843 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(1), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32907 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 64 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 65 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(2), source: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32971 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33019 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(4), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33021 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(5) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(5), source: Relative(8) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33023 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(6), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33025 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(9) }, Call { location: 102 }, Mov { destination: Relative(7), source: Relative(8) }, Call { location: 113 }, Call { location: 122 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 102 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33027 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 112 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 105 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 64 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 16 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 169 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 165 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32842), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 1195 }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 170 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Mov { destination: Relative(13), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 138 }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Jump { location: 132 }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 147 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 155 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 163 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 171 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 179 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 187 }, Call { location: 1201 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Store { destination_pointer: Relative(10), source: Relative(18) }, Const { destination: Relative(19), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(8), source: Relative(18) }, Jump { location: 196 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 1172 }, Jump { location: 199 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 204 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 207 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 1149 }, Jump { location: 210 }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(12), location: 215 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 219 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 1106 }, Jump { location: 222 }, Load { destination: Relative(3), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 228 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 234 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(13), location: 245 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 250 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 262 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(19) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Const { destination: Relative(12), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(15), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(16), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(20), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(21), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(21), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Mov { destination: Relative(23), source: Relative(22) }, Store { destination_pointer: Relative(23), source: Relative(12) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(15) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(17) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(20) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Const { destination: Relative(12), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 347 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(15), location: 1036 }, Jump { location: 350 }, Load { destination: Relative(7), source_pointer: Relative(13) }, Const { destination: Relative(12), bit_size: Field, value: 2 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(12) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(21), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(20) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(13) }, Const { destination: Relative(9), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(13) }, Store { destination_pointer: Relative(23), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(23), source: Relative(16) }, Store { destination_pointer: Relative(14), source: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(22), size: Relative(23) }, scalars: HeapVector { pointer: Relative(24), size: Relative(25) }, outputs: HeapArray { pointer: Relative(26), size: 3 } }), BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, Load { destination: Relative(20), source_pointer: Relative(21) }, Load { destination: Relative(14), source_pointer: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(21), rhs: Direct(32839) }, JumpIf { condition: Relative(22), location: 409 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(22), source: Direct(32773) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Store { destination_pointer: Relative(24), source: Relative(20) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, JumpIf { condition: Relative(20), location: 420 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Direct(32839) }, JumpIf { condition: Relative(20), location: 423 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(21), location: 434 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 437 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(3) }, Store { destination_pointer: Relative(23), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 448 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 453 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(20), location: 464 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Load { destination: Relative(20), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 469 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(4) }, Store { destination_pointer: Relative(22), source: Relative(20) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(14), location: 480 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 485 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Store { destination_pointer: Relative(21), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 496 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 501 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(3) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 513 }, Call { location: 1204 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 518 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5345 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 533 }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 527 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5344 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(6), location: 993 }, Jump { location: 543 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5280 }, Mov { destination: Relative(1), source: Relative(18) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(10), location: 942 }, Jump { location: 549 }, Load { destination: Relative(4), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5344 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(10), size: 32 } }), BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(5), source: Relative(4), bit_size: Integer(U64) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 56 }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Cast { destination: Relative(10), source: Relative(5), bit_size: Integer(U64) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 48 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U64, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(6), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 572 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Cast { destination: Relative(2), source: Relative(6), bit_size: Integer(U64) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 40 }, BinaryIntOp { destination: Relative(11), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U64, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(14), location: 581 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(10), bit_size: Integer(U64) }, Const { destination: Relative(10), bit_size: Integer(U8), value: 32 }, BinaryIntOp { destination: Relative(14), op: Shl, bit_size: U64, lhs: Relative(11), rhs: Relative(10) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(11) }, JumpIf { condition: Relative(18), location: 590 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(2), source_pointer: Relative(14) }, Cast { destination: Relative(14), source: Relative(2), bit_size: Integer(U64) }, Const { destination: Relative(2), bit_size: Integer(U8), value: 24 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(14), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U64, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(11), rhs: Relative(14) }, JumpIf { condition: Relative(18), location: 599 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Cast { destination: Relative(7), source: Relative(11), bit_size: Integer(U64) }, Const { destination: Relative(11), bit_size: Integer(U8), value: 16 }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(14), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(14), rhs: Relative(7) }, JumpIf { condition: Relative(18), location: 608 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(17) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(14), bit_size: Integer(U64) }, Const { destination: Relative(14), bit_size: Integer(U8), value: 8 }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(7), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(7), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 617 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(7), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(7) }, JumpIf { condition: Relative(17), location: 624 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(9), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 637 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 646 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 655 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 664 }, Call { location: 1204 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(9) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(9), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 673 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(9), rhs: Relative(13) }, JumpIf { condition: Relative(17), location: 682 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, Load { destination: Relative(9), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(9), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(17), location: 689 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 703 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 19 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 712 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 721 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 730 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 22 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, JumpIf { condition: Relative(18), location: 739 }, Call { location: 1204 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 23 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Shl, bit_size: U64, lhs: Relative(15), rhs: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U64, lhs: Relative(13), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(13), rhs: Relative(15) }, JumpIf { condition: Relative(18), location: 748 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(17), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(17) }, JumpIf { condition: Relative(18), location: 756 }, Call { location: 1204 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 25 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(18) }, Cast { destination: Relative(13), source: Relative(15), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(15), op: Shl, bit_size: U64, lhs: Relative(13), rhs: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 26 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(18) }, Cast { destination: Relative(4), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(15), rhs: Relative(13) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 770 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 27 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(5), source: Relative(13), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(13), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(13) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 779 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 28 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(5), rhs: Relative(6) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U64, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 788 }, Call { location: 1204 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 29 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Cast { destination: Relative(5), source: Relative(6), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(6), op: Shl, bit_size: U64, lhs: Relative(5), rhs: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(6) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 797 }, Call { location: 1204 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(4), rhs: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 806 }, Call { location: 1204 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 31 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Cast { destination: Relative(2), source: Relative(5), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(5), op: Shl, bit_size: U64, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U64, lhs: Relative(4), rhs: Relative(5) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U64, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 815 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U64) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U64, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U64, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 822 }, Call { location: 1204 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(16) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, Mov { destination: Relative(1), source: Direct(32838) }, Jump { location: 898 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(6) }, JumpIf { condition: Relative(10), location: 920 }, Jump { location: 901 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Cast { destination: Relative(2), source: Relative(7), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(2), source: Relative(9), bit_size: Field }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(3), rhs: Relative(2) }, Cast { destination: Relative(2), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(1) }, Cast { destination: Relative(1), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(5) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Return, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Relative(10), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 926 }, Call { location: 1232 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 929 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(10), source: Relative(13), bit_size: Field }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(14), op: Mul, lhs: Relative(10), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Sub, lhs: Relative(3), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(13), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(14), rhs: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 898 }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Direct(32840), rhs: Relative(1) }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32839) }, JumpIf { condition: Relative(21), location: 947 }, Call { location: 1207 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(20) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(22) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 16 }, BlackBox(ToRadix { input: Relative(21), radix: Relative(4), output_pointer: Relative(22), num_limbs: Relative(23), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(20) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(21) }, JumpIf { condition: Relative(22), location: 963 }, Call { location: 1204 }, Mov { destination: Relative(10), source: Relative(18) }, Jump { location: 965 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, JumpIf { condition: Relative(20), location: 971 }, Jump { location: 968 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(10) }, Jump { location: 546 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Relative(21), rhs: Relative(20) }, JumpIf { condition: Relative(22), location: 975 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(10) }, Load { destination: Relative(22), source_pointer: Relative(24) }, Load { destination: Relative(23), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(24), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(24), location: 982 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(20) }, Store { destination_pointer: Relative(26), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(24) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32838) }, Mov { destination: Relative(10), source: Relative(20) }, Jump { location: 965 }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(21) }, Const { destination: Relative(20), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(14), radix: Relative(4), output_pointer: Relative(21), num_limbs: Relative(22), output_bits: Relative(20) }), BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(6), source: Relative(18) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(20), location: 1014 }, Jump { location: 1011 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 540 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(20) }, JumpIf { condition: Relative(21), location: 1018 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Load { destination: Relative(22), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(23), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(23), location: 1025 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5345 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(21) }, Store { destination_pointer: Relative(3), source: Relative(23) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, Mov { destination: Relative(6), source: Relative(20) }, Jump { location: 1008 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(20) }, Cast { destination: Relative(20), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(20), bit_size: Field }, BinaryFieldOp { destination: Relative(20), op: Sub, lhs: Relative(15), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(20), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Direct(32842), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(17), rhs: Relative(20) }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(15), rhs: Relative(23) }, JumpIf { condition: Relative(20), location: 1049 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(15), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 1210 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(13), source: Relative(17) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(20) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(15) }, Store { destination_pointer: Relative(27), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(20) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32838) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 1210 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(17) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(14), source: Relative(20) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(15) }, Jump { location: 347 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1112 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1120 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 1131 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(13), location: 1138 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 219 }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1154 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(13), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(14), location: 1161 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, Mov { destination: Relative(1), source: Relative(8) }, Jump { location: 207 }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1177 }, Call { location: 1204 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(12), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, JumpIf { condition: Relative(15), location: 1184 }, Call { location: 1207 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 170 }, Call { location: 1210 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, Store { destination_pointer: Relative(11), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32838) }, Mov { destination: Relative(8), source: Relative(12) }, Jump { location: 196 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 1200 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 1214 }, Jump { location: 1216 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1231 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 1228 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 1221 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 1231 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -178,11 +178,11 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { - "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = std::hash::blake3(hash_input_flattened);\n U256::from_bytes32(blake3_digest).to_u128_limbs()\n}\n", + "source": "// Tests a performance regression found in aztec-packages with brillig cow optimization\nglobal MAX_NOTE_HASHES_PER_TX: u32 = 64;\nglobal MAX_NULLIFIERS_PER_TX: u32 = 64;\nglobal MAX_L2_TO_L1_MSGS_PER_TX: u32 = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: u32 = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: u32 = 1;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: u32 = 1;\nglobal NUM_FIELDS_PER_SHA256: u32 = 2;\nglobal TX_EFFECT_HASH_INPUT_SIZE: u32 = 169;\nglobal TX_EFFECT_HASH_LOG_FIELDS: u32 = 4;\nglobal TX_EFFECT_HASH_FULL_FIELDS: u32 = 165;\n\nstruct PublicDataUpdateRequest {\n leaf_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nstruct NewContractData {\n contract_address: Field,\n portal_contract_address: Field,\n}\n\nimpl NewContractData {\n fn hash(self) -> Field {\n std::hash::pedersen_hash([self.contract_address, self.portal_contract_address])\n }\n}\n\nstruct DataToHash {\n new_note_hashes: [Field; MAX_NOTE_HASHES_PER_TX],\n new_nullifiers: [Field; MAX_NULLIFIERS_PER_TX],\n public_data_update_requests: [PublicDataUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX],\n new_l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX],\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n new_contracts: [NewContractData; MAX_NEW_CONTRACTS_PER_TX],\n}\n\nstruct U256 {\n // This is in big-endian order, typically because\n // sha256 is usually in big endian order.\n // Note: this means that inner[0] has the most significant 64 bits.\n inner: [u64; 4],\n}\n\nimpl U256 {\n pub fn from_bytes32(bytes: [u8; 32]) -> U256 {\n // We use addition rather than a bitwise OR as the bitshifts ensure that none of the bytes overlap each other.\n let high_0 = ((bytes[0] as u64) << 56)\n + ((bytes[1] as u64) << 48)\n + ((bytes[2] as u64) << 40)\n + ((bytes[3] as u64) << 32)\n + ((bytes[4] as u64) << 24)\n + ((bytes[5] as u64) << 16)\n + ((bytes[6] as u64) << 8)\n + (bytes[7] as u64);\n\n let high_1 = ((bytes[8] as u64) << 56)\n + ((bytes[9] as u64) << 48)\n + ((bytes[10] as u64) << 40)\n + ((bytes[11] as u64) << 32)\n + ((bytes[12] as u64) << 24)\n + ((bytes[13] as u64) << 16)\n + ((bytes[14] as u64) << 8)\n + (bytes[15] as u64);\n\n let low_0 = ((bytes[16] as u64) << 56)\n + ((bytes[17] as u64) << 48)\n + ((bytes[18] as u64) << 40)\n + ((bytes[19] as u64) << 32)\n + ((bytes[20] as u64) << 24)\n + ((bytes[21] as u64) << 16)\n + ((bytes[22] as u64) << 8)\n + (bytes[23] as u64);\n\n let low_1 = ((bytes[24] as u64) << 56)\n + ((bytes[25] as u64) << 48)\n + ((bytes[26] as u64) << 40)\n + ((bytes[27] as u64) << 32)\n + ((bytes[28] as u64) << 24)\n + ((bytes[29] as u64) << 16)\n + ((bytes[30] as u64) << 8)\n + (bytes[31] as u64);\n\n U256 { inner: [high_0, high_1, low_0, low_1] }\n }\n\n pub fn to_u128_limbs(self) -> [Field; 2] {\n let two_pow_64 = 2.pow_32(64);\n\n let high = (self.inner[0] as Field) * two_pow_64 + self.inner[1] as Field;\n let low = (self.inner[2] as Field) * two_pow_64 + self.inner[3] as Field;\n\n [high, low]\n }\n}\n\nunconstrained fn main(kernel_data: DataToHash) -> pub [Field; NUM_FIELDS_PER_SHA256] {\n let mut tx_effects_hash_inputs = [0; TX_EFFECT_HASH_INPUT_SIZE];\n\n let new_note_hashes = kernel_data.new_note_hashes;\n let new_nullifiers = kernel_data.new_nullifiers;\n let public_data_update_requests = kernel_data.public_data_update_requests;\n let l2ToL1Msgs = kernel_data.new_l2_to_l1_msgs;\n let encryptedLogsHash = kernel_data.encrypted_logs_hash;\n let unencryptedLogsHash = kernel_data.unencrypted_logs_hash;\n\n let mut offset = 0;\n\n for j in 0..MAX_NOTE_HASHES_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_note_hashes[j];\n }\n offset += MAX_NOTE_HASHES_PER_TX;\n\n for j in 0..MAX_NULLIFIERS_PER_TX {\n tx_effects_hash_inputs[offset + j] = new_nullifiers[j];\n }\n offset += MAX_NULLIFIERS_PER_TX;\n\n for j in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {\n tx_effects_hash_inputs[offset + j * 2] = public_data_update_requests[j].leaf_slot;\n tx_effects_hash_inputs[offset + j * 2 + 1] = public_data_update_requests[j].new_value;\n }\n offset += MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2;\n\n for j in 0..MAX_L2_TO_L1_MSGS_PER_TX {\n tx_effects_hash_inputs[offset + j] = l2ToL1Msgs[j];\n }\n offset += MAX_L2_TO_L1_MSGS_PER_TX;\n\n let contract_leaf = kernel_data.new_contracts[0];\n tx_effects_hash_inputs[offset] = contract_leaf.hash();\n\n offset += MAX_NEW_CONTRACTS_PER_TX;\n\n let new_contracts = kernel_data.new_contracts;\n tx_effects_hash_inputs[offset] = new_contracts[0].contract_address;\n\n tx_effects_hash_inputs[offset + 1] = new_contracts[0].portal_contract_address;\n\n offset += MAX_NEW_CONTRACTS_PER_TX * 2;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = encryptedLogsHash[j];\n }\n\n offset += NUM_ENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n\n for j in 0..NUM_FIELDS_PER_SHA256 {\n tx_effects_hash_inputs[offset + j] = unencryptedLogsHash[j];\n }\n\n offset += NUM_UNENCRYPTED_LOGS_HASHES_PER_TX * NUM_FIELDS_PER_SHA256;\n assert_eq(offset, TX_EFFECT_HASH_INPUT_SIZE); // Sanity check\n let mut hash_input_flattened =\n [0; TX_EFFECT_HASH_FULL_FIELDS * 32 + TX_EFFECT_HASH_LOG_FIELDS * 16];\n for offset in 0..TX_EFFECT_HASH_FULL_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_inputs[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n for log_field_index in 0..TX_EFFECT_HASH_LOG_FIELDS {\n let input_as_bytes: [u8; 16] =\n tx_effects_hash_inputs[TX_EFFECT_HASH_FULL_FIELDS + log_field_index].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[TX_EFFECT_HASH_FULL_FIELDS * 32 + log_field_index * 16 + byte_index] =\n input_as_bytes[byte_index];\n }\n }\n\n let blake2_digest = std::hash::blake2s(hash_input_flattened);\n U256::from_bytes32(blake2_digest).to_u128_limbs()\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__stdout.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__stdout.snap index 3bea7d700a9..80e3b4067e0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__stdout.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__stdout.snap @@ -2,4 +2,4 @@ source: tooling/nargo_cli/tests/execute.rs expression: stdout --- -[brillig_cow_regression] Circuit output: Vec([Field(3157822741629342915383039336162457250), Field(189770267329511434372131351844325841322)]) +[brillig_cow_regression] Circuit output: Vec([Field(325726846830326257119180493722970801006), Field(15429571951369340199663579799609180439)]) diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 619c603eb27..2a6d6a11301 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -72,7 +72,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(32841) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 388 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(13), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 354 }, Jump { location: 55 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(18), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(18) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(19), size: Relative(21) }, scalars: HeapVector { pointer: Relative(22), size: Relative(23) }, outputs: HeapArray { pointer: Relative(24), size: 3 } }), BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Load { destination: Relative(18), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(18), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 96 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(19), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 100 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 153 }, Call { location: 394 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(10), location: 284 }, Jump { location: 161 }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(8), bit_size: Field, value: 2 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Const { destination: Relative(7), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(11), source: Relative(17) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(7), size: Relative(10) }, scalars: HeapVector { pointer: Relative(11), size: Relative(12) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(7), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 219 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Relative(17) }, JumpIf { condition: Relative(4), location: 224 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Field, value: 8 }, BinaryFieldOp { destination: Relative(5), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(5), rhs: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(2), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Direct(32835), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(1), rhs: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 238 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(3) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(15) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(17) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(4), size: Relative(5) }, scalars: HeapVector { pointer: Relative(6), size: Relative(7) }, outputs: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(14) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 276 }, Call { location: 394 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(1), bit_size: Field, value: 849707701676507062560416368841861616551813265068666159965855698002224802634 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 283 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Return, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(21) }, Cast { destination: Relative(21), source: Relative(10), bit_size: Integer(U128) }, Cast { destination: Relative(19), source: Relative(21), bit_size: Field }, BinaryFieldOp { destination: Relative(21), op: Sub, lhs: Relative(10), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(21), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Direct(32835), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(19), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(10), rhs: Relative(23) }, JumpIf { condition: Relative(21), location: 297 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(21), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Store { destination_pointer: Relative(25), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(11), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(18) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Load { destination: Relative(19), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(5) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(10) }, Store { destination_pointer: Relative(27), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(5), source: Relative(21) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(17), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(16), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(17), op: Sub, lhs: Relative(15), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(17), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Direct(32835), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(19), op: Add, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(15), rhs: Relative(19) }, JumpIf { condition: Relative(17), location: 367 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, Load { destination: Relative(15), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Store { destination_pointer: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(15) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 393 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 401 }, Jump { location: 403 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 418 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 415 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 408 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 418 }, Return]" ], - "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXSVZSHCkt8kc1eGxTPGSk/rv4efxx8vv76fLr8c/hy9f/x5+XE/n8+n39/Pjw/3z6fHS//XvYcCP1A5f0t1BhygSJUXRKBYlR/EoJUqNEhYLi4XFwmJhsbBYWHJ/TXvpV7kXj1Ki1ChtLD5EkSgpikaxKGHxsHhYPCwelhKWEpYSlhKWEpYSlhKW0i3WS7eUXtpY6hBFoqQoGsWi5CgepUTpltpLG0sbokiUbmm9aBSLkqN0iwy9lqnWqbaoMnSVJIAQEkEJRsgEJxRCJbQJhGahWWgWmoVmoVloFpqFZqE5wawAISSCEoyQCU4ohEpoEyjNSrPSrDQrzUqz0qw0K81Ks9FsNBvNRrPRbDQbzQZzBlRCmyAPBCEkghKMgOHeAWmQAsAvV4ASjJAJTiiESmgTIB8BQqC50FxoLjQXmgvNyIs0AHYELFFkJkAIiaAEI2SCEwqhEmhuNDeaG82N5kZzo7nR3GhuNLfJnIaBIIREgFkARsgEJxRCJbQJEKsAISQCzAlgBJgV4IRCqASY+0aVEKsAISSCEmDOgEyA2QEwF0A3K94dsRoBsVK8F2Kl8CBWiuGIlWI4YqUYjlgFOKEQYK6ANgFiFSCERFCCETLBCdij8VAQq4A2AWIVIIREUIIRMsEJNCNxhknAaTQCzqMAISSCEoyQCU4oBJgxq8jgCMigYTKRwYBEUIIRMsEJhQAzJhwZHAEZDBBCIkCIyUT0ApyAgxS3iugF4DDFrSJ6GSsB0ctYCYhexrsjehlmRC8gE5yAW20AmPFeiB5AEb0AISSCEoyQCU4ohEqgWWgWmoVmoVloRvRyAzihECqhTYDoBQghEZRgBJoTzYlmRM8HQJsA0QsQQiIowQiZ4IRCoFlpNpqNZqPZaDaajWaj2Wg2mo3mTHOmGUFzAWSCE+DJgEqAx9FnwlMA8OChIGiOiULQCswIWkAmOAHmsV9FC4f3QtBGQNAChJAISjBCJjihEGguNFeaK82V5kpzpXlsFeX19e7Atvz78/V4RFf+rk/v3fvT/fV4eT58ubycz3eHf+7PL+Mv/Xm6v4z1+f7aX+0f+nj52WsX/jqdj6DXu7fRw/JQwf4zDu5n4Dw8fxwvK+O1Fgq01tkg7WaDoTcMg4luMeTqNHheNNiyoe8i/BR9a/At9+DI8XQPLS8ZfNlgudlkMLe3Rym+zaBLhpXVkOZHkd7NQr55NSXjUuxH7JbxZX4MqSyuxpXH0FsyPobelA2LD3JNIehvQtEb302K3rFQ0dfTouJ/WJFrd9GPjvkuNG1SWPP5gQ7b7sJsvgvLsknhaEpC4V62KXRe2W55m6Jwq+zdme5XLE7nSkB03q772bghYP0o4/imG8Zb4zTmQfaNl7xhfE5MRX63RX5ifOZ4l8UNKtW1s0a5xUmXLT3C1Faegc+J6B3K4gajKx+jDpzG+n4ZlY+ClZXoxpPiw4H5CUHlZ/D3p/5nBJzHMizeweo0Fp+zUAfZ9CTKvBy2K6zdolhdUlLnJZXKNsVNHZC23QfO6l3c1gOZ7G6Cblds6YJ83mT6Kl/aJMz2N6R59+O47VMsb/Xr/UOxuX+o2/oHzf6mWJ6I/btl3rtb5r27Zd67W+a9u6Xt3y1t/25p+3fL9SU1t0B9dW1rw2yY/0iw1LbdRZvvwoZNfzBme9v18zbDTa0I/idkZ7iwdHaFy21nuFYFt4RrXXBDuFan8bZwrStuCte64rZwbetEvvWr+4fT9cMXya9wXU/3P87H6fLXy+Xh3avP/z7xFX4R/XR9fDj+fLkeYXr7Nrr/+Kqt3JnUb/g2Epe13vWc4VLGV61f+rdX3Mx/", + "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXTldSPCTuskcx+ExRfGSVPz78P347e3n19Plx/Ovw6fPvw/frqfz+fTz6/n56fH19Hzpv/19GPAjtcOn9HDQIYpESVE0ikXJUTxKiVKjhMXCYmGxsFhYLCwWltzf0176q9yLRylRapQ2Fh+iSJQURaNYlLB4WDwsHhYPSwlLCUsJSwlLCUsJSwlL6RbrpVtKL20sdYgiUVIUjWJRchSPUqJ0S+2ljaUNUSRKt7ReNIpFyVG6RYZey1TrVFtUGbpKEkAIiaAEI2SCEwqhEtoEQrPQLDQLzUKz0Cw0C81Cs9CcYFaAEBJBCUbIBCcUQiW0CZRmpVlpVpqVZqVZaVaalWal2Wg2mo1mo9loNpqNZoM5AyqhTZAHghASQQlGQHPvgDRIAeCPK0AJRsgEJxRCJbQJkI8AIdBcaC40F5oLzYVm5EUaACsCpigyEyCERFCCETLBCYVQCTQ3mhvNjeZGc6O50dxobjQ3mttkTsNAEEIiwCwAI2SCEwqhEtoEiFWAEBIB5gQwAswKcEIhVALMfaFKiFWAEBJBCTBnQCbA7ACYC6CbFZ+OWI2AWCk+C7FSeBArRXPEStEcsVI0R6wCnFAIMFdAmwCxChBCIijBCJngBKzRuCmIVUCbALEKEEIiKMEImeAEmpE4wyBgNxoB+1GAEBJBCUbIBCcUAswYVWRwBGTQMJjIYEAiKMEImeCEQoAZA44MjoAMBgghESDEYCJ6AU7ARoquInoB2EzRVUQvYyYgehkzAdHL+HREL8OM6AVkghPQ1QaAGZ+F6AEU0QsQQiIowQiZ4IRCqASahWahWWgWmoVmRC83gBMKoRLaBIhegBASQQlGoDnRnGhG9HwAtAkQvQAhJIISjJAJTigEmpVmo9loNpqNZqPZaDaajWaj2WjONGeaETQXQCY4AZ4MqAR4HOdMeAoAHtwUBM0xUAhagRlBC8gEJ8A8nldxhMNnIWgjIGgBQkgEJRghE5xQCDQXmivNleZKc6W50jweFeX9/eHAY/nX1+vxiFP5h3N6P72/PF6Pl9fDp8vb+fxw+Ofx/Db+0a+Xx8tYXx+v/d1+0cfL91678MfpfAS9P9xaD8tNBevP2LjvgXPz/Gd7WWlfsQaEoGafDdLuN9RhNlTZYOj7sE2GvqcuGmzZoFl5FX0W2pY+CLbQqQ+uSwZfNlj/4MlgbrdbKb7NoEuGYfUqeBHJl2bDWnvjrexb7Jb2hYPYl8bF2bh2G/LtNuRUF2/kmsIHRqLv5mmTosisKHVYVPyFGbnai9bYizoMmxTN52S1sq0XbZh70aRtUfRt2zkW/eFtm2IYZoXoNoXJrGiyX7E4nCsB0Xm57nvjhoD1rYztm25ob40LRB5kX3vJG9rf4p0/LJH/o31me5fFBSrVld2qtcrpPKTFuZjayhjInAjrj/xLCl25jDpwGOuHdVrKn4KVmejGXHvWTYLKmey1bhMwkGVY7MHqMCZlF6w/SW26Eynl3Qop9yhWp1T12xksb1HceQLStnvDWe3FfWcgk92HoPsVW05BPl+G18VFzmz/gTTvvh33XcXyUr+6c1ebT4M1bzs/1GQ3xfJA7F8t897VMu9dLfPe1TLvXS1t/2pp+1dL279ark8pkXlKJdmmmB8z+v+1yjaF33pRNj0wDvOhth8kthjuPIrgPyE7w+W6M1xuO8O1KrgnXOuCO8K1Ooz3hWtdcVe41hX3hWvbSeRLf/X4dLr+8UXyO1zX0+O383F6+ePt8vTh3dd/X/gOv4h+uT4/Hb+/XY8w3b6N7j8+aysPJvULvo3Ey1of+mMKXsr4rvWX/uUdnfkP", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -83,7 +83,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_0.snap index 619c603eb27..2a6d6a11301 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_0.snap @@ -72,7 +72,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(32841) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 388 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(13), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 354 }, Jump { location: 55 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(18), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(18) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(19), size: Relative(21) }, scalars: HeapVector { pointer: Relative(22), size: Relative(23) }, outputs: HeapArray { pointer: Relative(24), size: 3 } }), BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Load { destination: Relative(18), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(18), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 96 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(19), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 100 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 153 }, Call { location: 394 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(10), location: 284 }, Jump { location: 161 }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(8), bit_size: Field, value: 2 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Const { destination: Relative(7), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(11), source: Relative(17) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(7), size: Relative(10) }, scalars: HeapVector { pointer: Relative(11), size: Relative(12) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(7), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 219 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Relative(17) }, JumpIf { condition: Relative(4), location: 224 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Field, value: 8 }, BinaryFieldOp { destination: Relative(5), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(5), rhs: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(2), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Direct(32835), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(1), rhs: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 238 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(3) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(15) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(17) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(4), size: Relative(5) }, scalars: HeapVector { pointer: Relative(6), size: Relative(7) }, outputs: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(14) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 276 }, Call { location: 394 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(1), bit_size: Field, value: 849707701676507062560416368841861616551813265068666159965855698002224802634 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 283 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Return, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(21) }, Cast { destination: Relative(21), source: Relative(10), bit_size: Integer(U128) }, Cast { destination: Relative(19), source: Relative(21), bit_size: Field }, BinaryFieldOp { destination: Relative(21), op: Sub, lhs: Relative(10), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(21), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Direct(32835), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(19), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(10), rhs: Relative(23) }, JumpIf { condition: Relative(21), location: 297 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(21), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Store { destination_pointer: Relative(25), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(11), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(18) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Load { destination: Relative(19), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(5) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(10) }, Store { destination_pointer: Relative(27), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(5), source: Relative(21) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(17), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(16), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(17), op: Sub, lhs: Relative(15), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(17), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Direct(32835), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(19), op: Add, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(15), rhs: Relative(19) }, JumpIf { condition: Relative(17), location: 367 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, Load { destination: Relative(15), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Store { destination_pointer: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(15) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 393 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 401 }, Jump { location: 403 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 418 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 415 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 408 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 418 }, Return]" ], - "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXSVZSHCkt8kc1eGxTPGSk/rv4efxx8vv76fLr8c/hy9f/x5+XE/n8+n39/Pjw/3z6fHS//XvYcCP1A5f0t1BhygSJUXRKBYlR/EoJUqNEhYLi4XFwmJhsbBYWHJ/TXvpV7kXj1Ki1ChtLD5EkSgpikaxKGHxsHhYPCwelhKWEpYSlhKWEpYSlhKW0i3WS7eUXtpY6hBFoqQoGsWi5CgepUTpltpLG0sbokiUbmm9aBSLkqN0iwy9lqnWqbaoMnSVJIAQEkEJRsgEJxRCJbQJhGahWWgWmoVmoVloFpqFZqE5wawAISSCEoyQCU4ohEpoEyjNSrPSrDQrzUqz0qw0K81Ks9FsNBvNRrPRbDQbzQZzBlRCmyAPBCEkghKMgOHeAWmQAsAvV4ASjJAJTiiESmgTIB8BQqC50FxoLjQXmgvNyIs0AHYELFFkJkAIiaAEI2SCEwqhEmhuNDeaG82N5kZzo7nR3GhuNLfJnIaBIIREgFkARsgEJxRCJbQJEKsAISQCzAlgBJgV4IRCqASY+0aVEKsAISSCEmDOgEyA2QEwF0A3K94dsRoBsVK8F2Kl8CBWiuGIlWI4YqUYjlgFOKEQYK6ANgFiFSCERFCCETLBCdij8VAQq4A2AWIVIIREUIIRMsEJNCNxhknAaTQCzqMAISSCEoyQCU4oBJgxq8jgCMigYTKRwYBEUIIRMsEJhQAzJhwZHAEZDBBCIkCIyUT0ApyAgxS3iugF4DDFrSJ6GSsB0ctYCYhexrsjehlmRC8gE5yAW20AmPFeiB5AEb0AISSCEoyQCU4ohEqgWWgWmoVmoVloRvRyAzihECqhTYDoBQghEZRgBJoTzYlmRM8HQJsA0QsQQiIowQiZ4IRCoFlpNpqNZqPZaDaajWaj2Wg2mo3mTHOmGUFzAWSCE+DJgEqAx9FnwlMA8OChIGiOiULQCswIWkAmOAHmsV9FC4f3QtBGQNAChJAISjBCJjihEGguNFeaK82V5kpzpXlsFeX19e7Atvz78/V4RFf+rk/v3fvT/fV4eT58ubycz3eHf+7PL+Mv/Xm6v4z1+f7aX+0f+nj52WsX/jqdj6DXu7fRw/JQwf4zDu5n4Dw8fxwvK+O1Fgq01tkg7WaDoTcMg4luMeTqNHheNNiyoe8i/BR9a/At9+DI8XQPLS8ZfNlgudlkMLe3Rym+zaBLhpXVkOZHkd7NQr55NSXjUuxH7JbxZX4MqSyuxpXH0FsyPobelA2LD3JNIehvQtEb302K3rFQ0dfTouJ/WJFrd9GPjvkuNG1SWPP5gQ7b7sJsvgvLsknhaEpC4V62KXRe2W55m6Jwq+zdme5XLE7nSkB03q772bghYP0o4/imG8Zb4zTmQfaNl7xhfE5MRX63RX5ifOZ4l8UNKtW1s0a5xUmXLT3C1Faegc+J6B3K4gajKx+jDpzG+n4ZlY+ClZXoxpPiw4H5CUHlZ/D3p/5nBJzHMizeweo0Fp+zUAfZ9CTKvBy2K6zdolhdUlLnJZXKNsVNHZC23QfO6l3c1gOZ7G6Cblds6YJ83mT6Kl/aJMz2N6R59+O47VMsb/Xr/UOxuX+o2/oHzf6mWJ6I/btl3rtb5r27Zd67W+a9u6Xt3y1t/25p+3fL9SU1t0B9dW1rw2yY/0iw1LbdRZvvwoZNfzBme9v18zbDTa0I/idkZ7iwdHaFy21nuFYFt4RrXXBDuFan8bZwrStuCte64rZwbetEvvWr+4fT9cMXya9wXU/3P87H6fLXy+Xh3avP/z7xFX4R/XR9fDj+fLkeYXr7Nrr/+Kqt3JnUb/g2Epe13vWc4VLGV61f+rdX3Mx/", + "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXTldSPCTuskcx+ExRfGSVPz78P347e3n19Plx/Ovw6fPvw/frqfz+fTz6/n56fH19Hzpv/19GPAjtcOn9HDQIYpESVE0ikXJUTxKiVKjhMXCYmGxsFhYLCwWltzf0176q9yLRylRapQ2Fh+iSJQURaNYlLB4WDwsHhYPSwlLCUsJSwlLCUsJSwlL6RbrpVtKL20sdYgiUVIUjWJRchSPUqJ0S+2ljaUNUSRKt7ReNIpFyVG6RYZey1TrVFtUGbpKEkAIiaAEI2SCEwqhEtoEQrPQLDQLzUKz0Cw0C81Cs9CcYFaAEBJBCUbIBCcUQiW0CZRmpVlpVpqVZqVZaVaalWal2Wg2mo1mo9loNpqNZoM5AyqhTZAHghASQQlGQHPvgDRIAeCPK0AJRsgEJxRCJbQJkI8AIdBcaC40F5oLzYVm5EUaACsCpigyEyCERFCCETLBCYVQCTQ3mhvNjeZGc6O50dxobjQ3mttkTsNAEEIiwCwAI2SCEwqhEtoEiFWAEBIB5gQwAswKcEIhVALMfaFKiFWAEBJBCTBnQCbA7ACYC6CbFZ+OWI2AWCk+C7FSeBArRXPEStEcsVI0R6wCnFAIMFdAmwCxChBCIijBCJngBKzRuCmIVUCbALEKEEIiKMEImeAEmpE4wyBgNxoB+1GAEBJBCUbIBCcUAswYVWRwBGTQMJjIYEAiKMEImeCEQoAZA44MjoAMBgghESDEYCJ6AU7ARoquInoB2EzRVUQvYyYgehkzAdHL+HREL8OM6AVkghPQ1QaAGZ+F6AEU0QsQQiIowQiZ4IRCqASahWahWWgWmoVmRC83gBMKoRLaBIhegBASQQlGoDnRnGhG9HwAtAkQvQAhJIISjJAJTigEmpVmo9loNpqNZqPZaDaajWaj2WjONGeaETQXQCY4AZ4MqAR4HOdMeAoAHtwUBM0xUAhagRlBC8gEJ8A8nldxhMNnIWgjIGgBQkgEJRghE5xQCDQXmivNleZKc6W50jweFeX9/eHAY/nX1+vxiFP5h3N6P72/PF6Pl9fDp8vb+fxw+Ofx/Db+0a+Xx8tYXx+v/d1+0cfL91678MfpfAS9P9xaD8tNBevP2LjvgXPz/Gd7WWlfsQaEoGafDdLuN9RhNlTZYOj7sE2GvqcuGmzZoFl5FX0W2pY+CLbQqQ+uSwZfNlj/4MlgbrdbKb7NoEuGYfUqeBHJl2bDWnvjrexb7Jb2hYPYl8bF2bh2G/LtNuRUF2/kmsIHRqLv5mmTosisKHVYVPyFGbnai9bYizoMmxTN52S1sq0XbZh70aRtUfRt2zkW/eFtm2IYZoXoNoXJrGiyX7E4nCsB0Xm57nvjhoD1rYztm25ob40LRB5kX3vJG9rf4p0/LJH/o31me5fFBSrVld2qtcrpPKTFuZjayhjInAjrj/xLCl25jDpwGOuHdVrKn4KVmejGXHvWTYLKmey1bhMwkGVY7MHqMCZlF6w/SW26Eynl3Qop9yhWp1T12xksb1HceQLStnvDWe3FfWcgk92HoPsVW05BPl+G18VFzmz/gTTvvh33XcXyUr+6c1ebT4M1bzs/1GQ3xfJA7F8t897VMu9dLfPe1TLvXS1t/2pp+1dL279ark8pkXlKJdmmmB8z+v+1yjaF33pRNj0wDvOhth8kthjuPIrgPyE7w+W6M1xuO8O1KrgnXOuCO8K1Ooz3hWtdcVe41hX3hWvbSeRLf/X4dLr+8UXyO1zX0+O383F6+ePt8vTh3dd/X/gOv4h+uT4/Hb+/XY8w3b6N7j8+aysPJvULvo3Ey1of+mMKXsr4rvWX/uUdnfkP", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -83,7 +83,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 619c603eb27..2a6d6a11301 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -72,7 +72,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(32841) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 388 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(13), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 354 }, Jump { location: 55 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(18), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(18) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(19), size: Relative(21) }, scalars: HeapVector { pointer: Relative(22), size: Relative(23) }, outputs: HeapArray { pointer: Relative(24), size: 3 } }), BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Load { destination: Relative(18), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(18), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 96 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(19), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 100 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 153 }, Call { location: 394 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(10), location: 284 }, Jump { location: 161 }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(8), bit_size: Field, value: 2 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Const { destination: Relative(7), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(11), source: Relative(17) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(7), size: Relative(10) }, scalars: HeapVector { pointer: Relative(11), size: Relative(12) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(7), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 219 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Relative(17) }, JumpIf { condition: Relative(4), location: 224 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Field, value: 8 }, BinaryFieldOp { destination: Relative(5), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(5), rhs: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(2), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Direct(32835), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(1), rhs: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 238 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(3) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(15) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(17) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(4), size: Relative(5) }, scalars: HeapVector { pointer: Relative(6), size: Relative(7) }, outputs: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(14) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 276 }, Call { location: 394 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(1), bit_size: Field, value: 849707701676507062560416368841861616551813265068666159965855698002224802634 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 283 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Return, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(21) }, Cast { destination: Relative(21), source: Relative(10), bit_size: Integer(U128) }, Cast { destination: Relative(19), source: Relative(21), bit_size: Field }, BinaryFieldOp { destination: Relative(21), op: Sub, lhs: Relative(10), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(21), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Direct(32835), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(19), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(10), rhs: Relative(23) }, JumpIf { condition: Relative(21), location: 297 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(21), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Store { destination_pointer: Relative(25), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(11), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(18) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Load { destination: Relative(19), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(5) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(10) }, Store { destination_pointer: Relative(27), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(5), source: Relative(21) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(17), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(16), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(17), op: Sub, lhs: Relative(15), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(17), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Direct(32835), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(19), op: Add, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(15), rhs: Relative(19) }, JumpIf { condition: Relative(17), location: 367 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, Load { destination: Relative(15), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Store { destination_pointer: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(15) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 393 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 401 }, Jump { location: 403 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 418 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 415 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 408 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 418 }, Return]" ], - "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXSVZSHCkt8kc1eGxTPGSk/rv4efxx8vv76fLr8c/hy9f/x5+XE/n8+n39/Pjw/3z6fHS//XvYcCP1A5f0t1BhygSJUXRKBYlR/EoJUqNEhYLi4XFwmJhsbBYWHJ/TXvpV7kXj1Ki1ChtLD5EkSgpikaxKGHxsHhYPCwelhKWEpYSlhKWEpYSlhKW0i3WS7eUXtpY6hBFoqQoGsWi5CgepUTpltpLG0sbokiUbmm9aBSLkqN0iwy9lqnWqbaoMnSVJIAQEkEJRsgEJxRCJbQJhGahWWgWmoVmoVloFpqFZqE5wawAISSCEoyQCU4ohEpoEyjNSrPSrDQrzUqz0qw0K81Ks9FsNBvNRrPRbDQbzQZzBlRCmyAPBCEkghKMgOHeAWmQAsAvV4ASjJAJTiiESmgTIB8BQqC50FxoLjQXmgvNyIs0AHYELFFkJkAIiaAEI2SCEwqhEmhuNDeaG82N5kZzo7nR3GhuNLfJnIaBIIREgFkARsgEJxRCJbQJEKsAISQCzAlgBJgV4IRCqASY+0aVEKsAISSCEmDOgEyA2QEwF0A3K94dsRoBsVK8F2Kl8CBWiuGIlWI4YqUYjlgFOKEQYK6ANgFiFSCERFCCETLBCdij8VAQq4A2AWIVIIREUIIRMsEJNCNxhknAaTQCzqMAISSCEoyQCU4oBJgxq8jgCMigYTKRwYBEUIIRMsEJhQAzJhwZHAEZDBBCIkCIyUT0ApyAgxS3iugF4DDFrSJ6GSsB0ctYCYhexrsjehlmRC8gE5yAW20AmPFeiB5AEb0AISSCEoyQCU4ohEqgWWgWmoVmoVloRvRyAzihECqhTYDoBQghEZRgBJoTzYlmRM8HQJsA0QsQQiIowQiZ4IRCoFlpNpqNZqPZaDaajWaj2Wg2mo3mTHOmGUFzAWSCE+DJgEqAx9FnwlMA8OChIGiOiULQCswIWkAmOAHmsV9FC4f3QtBGQNAChJAISjBCJjihEGguNFeaK82V5kpzpXlsFeX19e7Atvz78/V4RFf+rk/v3fvT/fV4eT58ubycz3eHf+7PL+Mv/Xm6v4z1+f7aX+0f+nj52WsX/jqdj6DXu7fRw/JQwf4zDu5n4Dw8fxwvK+O1Fgq01tkg7WaDoTcMg4luMeTqNHheNNiyoe8i/BR9a/At9+DI8XQPLS8ZfNlgudlkMLe3Rym+zaBLhpXVkOZHkd7NQr55NSXjUuxH7JbxZX4MqSyuxpXH0FsyPobelA2LD3JNIehvQtEb302K3rFQ0dfTouJ/WJFrd9GPjvkuNG1SWPP5gQ7b7sJsvgvLsknhaEpC4V62KXRe2W55m6Jwq+zdme5XLE7nSkB03q772bghYP0o4/imG8Zb4zTmQfaNl7xhfE5MRX63RX5ifOZ4l8UNKtW1s0a5xUmXLT3C1Faegc+J6B3K4gajKx+jDpzG+n4ZlY+ClZXoxpPiw4H5CUHlZ/D3p/5nBJzHMizeweo0Fp+zUAfZ9CTKvBy2K6zdolhdUlLnJZXKNsVNHZC23QfO6l3c1gOZ7G6Cblds6YJ83mT6Kl/aJMz2N6R59+O47VMsb/Xr/UOxuX+o2/oHzf6mWJ6I/btl3rtb5r27Zd67W+a9u6Xt3y1t/25p+3fL9SU1t0B9dW1rw2yY/0iw1LbdRZvvwoZNfzBme9v18zbDTa0I/idkZ7iwdHaFy21nuFYFt4RrXXBDuFan8bZwrStuCte64rZwbetEvvWr+4fT9cMXya9wXU/3P87H6fLXy+Xh3avP/z7xFX4R/XR9fDj+fLkeYXr7Nrr/+Kqt3JnUb/g2Epe13vWc4VLGV61f+rdX3Mx/", + "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXTldSPCTuskcx+ExRfGSVPz78P347e3n19Plx/Ovw6fPvw/frqfz+fTz6/n56fH19Hzpv/19GPAjtcOn9HDQIYpESVE0ikXJUTxKiVKjhMXCYmGxsFhYLCwWltzf0176q9yLRylRapQ2Fh+iSJQURaNYlLB4WDwsHhYPSwlLCUsJSwlLCUsJSwlL6RbrpVtKL20sdYgiUVIUjWJRchSPUqJ0S+2ljaUNUSRKt7ReNIpFyVG6RYZey1TrVFtUGbpKEkAIiaAEI2SCEwqhEtoEQrPQLDQLzUKz0Cw0C81Cs9CcYFaAEBJBCUbIBCcUQiW0CZRmpVlpVpqVZqVZaVaalWal2Wg2mo1mo9loNpqNZoM5AyqhTZAHghASQQlGQHPvgDRIAeCPK0AJRsgEJxRCJbQJkI8AIdBcaC40F5oLzYVm5EUaACsCpigyEyCERFCCETLBCYVQCTQ3mhvNjeZGc6O50dxobjQ3mttkTsNAEEIiwCwAI2SCEwqhEtoEiFWAEBIB5gQwAswKcEIhVALMfaFKiFWAEBJBCTBnQCbA7ACYC6CbFZ+OWI2AWCk+C7FSeBArRXPEStEcsVI0R6wCnFAIMFdAmwCxChBCIijBCJngBKzRuCmIVUCbALEKEEIiKMEImeAEmpE4wyBgNxoB+1GAEBJBCUbIBCcUAswYVWRwBGTQMJjIYEAiKMEImeCEQoAZA44MjoAMBgghESDEYCJ6AU7ARoquInoB2EzRVUQvYyYgehkzAdHL+HREL8OM6AVkghPQ1QaAGZ+F6AEU0QsQQiIowQiZ4IRCqASahWahWWgWmoVmRC83gBMKoRLaBIhegBASQQlGoDnRnGhG9HwAtAkQvQAhJIISjJAJTigEmpVmo9loNpqNZqPZaDaajWaj2WjONGeaETQXQCY4AZ4MqAR4HOdMeAoAHtwUBM0xUAhagRlBC8gEJ8A8nldxhMNnIWgjIGgBQkgEJRghE5xQCDQXmivNleZKc6W50jweFeX9/eHAY/nX1+vxiFP5h3N6P72/PF6Pl9fDp8vb+fxw+Ofx/Db+0a+Xx8tYXx+v/d1+0cfL91678MfpfAS9P9xaD8tNBevP2LjvgXPz/Gd7WWlfsQaEoGafDdLuN9RhNlTZYOj7sE2GvqcuGmzZoFl5FX0W2pY+CLbQqQ+uSwZfNlj/4MlgbrdbKb7NoEuGYfUqeBHJl2bDWnvjrexb7Jb2hYPYl8bF2bh2G/LtNuRUF2/kmsIHRqLv5mmTosisKHVYVPyFGbnai9bYizoMmxTN52S1sq0XbZh70aRtUfRt2zkW/eFtm2IYZoXoNoXJrGiyX7E4nCsB0Xm57nvjhoD1rYztm25ob40LRB5kX3vJG9rf4p0/LJH/o31me5fFBSrVld2qtcrpPKTFuZjayhjInAjrj/xLCl25jDpwGOuHdVrKn4KVmejGXHvWTYLKmey1bhMwkGVY7MHqMCZlF6w/SW26Eynl3Qop9yhWp1T12xksb1HceQLStnvDWe3FfWcgk92HoPsVW05BPl+G18VFzmz/gTTvvh33XcXyUr+6c1ebT4M1bzs/1GQ3xfJA7F8t897VMu9dLfPe1TLvXS1t/2pp+1dL279ark8pkXlKJdmmmB8z+v+1yjaF33pRNj0wDvOhth8kthjuPIrgPyE7w+W6M1xuO8O1KrgnXOuCO8K1Ooz3hWtdcVe41hX3hWvbSeRLf/X4dLr+8UXyO1zX0+O383F6+ePt8vTh3dd/X/gOv4h+uT4/Hb+/XY8w3b6N7j8+aysPJvULvo3Ey1of+mMKXsr4rvWX/uUdnfkP", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -83,7 +83,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 619c603eb27..2a6d6a11301 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -72,7 +72,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(32841) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 388 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(13), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 354 }, Jump { location: 55 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(18), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(18) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(19), size: Relative(21) }, scalars: HeapVector { pointer: Relative(22), size: Relative(23) }, outputs: HeapArray { pointer: Relative(24), size: 3 } }), BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Load { destination: Relative(18), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(18), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 96 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(19), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 100 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 153 }, Call { location: 394 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(10), location: 284 }, Jump { location: 161 }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(8), bit_size: Field, value: 2 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Const { destination: Relative(7), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(11), source: Relative(17) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(7), size: Relative(10) }, scalars: HeapVector { pointer: Relative(11), size: Relative(12) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(7), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 219 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Relative(17) }, JumpIf { condition: Relative(4), location: 224 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Field, value: 8 }, BinaryFieldOp { destination: Relative(5), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(5), rhs: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(2), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Direct(32835), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(1), rhs: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 238 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(3) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(15) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(17) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(4), size: Relative(5) }, scalars: HeapVector { pointer: Relative(6), size: Relative(7) }, outputs: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(14) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 276 }, Call { location: 394 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(1), bit_size: Field, value: 849707701676507062560416368841861616551813265068666159965855698002224802634 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 283 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Return, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(21) }, Cast { destination: Relative(21), source: Relative(10), bit_size: Integer(U128) }, Cast { destination: Relative(19), source: Relative(21), bit_size: Field }, BinaryFieldOp { destination: Relative(21), op: Sub, lhs: Relative(10), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(21), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Direct(32835), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(19), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(10), rhs: Relative(23) }, JumpIf { condition: Relative(21), location: 297 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(21), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Store { destination_pointer: Relative(25), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(11), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(18) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Load { destination: Relative(19), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(5) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(10) }, Store { destination_pointer: Relative(27), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(5), source: Relative(21) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(17), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(16), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(17), op: Sub, lhs: Relative(15), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(17), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Direct(32835), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(19), op: Add, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(15), rhs: Relative(19) }, JumpIf { condition: Relative(17), location: 367 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, Load { destination: Relative(15), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Store { destination_pointer: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(15) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 393 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 401 }, Jump { location: 403 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 418 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 415 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 408 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 418 }, Return]" ], - "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXSVZSHCkt8kc1eGxTPGSk/rv4efxx8vv76fLr8c/hy9f/x5+XE/n8+n39/Pjw/3z6fHS//XvYcCP1A5f0t1BhygSJUXRKBYlR/EoJUqNEhYLi4XFwmJhsbBYWHJ/TXvpV7kXj1Ki1ChtLD5EkSgpikaxKGHxsHhYPCwelhKWEpYSlhKWEpYSlhKW0i3WS7eUXtpY6hBFoqQoGsWi5CgepUTpltpLG0sbokiUbmm9aBSLkqN0iwy9lqnWqbaoMnSVJIAQEkEJRsgEJxRCJbQJhGahWWgWmoVmoVloFpqFZqE5wawAISSCEoyQCU4ohEpoEyjNSrPSrDQrzUqz0qw0K81Ks9FsNBvNRrPRbDQbzQZzBlRCmyAPBCEkghKMgOHeAWmQAsAvV4ASjJAJTiiESmgTIB8BQqC50FxoLjQXmgvNyIs0AHYELFFkJkAIiaAEI2SCEwqhEmhuNDeaG82N5kZzo7nR3GhuNLfJnIaBIIREgFkARsgEJxRCJbQJEKsAISQCzAlgBJgV4IRCqASY+0aVEKsAISSCEmDOgEyA2QEwF0A3K94dsRoBsVK8F2Kl8CBWiuGIlWI4YqUYjlgFOKEQYK6ANgFiFSCERFCCETLBCdij8VAQq4A2AWIVIIREUIIRMsEJNCNxhknAaTQCzqMAISSCEoyQCU4oBJgxq8jgCMigYTKRwYBEUIIRMsEJhQAzJhwZHAEZDBBCIkCIyUT0ApyAgxS3iugF4DDFrSJ6GSsB0ctYCYhexrsjehlmRC8gE5yAW20AmPFeiB5AEb0AISSCEoyQCU4ohEqgWWgWmoVmoVloRvRyAzihECqhTYDoBQghEZRgBJoTzYlmRM8HQJsA0QsQQiIowQiZ4IRCoFlpNpqNZqPZaDaajWaj2Wg2mo3mTHOmGUFzAWSCE+DJgEqAx9FnwlMA8OChIGiOiULQCswIWkAmOAHmsV9FC4f3QtBGQNAChJAISjBCJjihEGguNFeaK82V5kpzpXlsFeX19e7Atvz78/V4RFf+rk/v3fvT/fV4eT58ubycz3eHf+7PL+Mv/Xm6v4z1+f7aX+0f+nj52WsX/jqdj6DXu7fRw/JQwf4zDu5n4Dw8fxwvK+O1Fgq01tkg7WaDoTcMg4luMeTqNHheNNiyoe8i/BR9a/At9+DI8XQPLS8ZfNlgudlkMLe3Rym+zaBLhpXVkOZHkd7NQr55NSXjUuxH7JbxZX4MqSyuxpXH0FsyPobelA2LD3JNIehvQtEb302K3rFQ0dfTouJ/WJFrd9GPjvkuNG1SWPP5gQ7b7sJsvgvLsknhaEpC4V62KXRe2W55m6Jwq+zdme5XLE7nSkB03q772bghYP0o4/imG8Zb4zTmQfaNl7xhfE5MRX63RX5ifOZ4l8UNKtW1s0a5xUmXLT3C1Faegc+J6B3K4gajKx+jDpzG+n4ZlY+ClZXoxpPiw4H5CUHlZ/D3p/5nBJzHMizeweo0Fp+zUAfZ9CTKvBy2K6zdolhdUlLnJZXKNsVNHZC23QfO6l3c1gOZ7G6Cblds6YJ83mT6Kl/aJMz2N6R59+O47VMsb/Xr/UOxuX+o2/oHzf6mWJ6I/btl3rtb5r27Zd67W+a9u6Xt3y1t/25p+3fL9SU1t0B9dW1rw2yY/0iw1LbdRZvvwoZNfzBme9v18zbDTa0I/idkZ7iwdHaFy21nuFYFt4RrXXBDuFan8bZwrStuCte64rZwbetEvvWr+4fT9cMXya9wXU/3P87H6fLXy+Xh3avP/z7xFX4R/XR9fDj+fLkeYXr7Nrr/+Kqt3JnUb/g2Epe13vWc4VLGV61f+rdX3Mx/", + "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXTldSPCTuskcx+ExRfGSVPz78P347e3n19Plx/Ovw6fPvw/frqfz+fTz6/n56fH19Hzpv/19GPAjtcOn9HDQIYpESVE0ikXJUTxKiVKjhMXCYmGxsFhYLCwWltzf0176q9yLRylRapQ2Fh+iSJQURaNYlLB4WDwsHhYPSwlLCUsJSwlLCUsJSwlL6RbrpVtKL20sdYgiUVIUjWJRchSPUqJ0S+2ljaUNUSRKt7ReNIpFyVG6RYZey1TrVFtUGbpKEkAIiaAEI2SCEwqhEtoEQrPQLDQLzUKz0Cw0C81Cs9CcYFaAEBJBCUbIBCcUQiW0CZRmpVlpVpqVZqVZaVaalWal2Wg2mo1mo9loNpqNZoM5AyqhTZAHghASQQlGQHPvgDRIAeCPK0AJRsgEJxRCJbQJkI8AIdBcaC40F5oLzYVm5EUaACsCpigyEyCERFCCETLBCYVQCTQ3mhvNjeZGc6O50dxobjQ3mttkTsNAEEIiwCwAI2SCEwqhEtoEiFWAEBIB5gQwAswKcEIhVALMfaFKiFWAEBJBCTBnQCbA7ACYC6CbFZ+OWI2AWCk+C7FSeBArRXPEStEcsVI0R6wCnFAIMFdAmwCxChBCIijBCJngBKzRuCmIVUCbALEKEEIiKMEImeAEmpE4wyBgNxoB+1GAEBJBCUbIBCcUAswYVWRwBGTQMJjIYEAiKMEImeCEQoAZA44MjoAMBgghESDEYCJ6AU7ARoquInoB2EzRVUQvYyYgehkzAdHL+HREL8OM6AVkghPQ1QaAGZ+F6AEU0QsQQiIowQiZ4IRCqASahWahWWgWmoVmRC83gBMKoRLaBIhegBASQQlGoDnRnGhG9HwAtAkQvQAhJIISjJAJTigEmpVmo9loNpqNZqPZaDaajWaj2WjONGeaETQXQCY4AZ4MqAR4HOdMeAoAHtwUBM0xUAhagRlBC8gEJ8A8nldxhMNnIWgjIGgBQkgEJRghE5xQCDQXmivNleZKc6W50jweFeX9/eHAY/nX1+vxiFP5h3N6P72/PF6Pl9fDp8vb+fxw+Ofx/Db+0a+Xx8tYXx+v/d1+0cfL91678MfpfAS9P9xaD8tNBevP2LjvgXPz/Gd7WWlfsQaEoGafDdLuN9RhNlTZYOj7sE2GvqcuGmzZoFl5FX0W2pY+CLbQqQ+uSwZfNlj/4MlgbrdbKb7NoEuGYfUqeBHJl2bDWnvjrexb7Jb2hYPYl8bF2bh2G/LtNuRUF2/kmsIHRqLv5mmTosisKHVYVPyFGbnai9bYizoMmxTN52S1sq0XbZh70aRtUfRt2zkW/eFtm2IYZoXoNoXJrGiyX7E4nCsB0Xm57nvjhoD1rYztm25ob40LRB5kX3vJG9rf4p0/LJH/o31me5fFBSrVld2qtcrpPKTFuZjayhjInAjrj/xLCl25jDpwGOuHdVrKn4KVmejGXHvWTYLKmey1bhMwkGVY7MHqMCZlF6w/SW26Eynl3Qop9yhWp1T12xksb1HceQLStnvDWe3FfWcgk92HoPsVW05BPl+G18VFzmz/gTTvvh33XcXyUr+6c1ebT4M1bzs/1GQ3xfJA7F8t897VMu9dLfPe1TLvXS1t/2pp+1dL279ark8pkXlKJdmmmB8z+v+1yjaF33pRNj0wDvOhth8kthjuPIrgPyE7w+W6M1xuO8O1KrgnXOuCO8K1Ooz3hWtdcVe41hX3hWvbSeRLf/X4dLr+8UXyO1zX0+O383F6+ePt8vTh3dd/X/gOv4h+uT4/Hb+/XY8w3b6N7j8+aysPJvULvo3Ey1of+mMKXsr4rvWX/uUdnfkP", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -83,7 +83,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_0.snap index 619c603eb27..2a6d6a11301 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_0.snap @@ -72,7 +72,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(32841) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 388 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(13), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 354 }, Jump { location: 55 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(18), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(18) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(19), size: Relative(21) }, scalars: HeapVector { pointer: Relative(22), size: Relative(23) }, outputs: HeapArray { pointer: Relative(24), size: 3 } }), BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Load { destination: Relative(18), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(18), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 96 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(19), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 100 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 153 }, Call { location: 394 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(10), location: 284 }, Jump { location: 161 }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(8), bit_size: Field, value: 2 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Const { destination: Relative(7), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(11), source: Relative(17) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(7), size: Relative(10) }, scalars: HeapVector { pointer: Relative(11), size: Relative(12) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(7), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 219 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Relative(17) }, JumpIf { condition: Relative(4), location: 224 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Field, value: 8 }, BinaryFieldOp { destination: Relative(5), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(5), rhs: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(2), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Direct(32835), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(1), rhs: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 238 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(3) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(15) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(17) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(4), size: Relative(5) }, scalars: HeapVector { pointer: Relative(6), size: Relative(7) }, outputs: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(14) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 276 }, Call { location: 394 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(1), bit_size: Field, value: 849707701676507062560416368841861616551813265068666159965855698002224802634 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 283 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Return, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(21) }, Cast { destination: Relative(21), source: Relative(10), bit_size: Integer(U128) }, Cast { destination: Relative(19), source: Relative(21), bit_size: Field }, BinaryFieldOp { destination: Relative(21), op: Sub, lhs: Relative(10), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(21), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Direct(32835), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(19), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(10), rhs: Relative(23) }, JumpIf { condition: Relative(21), location: 297 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(21), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Store { destination_pointer: Relative(25), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(11), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(18) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Load { destination: Relative(19), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(5) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(10) }, Store { destination_pointer: Relative(27), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(5), source: Relative(21) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(17), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(16), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(17), op: Sub, lhs: Relative(15), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(17), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Direct(32835), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(19), op: Add, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(15), rhs: Relative(19) }, JumpIf { condition: Relative(17), location: 367 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, Load { destination: Relative(15), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Store { destination_pointer: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(15) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 393 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 401 }, Jump { location: 403 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 418 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 415 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 408 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 418 }, Return]" ], - "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXSVZSHCkt8kc1eGxTPGSk/rv4efxx8vv76fLr8c/hy9f/x5+XE/n8+n39/Pjw/3z6fHS//XvYcCP1A5f0t1BhygSJUXRKBYlR/EoJUqNEhYLi4XFwmJhsbBYWHJ/TXvpV7kXj1Ki1ChtLD5EkSgpikaxKGHxsHhYPCwelhKWEpYSlhKWEpYSlhKW0i3WS7eUXtpY6hBFoqQoGsWi5CgepUTpltpLG0sbokiUbmm9aBSLkqN0iwy9lqnWqbaoMnSVJIAQEkEJRsgEJxRCJbQJhGahWWgWmoVmoVloFpqFZqE5wawAISSCEoyQCU4ohEpoEyjNSrPSrDQrzUqz0qw0K81Ks9FsNBvNRrPRbDQbzQZzBlRCmyAPBCEkghKMgOHeAWmQAsAvV4ASjJAJTiiESmgTIB8BQqC50FxoLjQXmgvNyIs0AHYELFFkJkAIiaAEI2SCEwqhEmhuNDeaG82N5kZzo7nR3GhuNLfJnIaBIIREgFkARsgEJxRCJbQJEKsAISQCzAlgBJgV4IRCqASY+0aVEKsAISSCEmDOgEyA2QEwF0A3K94dsRoBsVK8F2Kl8CBWiuGIlWI4YqUYjlgFOKEQYK6ANgFiFSCERFCCETLBCdij8VAQq4A2AWIVIIREUIIRMsEJNCNxhknAaTQCzqMAISSCEoyQCU4oBJgxq8jgCMigYTKRwYBEUIIRMsEJhQAzJhwZHAEZDBBCIkCIyUT0ApyAgxS3iugF4DDFrSJ6GSsB0ctYCYhexrsjehlmRC8gE5yAW20AmPFeiB5AEb0AISSCEoyQCU4ohEqgWWgWmoVmoVloRvRyAzihECqhTYDoBQghEZRgBJoTzYlmRM8HQJsA0QsQQiIowQiZ4IRCoFlpNpqNZqPZaDaajWaj2Wg2mo3mTHOmGUFzAWSCE+DJgEqAx9FnwlMA8OChIGiOiULQCswIWkAmOAHmsV9FC4f3QtBGQNAChJAISjBCJjihEGguNFeaK82V5kpzpXlsFeX19e7Atvz78/V4RFf+rk/v3fvT/fV4eT58ubycz3eHf+7PL+Mv/Xm6v4z1+f7aX+0f+nj52WsX/jqdj6DXu7fRw/JQwf4zDu5n4Dw8fxwvK+O1Fgq01tkg7WaDoTcMg4luMeTqNHheNNiyoe8i/BR9a/At9+DI8XQPLS8ZfNlgudlkMLe3Rym+zaBLhpXVkOZHkd7NQr55NSXjUuxH7JbxZX4MqSyuxpXH0FsyPobelA2LD3JNIehvQtEb302K3rFQ0dfTouJ/WJFrd9GPjvkuNG1SWPP5gQ7b7sJsvgvLsknhaEpC4V62KXRe2W55m6Jwq+zdme5XLE7nSkB03q772bghYP0o4/imG8Zb4zTmQfaNl7xhfE5MRX63RX5ifOZ4l8UNKtW1s0a5xUmXLT3C1Faegc+J6B3K4gajKx+jDpzG+n4ZlY+ClZXoxpPiw4H5CUHlZ/D3p/5nBJzHMizeweo0Fp+zUAfZ9CTKvBy2K6zdolhdUlLnJZXKNsVNHZC23QfO6l3c1gOZ7G6Cblds6YJ83mT6Kl/aJMz2N6R59+O47VMsb/Xr/UOxuX+o2/oHzf6mWJ6I/btl3rtb5r27Zd67W+a9u6Xt3y1t/25p+3fL9SU1t0B9dW1rw2yY/0iw1LbdRZvvwoZNfzBme9v18zbDTa0I/idkZ7iwdHaFy21nuFYFt4RrXXBDuFan8bZwrStuCte64rZwbetEvvWr+4fT9cMXya9wXU/3P87H6fLXy+Xh3avP/z7xFX4R/XR9fDj+fLkeYXr7Nrr/+Kqt3JnUb/g2Epe13vWc4VLGV61f+rdX3Mx/", + "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXTldSPCTuskcx+ExRfGSVPz78P347e3n19Plx/Ovw6fPvw/frqfz+fTz6/n56fH19Hzpv/19GPAjtcOn9HDQIYpESVE0ikXJUTxKiVKjhMXCYmGxsFhYLCwWltzf0176q9yLRylRapQ2Fh+iSJQURaNYlLB4WDwsHhYPSwlLCUsJSwlLCUsJSwlL6RbrpVtKL20sdYgiUVIUjWJRchSPUqJ0S+2ljaUNUSRKt7ReNIpFyVG6RYZey1TrVFtUGbpKEkAIiaAEI2SCEwqhEtoEQrPQLDQLzUKz0Cw0C81Cs9CcYFaAEBJBCUbIBCcUQiW0CZRmpVlpVpqVZqVZaVaalWal2Wg2mo1mo9loNpqNZoM5AyqhTZAHghASQQlGQHPvgDRIAeCPK0AJRsgEJxRCJbQJkI8AIdBcaC40F5oLzYVm5EUaACsCpigyEyCERFCCETLBCYVQCTQ3mhvNjeZGc6O50dxobjQ3mttkTsNAEEIiwCwAI2SCEwqhEtoEiFWAEBIB5gQwAswKcEIhVALMfaFKiFWAEBJBCTBnQCbA7ACYC6CbFZ+OWI2AWCk+C7FSeBArRXPEStEcsVI0R6wCnFAIMFdAmwCxChBCIijBCJngBKzRuCmIVUCbALEKEEIiKMEImeAEmpE4wyBgNxoB+1GAEBJBCUbIBCcUAswYVWRwBGTQMJjIYEAiKMEImeCEQoAZA44MjoAMBgghESDEYCJ6AU7ARoquInoB2EzRVUQvYyYgehkzAdHL+HREL8OM6AVkghPQ1QaAGZ+F6AEU0QsQQiIowQiZ4IRCqASahWahWWgWmoVmRC83gBMKoRLaBIhegBASQQlGoDnRnGhG9HwAtAkQvQAhJIISjJAJTigEmpVmo9loNpqNZqPZaDaajWaj2WjONGeaETQXQCY4AZ4MqAR4HOdMeAoAHtwUBM0xUAhagRlBC8gEJ8A8nldxhMNnIWgjIGgBQkgEJRghE5xQCDQXmivNleZKc6W50jweFeX9/eHAY/nX1+vxiFP5h3N6P72/PF6Pl9fDp8vb+fxw+Ofx/Db+0a+Xx8tYXx+v/d1+0cfL91678MfpfAS9P9xaD8tNBevP2LjvgXPz/Gd7WWlfsQaEoGafDdLuN9RhNlTZYOj7sE2GvqcuGmzZoFl5FX0W2pY+CLbQqQ+uSwZfNlj/4MlgbrdbKb7NoEuGYfUqeBHJl2bDWnvjrexb7Jb2hYPYl8bF2bh2G/LtNuRUF2/kmsIHRqLv5mmTosisKHVYVPyFGbnai9bYizoMmxTN52S1sq0XbZh70aRtUfRt2zkW/eFtm2IYZoXoNoXJrGiyX7E4nCsB0Xm57nvjhoD1rYztm25ob40LRB5kX3vJG9rf4p0/LJH/o31me5fFBSrVld2qtcrpPKTFuZjayhjInAjrj/xLCl25jDpwGOuHdVrKn4KVmejGXHvWTYLKmey1bhMwkGVY7MHqMCZlF6w/SW26Eynl3Qop9yhWp1T12xksb1HceQLStnvDWe3FfWcgk92HoPsVW05BPl+G18VFzmz/gTTvvh33XcXyUr+6c1ebT4M1bzs/1GQ3xfJA7F8t897VMu9dLfPe1TLvXS1t/2pp+1dL279ark8pkXlKJdmmmB8z+v+1yjaF33pRNj0wDvOhth8kthjuPIrgPyE7w+W6M1xuO8O1KrgnXOuCO8K1Ooz3hWtdcVe41hX3hWvbSeRLf/X4dLr+8UXyO1zX0+O383F6+ePt8vTh3dd/X/gOv4h+uT4/Hb+/XY8w3b6N7j8+aysPJvULvo3Ey1of+mMKXsr4rvWX/uUdnfkP", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -83,7 +83,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 619c603eb27..2a6d6a11301 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -72,7 +72,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(32841) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 388 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(13), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 354 }, Jump { location: 55 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(18), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(18) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(19), size: Relative(21) }, scalars: HeapVector { pointer: Relative(22), size: Relative(23) }, outputs: HeapArray { pointer: Relative(24), size: 3 } }), BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Load { destination: Relative(18), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(18), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 96 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(19), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 100 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 153 }, Call { location: 394 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(10), location: 284 }, Jump { location: 161 }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(8), bit_size: Field, value: 2 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Const { destination: Relative(7), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(11), source: Relative(17) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(7), size: Relative(10) }, scalars: HeapVector { pointer: Relative(11), size: Relative(12) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(7), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 219 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Relative(17) }, JumpIf { condition: Relative(4), location: 224 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Field, value: 8 }, BinaryFieldOp { destination: Relative(5), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(5), rhs: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(2), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Direct(32835), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(1), rhs: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 238 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(3) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(15) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(17) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(4), size: Relative(5) }, scalars: HeapVector { pointer: Relative(6), size: Relative(7) }, outputs: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(14) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 276 }, Call { location: 394 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(1), bit_size: Field, value: 849707701676507062560416368841861616551813265068666159965855698002224802634 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 283 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Return, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(21) }, Cast { destination: Relative(21), source: Relative(10), bit_size: Integer(U128) }, Cast { destination: Relative(19), source: Relative(21), bit_size: Field }, BinaryFieldOp { destination: Relative(21), op: Sub, lhs: Relative(10), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(21), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Direct(32835), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(19), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(10), rhs: Relative(23) }, JumpIf { condition: Relative(21), location: 297 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(21), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Store { destination_pointer: Relative(25), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(11), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(18) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Load { destination: Relative(19), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(5) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(10) }, Store { destination_pointer: Relative(27), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(5), source: Relative(21) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(17), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(16), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(17), op: Sub, lhs: Relative(15), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(17), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Direct(32835), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(19), op: Add, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(15), rhs: Relative(19) }, JumpIf { condition: Relative(17), location: 367 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, Load { destination: Relative(15), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Store { destination_pointer: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(15) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 393 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 401 }, Jump { location: 403 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 418 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 415 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 408 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 418 }, Return]" ], - "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXSVZSHCkt8kc1eGxTPGSk/rv4efxx8vv76fLr8c/hy9f/x5+XE/n8+n39/Pjw/3z6fHS//XvYcCP1A5f0t1BhygSJUXRKBYlR/EoJUqNEhYLi4XFwmJhsbBYWHJ/TXvpV7kXj1Ki1ChtLD5EkSgpikaxKGHxsHhYPCwelhKWEpYSlhKWEpYSlhKW0i3WS7eUXtpY6hBFoqQoGsWi5CgepUTpltpLG0sbokiUbmm9aBSLkqN0iwy9lqnWqbaoMnSVJIAQEkEJRsgEJxRCJbQJhGahWWgWmoVmoVloFpqFZqE5wawAISSCEoyQCU4ohEpoEyjNSrPSrDQrzUqz0qw0K81Ks9FsNBvNRrPRbDQbzQZzBlRCmyAPBCEkghKMgOHeAWmQAsAvV4ASjJAJTiiESmgTIB8BQqC50FxoLjQXmgvNyIs0AHYELFFkJkAIiaAEI2SCEwqhEmhuNDeaG82N5kZzo7nR3GhuNLfJnIaBIIREgFkARsgEJxRCJbQJEKsAISQCzAlgBJgV4IRCqASY+0aVEKsAISSCEmDOgEyA2QEwF0A3K94dsRoBsVK8F2Kl8CBWiuGIlWI4YqUYjlgFOKEQYK6ANgFiFSCERFCCETLBCdij8VAQq4A2AWIVIIREUIIRMsEJNCNxhknAaTQCzqMAISSCEoyQCU4oBJgxq8jgCMigYTKRwYBEUIIRMsEJhQAzJhwZHAEZDBBCIkCIyUT0ApyAgxS3iugF4DDFrSJ6GSsB0ctYCYhexrsjehlmRC8gE5yAW20AmPFeiB5AEb0AISSCEoyQCU4ohEqgWWgWmoVmoVloRvRyAzihECqhTYDoBQghEZRgBJoTzYlmRM8HQJsA0QsQQiIowQiZ4IRCoFlpNpqNZqPZaDaajWaj2Wg2mo3mTHOmGUFzAWSCE+DJgEqAx9FnwlMA8OChIGiOiULQCswIWkAmOAHmsV9FC4f3QtBGQNAChJAISjBCJjihEGguNFeaK82V5kpzpXlsFeX19e7Atvz78/V4RFf+rk/v3fvT/fV4eT58ubycz3eHf+7PL+Mv/Xm6v4z1+f7aX+0f+nj52WsX/jqdj6DXu7fRw/JQwf4zDu5n4Dw8fxwvK+O1Fgq01tkg7WaDoTcMg4luMeTqNHheNNiyoe8i/BR9a/At9+DI8XQPLS8ZfNlgudlkMLe3Rym+zaBLhpXVkOZHkd7NQr55NSXjUuxH7JbxZX4MqSyuxpXH0FsyPobelA2LD3JNIehvQtEb302K3rFQ0dfTouJ/WJFrd9GPjvkuNG1SWPP5gQ7b7sJsvgvLsknhaEpC4V62KXRe2W55m6Jwq+zdme5XLE7nSkB03q772bghYP0o4/imG8Zb4zTmQfaNl7xhfE5MRX63RX5ifOZ4l8UNKtW1s0a5xUmXLT3C1Faegc+J6B3K4gajKx+jDpzG+n4ZlY+ClZXoxpPiw4H5CUHlZ/D3p/5nBJzHMizeweo0Fp+zUAfZ9CTKvBy2K6zdolhdUlLnJZXKNsVNHZC23QfO6l3c1gOZ7G6Cblds6YJ83mT6Kl/aJMz2N6R59+O47VMsb/Xr/UOxuX+o2/oHzf6mWJ6I/btl3rtb5r27Zd67W+a9u6Xt3y1t/25p+3fL9SU1t0B9dW1rw2yY/0iw1LbdRZvvwoZNfzBme9v18zbDTa0I/idkZ7iwdHaFy21nuFYFt4RrXXBDuFan8bZwrStuCte64rZwbetEvvWr+4fT9cMXya9wXU/3P87H6fLXy+Xh3avP/z7xFX4R/XR9fDj+fLkeYXr7Nrr/+Kqt3JnUb/g2Epe13vWc4VLGV61f+rdX3Mx/", + "debug_symbols": "rZnBbts6EEX/xessNJzhkOyvFEWRpm5hwHACN3nAQ5F/f7waXTldSPCTuskcx+ExRfGSVPz78P347e3n19Plx/Ovw6fPvw/frqfz+fTz6/n56fH19Hzpv/19GPAjtcOn9HDQIYpESVE0ikXJUTxKiVKjhMXCYmGxsFhYLCwWltzf0176q9yLRylRapQ2Fh+iSJQURaNYlLB4WDwsHhYPSwlLCUsJSwlLCUsJSwlL6RbrpVtKL20sdYgiUVIUjWJRchSPUqJ0S+2ljaUNUSRKt7ReNIpFyVG6RYZey1TrVFtUGbpKEkAIiaAEI2SCEwqhEtoEQrPQLDQLzUKz0Cw0C81Cs9CcYFaAEBJBCUbIBCcUQiW0CZRmpVlpVpqVZqVZaVaalWal2Wg2mo1mo9loNpqNZoM5AyqhTZAHghASQQlGQHPvgDRIAeCPK0AJRsgEJxRCJbQJkI8AIdBcaC40F5oLzYVm5EUaACsCpigyEyCERFCCETLBCYVQCTQ3mhvNjeZGc6O50dxobjQ3mttkTsNAEEIiwCwAI2SCEwqhEtoEiFWAEBIB5gQwAswKcEIhVALMfaFKiFWAEBJBCTBnQCbA7ACYC6CbFZ+OWI2AWCk+C7FSeBArRXPEStEcsVI0R6wCnFAIMFdAmwCxChBCIijBCJngBKzRuCmIVUCbALEKEEIiKMEImeAEmpE4wyBgNxoB+1GAEBJBCUbIBCcUAswYVWRwBGTQMJjIYEAiKMEImeCEQoAZA44MjoAMBgghESDEYCJ6AU7ARoquInoB2EzRVUQvYyYgehkzAdHL+HREL8OM6AVkghPQ1QaAGZ+F6AEU0QsQQiIowQiZ4IRCqASahWahWWgWmoVmRC83gBMKoRLaBIhegBASQQlGoDnRnGhG9HwAtAkQvQAhJIISjJAJTigEmpVmo9loNpqNZqPZaDaajWaj2WjONGeaETQXQCY4AZ4MqAR4HOdMeAoAHtwUBM0xUAhagRlBC8gEJ8A8nldxhMNnIWgjIGgBQkgEJRghE5xQCDQXmivNleZKc6W50jweFeX9/eHAY/nX1+vxiFP5h3N6P72/PF6Pl9fDp8vb+fxw+Ofx/Db+0a+Xx8tYXx+v/d1+0cfL91678MfpfAS9P9xaD8tNBevP2LjvgXPz/Gd7WWlfsQaEoGafDdLuN9RhNlTZYOj7sE2GvqcuGmzZoFl5FX0W2pY+CLbQqQ+uSwZfNlj/4MlgbrdbKb7NoEuGYfUqeBHJl2bDWnvjrexb7Jb2hYPYl8bF2bh2G/LtNuRUF2/kmsIHRqLv5mmTosisKHVYVPyFGbnai9bYizoMmxTN52S1sq0XbZh70aRtUfRt2zkW/eFtm2IYZoXoNoXJrGiyX7E4nCsB0Xm57nvjhoD1rYztm25ob40LRB5kX3vJG9rf4p0/LJH/o31me5fFBSrVld2qtcrpPKTFuZjayhjInAjrj/xLCl25jDpwGOuHdVrKn4KVmejGXHvWTYLKmey1bhMwkGVY7MHqMCZlF6w/SW26Eynl3Qop9yhWp1T12xksb1HceQLStnvDWe3FfWcgk92HoPsVW05BPl+G18VFzmz/gTTvvh33XcXyUr+6c1ebT4M1bzs/1GQ3xfJA7F8t897VMu9dLfPe1TLvXS1t/2pp+1dL279ark8pkXlKJdmmmB8z+v+1yjaF33pRNj0wDvOhth8kthjuPIrgPyE7w+W6M1xuO8O1KrgnXOuCO8K1Ooz3hWtdcVe41hX3hWvbSeRLf/X4dLr+8UXyO1zX0+O383F6+ePt8vTh3dd/X/gOv4h+uT4/Hb+/XY8w3b6N7j8+aysPJvULvo3Ey1of+mMKXsr4rvWX/uUdnfkP", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -83,7 +83,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__expanded.snap index 6afe6383022..64792fe2c1a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__expanded.snap @@ -27,8 +27,8 @@ fn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) { if i_u32 == a { for j in 0..4 { { - let i_3785: u32 = i + j; - data[i_3785] = c[(4 - 1) - j]; + let i_3788: u32 = i + j; + data[i_3788] = c[(4 - 1) - j]; }; for k in 0..4 { ba = ba + data[k]; diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index dcb5055bc9d..8de00430732 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -2712,8 +2712,12 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn sort(mut a: [u32; 4]) -> [u32; 4] {\n for i in 1..4 {\n for j in 0..i {\n if a[i] < a[j] {\n let c = a[j];\n a[j] = a[i];\n a[i] = c;\n }\n }\n }\n a\n}\n\nfn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //Test case for short-circuit\n let mut data = [0 as u32; 32];\n let mut ba = a;\n for i in 0..32 {\n let i_u32 = i as u32;\n if i_u32 == a {\n for j in 0..4 {\n data[i + j] = c[4 - 1 - j];\n for k in 0..4 {\n ba = ba + data[k];\n }\n if ba == 4864 {\n c[3] = ba;\n }\n }\n }\n }\n assert(data[31] == 0);\n assert(ba != 13);\n //Test case for conditional with arrays from function parameters\n let b = sort([1, 2, 3, 4]);\n assert(b[0] == 1);\n\n if a == 0 {\n must_be_zero(0);\n c[0] = 3;\n } else {\n must_be_zero(1);\n c[0] = 1;\n c[1] = c[2] / a + 11 % a;\n let f1 = a as Field;\n assert(10 / f1 != 0);\n }\n assert(c[0] == 3);\n\n let mut y = 0;\n if a == 0 {\n let digest = std::hash::blake3(x);\n y = digest[0];\n } else {\n y = 5;\n }\n assert(y == result[0]);\n c = sort(c);\n assert(c[0] == 0);\n //test 1\n let mut x: u32 = 0;\n if a == 0 {\n c[0] = 12;\n if a != 0 {\n x = 6;\n } else {\n x = 2;\n assert(x == 2);\n }\n } else {\n x = 5;\n assert(x == 5);\n }\n if c[0] == 0 {\n x = 3;\n }\n assert(x == 2);\n //test2: loops\n let mut x: u32 = 0;\n x = a - a;\n for i in 0..4 {\n if c[i] == 0 {\n x = i as u32 + 2;\n }\n }\n assert(x == 0);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_0.snap index dcb5055bc9d..8de00430732 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_0.snap @@ -2712,8 +2712,12 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn sort(mut a: [u32; 4]) -> [u32; 4] {\n for i in 1..4 {\n for j in 0..i {\n if a[i] < a[j] {\n let c = a[j];\n a[j] = a[i];\n a[i] = c;\n }\n }\n }\n a\n}\n\nfn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //Test case for short-circuit\n let mut data = [0 as u32; 32];\n let mut ba = a;\n for i in 0..32 {\n let i_u32 = i as u32;\n if i_u32 == a {\n for j in 0..4 {\n data[i + j] = c[4 - 1 - j];\n for k in 0..4 {\n ba = ba + data[k];\n }\n if ba == 4864 {\n c[3] = ba;\n }\n }\n }\n }\n assert(data[31] == 0);\n assert(ba != 13);\n //Test case for conditional with arrays from function parameters\n let b = sort([1, 2, 3, 4]);\n assert(b[0] == 1);\n\n if a == 0 {\n must_be_zero(0);\n c[0] = 3;\n } else {\n must_be_zero(1);\n c[0] = 1;\n c[1] = c[2] / a + 11 % a;\n let f1 = a as Field;\n assert(10 / f1 != 0);\n }\n assert(c[0] == 3);\n\n let mut y = 0;\n if a == 0 {\n let digest = std::hash::blake3(x);\n y = digest[0];\n } else {\n y = 5;\n }\n assert(y == result[0]);\n c = sort(c);\n assert(c[0] == 0);\n //test 1\n let mut x: u32 = 0;\n if a == 0 {\n c[0] = 12;\n if a != 0 {\n x = 6;\n } else {\n x = 2;\n assert(x == 2);\n }\n } else {\n x = 5;\n assert(x == 5);\n }\n if c[0] == 0 {\n x = 3;\n }\n assert(x == 2);\n //test2: loops\n let mut x: u32 = 0;\n x = a - a;\n for i in 0..4 {\n if c[i] == 0 {\n x = i as u32 + 2;\n }\n }\n assert(x == 0);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index dcb5055bc9d..8de00430732 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -2712,8 +2712,12 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn sort(mut a: [u32; 4]) -> [u32; 4] {\n for i in 1..4 {\n for j in 0..i {\n if a[i] < a[j] {\n let c = a[j];\n a[j] = a[i];\n a[i] = c;\n }\n }\n }\n a\n}\n\nfn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //Test case for short-circuit\n let mut data = [0 as u32; 32];\n let mut ba = a;\n for i in 0..32 {\n let i_u32 = i as u32;\n if i_u32 == a {\n for j in 0..4 {\n data[i + j] = c[4 - 1 - j];\n for k in 0..4 {\n ba = ba + data[k];\n }\n if ba == 4864 {\n c[3] = ba;\n }\n }\n }\n }\n assert(data[31] == 0);\n assert(ba != 13);\n //Test case for conditional with arrays from function parameters\n let b = sort([1, 2, 3, 4]);\n assert(b[0] == 1);\n\n if a == 0 {\n must_be_zero(0);\n c[0] = 3;\n } else {\n must_be_zero(1);\n c[0] = 1;\n c[1] = c[2] / a + 11 % a;\n let f1 = a as Field;\n assert(10 / f1 != 0);\n }\n assert(c[0] == 3);\n\n let mut y = 0;\n if a == 0 {\n let digest = std::hash::blake3(x);\n y = digest[0];\n } else {\n y = 5;\n }\n assert(y == result[0]);\n c = sort(c);\n assert(c[0] == 0);\n //test 1\n let mut x: u32 = 0;\n if a == 0 {\n c[0] = 12;\n if a != 0 {\n x = 6;\n } else {\n x = 2;\n assert(x == 2);\n }\n } else {\n x = 5;\n assert(x == 5);\n }\n if c[0] == 0 {\n x = 3;\n }\n assert(x == 2);\n //test2: loops\n let mut x: u32 = 0;\n x = a - a;\n for i in 0..4 {\n if c[i] == 0 {\n x = i as u32 + 2;\n }\n }\n assert(x == 0);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 5efe179cb79..d99d1f9a8d6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -90,8 +90,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32881 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 42 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32839), size_address: Relative(5), offset_address: Relative(6) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U32) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U32) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U32) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U32) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U32) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Cast { destination: Direct(32878), source: Direct(32878), bit_size: Integer(U8) }, Cast { destination: Direct(32879), source: Direct(32879), bit_size: Integer(U8) }, Cast { destination: Direct(32880), source: Direct(32880), bit_size: Integer(U8) }, Mov { destination: Relative(1), source: Direct(32839) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32840 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(2), source: Relative(5) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32844 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(3), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32849 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(4), source: Relative(5) }, Call { location: 101 }, Call { location: 106 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32881 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 100 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 93 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32836), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 4 }, Return, Call { location: 427 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Mov { destination: Relative(9), source: Relative(7) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 124 }, Store { destination_pointer: Relative(9), source: Direct(32835) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Jump { location: 118 }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 4864 }, Mov { destination: Relative(5), source: Direct(32835) }, Jump { location: 135 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, JumpIf { condition: Relative(11), location: 353 }, Jump { location: 138 }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32835) }, JumpIf { condition: Relative(5), location: 145 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U1), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(7), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 153 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(8) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 433 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, JumpIf { condition: Relative(8), location: 180 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, Const { destination: Relative(8), bit_size: Integer(U8), value: 0 }, JumpIf { condition: Relative(7), location: 224 }, Jump { location: 184 }, Const { destination: Relative(10), bit_size: Integer(U8), value: 1 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(11), location: 189 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, Load { destination: Relative(10), source_pointer: Relative(6) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, Store { destination_pointer: Relative(12), source: Direct(32837) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(14), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(15) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 207 }, Call { location: 513 }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(12) }, Cast { destination: Relative(10), source: Relative(1), bit_size: Field }, Const { destination: Relative(1), bit_size: Field, value: 10 }, BinaryFieldOp { destination: Relative(11), op: Div, lhs: Relative(1), rhs: Relative(10) }, Const { destination: Relative(1), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(1), location: 223 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, Jump { location: 233 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(6), source: Relative(2) }, Jump { location: 233 }, Load { destination: Relative(1), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(9) }, JumpIf { condition: Relative(1), location: 240 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(8) }, JumpIf { condition: Relative(7), location: 248 }, Jump { location: 245 }, Const { destination: Relative(2), bit_size: Integer(U8), value: 5 }, Store { destination_pointer: Relative(1), source: Relative(2) }, Jump { location: 260 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(8), size: Relative(10) }, output: HeapArray { pointer: Relative(11), size: 32 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(8) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Jump { location: 260 }, Load { destination: Relative(2), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U8, lhs: Relative(2), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 267 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 274 }, Call { location: 516 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 433 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Load { destination: Relative(1), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(4), location: 290 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32835) }, JumpIf { condition: Relative(7), location: 298 }, Jump { location: 295 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 5 }, Store { destination_pointer: Relative(1), source: Relative(2) }, Jump { location: 313 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Store { destination_pointer: Relative(6), source: Relative(4) }, JumpIf { condition: Relative(7), location: 311 }, Jump { location: 308 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 6 }, Store { destination_pointer: Relative(1), source: Relative(2) }, Jump { location: 313 }, Store { destination_pointer: Relative(1), source: Relative(5) }, Jump { location: 313 }, Load { destination: Relative(2), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, JumpIf { condition: Relative(2), location: 319 }, Jump { location: 321 }, Store { destination_pointer: Relative(1), source: Relative(9) }, Jump { location: 321 }, Load { destination: Relative(3), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, JumpIf { condition: Relative(1), location: 326 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32835) }, Mov { destination: Relative(2), source: Direct(32835) }, Jump { location: 331 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, JumpIf { condition: Relative(3), location: 340 }, Jump { location: 334 }, Load { destination: Relative(2), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(1), location: 339 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Return, Load { destination: Relative(3), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32835) }, JumpIf { condition: Relative(3), location: 347 }, Jump { location: 350 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Jump { location: 350 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Mov { destination: Relative(2), source: Relative(3) }, Jump { location: 331 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, JumpIf { condition: Relative(11), location: 356 }, Jump { location: 362 }, Mov { destination: Relative(11), source: Direct(32835) }, Jump { location: 358 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Direct(32838) }, JumpIf { condition: Relative(12), location: 365 }, Jump { location: 361 }, Jump { location: 362 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Mov { destination: Relative(5), source: Relative(11) }, Jump { location: 135 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 369 }, Call { location: 513 }, Load { destination: Relative(14), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Sub, bit_size: U32, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, JumpIf { condition: Relative(16), location: 374 }, Call { location: 519 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(15), rhs: Direct(32838) }, JumpIf { condition: Relative(16), location: 377 }, Call { location: 522 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Load { destination: Relative(14), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, JumpIf { condition: Relative(15), location: 384 }, Call { location: 522 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 491 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(13) }, Store { destination_pointer: Relative(18), source: Relative(16) }, Store { destination_pointer: Relative(7), source: Relative(15) }, Mov { destination: Relative(12), source: Direct(32835) }, Jump { location: 394 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, JumpIf { condition: Relative(13), location: 414 }, Jump { location: 397 }, Load { destination: Relative(12), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 401 }, Jump { location: 411 }, Load { destination: Relative(12), source_pointer: Relative(2) }, Load { destination: Relative(13), source_pointer: Relative(6) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, Store { destination_pointer: Relative(15), source: Relative(12) }, Store { destination_pointer: Relative(6), source: Relative(14) }, Jump { location: 411 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, Mov { destination: Relative(11), source: Relative(12) }, Jump { location: 358 }, Load { destination: Relative(13), source_pointer: Relative(2) }, Load { destination: Relative(14), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(14) }, JumpIf { condition: Relative(16), location: 423 }, Call { location: 513 }, Store { destination_pointer: Relative(2), source: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, Mov { destination: Relative(12), source: Relative(13) }, Jump { location: 394 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 432 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 427 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(2), source: Direct(32837) }, Jump { location: 439 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, JumpIf { condition: Relative(1), location: 444 }, Jump { location: 442 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Return, Mov { destination: Relative(1), source: Direct(32835) }, Jump { location: 446 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 452 }, Jump { location: 449 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Mov { destination: Relative(2), source: Relative(1) }, Jump { location: 439 }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, JumpIf { condition: Relative(6), location: 459 }, Call { location: 522 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(4), location: 465 }, Jump { location: 488 }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Jump { location: 488 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 446 }, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 495 }, Jump { location: 497 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 512 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 509 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 502 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 512 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZnNbhs5EITfRWcf+Nf8yasEQaA4SiBAkA3FXmBh+N23a9jFiQ8GFq2L65PkriGb3RyO9Hb4efrx+vv7+frr6c/hy9e3w4/b+XI5//5+eXo8vpyfrvru2yHgT4wq8UE1mibTbFpMxbSaNtNuOqYm80vml8wvmV8yv2R+yfyS+SXzS+aX9f8SVN/PUH2/qJZgqtcRaDLNpsVUTPU6FdpMu+mYKsE0miZT9WvQYiqm1bSZdtMxtQbTaJpMza+aXzW/an5V/Tq0m46pLZhG02SaTdVvQMUUeQ2ARuiEYdCxVkhyx6Igu10IldAInYBwpH4gHLkdkZAImVAIQoAzMjsaAc6Y+4CzTiaFQIiERIDzABSCECpBnVMAdMIwQLlPiIREyAR1ThGA2kuASoBzBnTCMEDhT4iERIBhAcBQAJXQCJ0wDHIgREI2wwzDChACDBugETphGKBlEnKInpmQCPBB6tAmE9BvyAYaZAN0yIRISIRMKAQhqGFGMtEoE7oBWmS7FnokI71okgkwxEzRJhOEUAmN0AnDAM0yIRISgc6Nzo3OaJmMZULLTOiEYYCWmRAJiZAJcMZ6oZsmwBnLhG6a0AnDAN2UsUzopgmJAB8sE3pnAsKROrQMIKNlJkRCImRCIQhBfUoADAP0RYkAjSoJoFElA4SgwygFgCidYEbNT9CLlgrIhEIQAsIboBEwDJ1XRqkXDAwVLhgPKlwwHlT4hEboBtu9AFHbzQBj3u4GG2QCDDF43AA2Z1T4BijsCfhnzAslKpjOVpBQjAJjR/VNaIROGAaoPsG0UH0TEiETCkEIlQBnJAPVN2EYoPomREIiZAKckQxU34RKaIROGAaovgmRoD4VWcE+XZFmFF3VXBaU2IREyFueylZhUDGtps20m46pqLZN7WIFNTYB9+vto0bohDEHVLDlToiERMiEYoCKqgUghEqAoS53QdnUCsBHDTDsne08gHdQJLUDCkEIldAInQAfTWvBpjchEnAywJS3o8AGOAtgzCiyCZ2A4wUyjiKbEAnwQX5QZBMKQQiV0AidwJmiyCZEAtOCIptQCEKoBEy5vr8/HHja/P5yO51w2Pzr+KmH0ufj7XR9OXy5vl4uD4d/jpfX7Z/+PB+vm74cb/qp5uN0/amqhr/OlxPo/WGPDp+HatVZsJbVCpf/H49+mvE1OOJb5uBbLo74HhjfQ78vPmZPfGL+evbkb+BuuMUPXzwOcxbfPPHC+Q8pd8YPT3xb8a064mPA3XYziEE+rYCYPrdI2Bk2Bz3LuIbQZA3BOYnad4fkchh7Gka70yGG6HHQtVgOMdw7BqdDr3seXA4xjTWGPFwOssagj7J3O/hqcu0LMSRfJmNaDtFV1fo4vGYx0t0OrqpOkfuzoiuTee3wii6HJPsYmm8WI64xBNdqZlmrmauru3Np9zq0fQzN1Vl57A6j3ulQfLtcyasmi29/qHHtk9V16NIv6tYdR0+7HgfZu1tcBx/9sm/lQYovD3mNoWZXZ1XZMyl3O/j26tpWHqqvqutYDi14DmH6xebqzVZceWiyj8GXh9bXHtW6a7fvaa1Fz67u7ntf9Obq7jbWnbf7dtoPDp7ulnWMkuipBilcCCmedZDKCYgrh9JYjNKrK15WfHONf83fdZau68hQXSeGWpg/355UB6/fgmf+VeJd17/3eUjW8vl6eG1lw1N9bazvAzyPo/tzmO8xbH8SHPdd3nc+qvvhxnc3XLcy36livxV+TN83fXV8PN8+/Lr6Dqfb+fjjcrKXv16vj399+vLvMz/hr7PPt6fH08/X2wlO+0+0+udr0UOyHmu+6bew+mqEhxiCvojbZ3qILxmf4dvUr6JPR5Lit3eM7D8=", + "debug_symbols": "pZnNbhtJDITfRWcf+o/9k1cJgkBxlECAIBuKvcAi8Lsva5rVEx+8CKiL67NkltgcsqdH/n34fvr2+vPr+frj6dfh0+ffh2+38+Vy/vn18vR4fDk/XfXV34eAHzGqxAfVaJpMs2kxFdNq2ky76ZiazC+ZXzK/ZH7J/JL5JfNL5pfML5lf1r9LUH09Q/X1olqCqX6OQJNpNi2mYqqfU6HNtJuOqRJMo2kyVb8GLaZiWk2baTcdU2swjabJ1Pyq+VXzq+ZX1a9Du+mY2oJpNE2m2VT9BlRMUdcAaIROGAYd1wpF7rgoqG4XQiU0QicgHKUfCEdtRyQkQiYUghDgjMqORoAz1j7grItJIRAiIRHgPACFIIRKUOcUAJ0wDNDuEyIhETJBnVMEoPcSoBLgnAGdMAzQ+BMiIRFgWAAwFEAlNEInDIMcCJGQzTDDsAKEAMMGaIROGAYYmYQaYmYmJAJ8UDqMyQTMG4qAAdkAEzIhEhIhEwpBCGqYUToMyoRugBHZPgszkrEuDMkEGKJiGJMJQqiERuiEYYBhmRAJiUDnRudGZ4xMRp0xMhM6YRhgZCZEQiJkApxxUTBNE+CMS4BpmtAJwwDTlHEtME0TEgE+KBRmZ4KGF/QqRgaQMTITIiERMqEQhACfCBgGmIuSAIjKAEQVgBA0jSIAROkCM3p+Aj60ATKhEISA8A5oBKSh68podUFi6HBBPuhwQT7o8AmN0A3Q2FvUdjNAztvdYINMgCGSxw1gc0aHb4DGnoA/xrrQooLlbA0JRRbIHd03oRE6YRig+wTLQvdNSIRMKAQhVAKcUQx034RhgO6bEAmJkAnqXFEMdN+ESmiEThgG6L4JkQAfVAX7dEWZ0XRVq1HQYhMSIW91KuiwTcW0mjbTbjqmots2tQ8r6LEJSLoAGqETxkyoYMudEAmJkAnFAB1VBSCESoChXu6CtqkNgLc6YNgr23kAr6BJ6gAUghAqoRE6AccCLWvZzgUbRAJOBljydhTYAGcB5Iwmm9AJ8EHF0GQTIgE+qA+abEIhCKESGqETuFI02YRIYFnQZBMKQQiVgCW3t7eHA0+bX19upxMOm38cP/VQ+ny8na4vh0/X18vl4fDP8fK6/dGv5+N105fjTd/VCp2u31XV8Mf5cgK9PezR4eNQ7ToL1rZa4fL38RjHGV+DI75lJt9yccT3wPge+n3xMXviE+vXs6d+A3fVLX744nGYs/jmiReuf0i5M3544tuKb9URHwPuv5tBDPJhB8T0sUXCprE56FnGlUKTlYJzEbXvDsnlMPYyjHanQwzR46DXYjnEcG8OTode9zq4HGIaK4c8XA6yctBH2bsdfD259oUYkq+SMS2H6OpqfRxeqxjpbgdXV6fI/VnRVcm8dnhFl0OSPYf24Sry/yaB854l8ccWE8ffJzF2h+BqiCyrITQdl0Np9zq0PYfmGs48dodR73Qovo2y5NXWxbfF1Li22uo6t+l3feumpQdmj4PsG4S4zk76feGqgxRfHfLKoWbXcFbZKyl3O/i2+9pWHaqvq+tYDi14znH63eiazVZcdWiy5+CrQ+trj2rddcPoaV2Lnl3T3fe56M013W2sm3f37bTvHDzTLeskJtHTDVJ4IaR4roNULkBcNZTGZpReXfGy4psr/7V+13G8rlNHdR06amH9fHtSHfz8FjzrrxLv+vx7H6lkXT7fDK+tbHi6r431lYLniXZ/lPM9ye0Pk+O+j/edj+p+uPHdDdetzHeq2G+F78v3RX87Pp5v7/5B+wan2/n47XKyX3+8Xh//ePfl32e+w3/wPt+eHk/fX28nOO3/5dUfn4sekvVY80W/yNXfRniIIegvcXtPnwNKxnv4Qvaz6AOWpPjlDZn9Bw==", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn sort(mut a: [u32; 4]) -> [u32; 4] {\n for i in 1..4 {\n for j in 0..i {\n if a[i] < a[j] {\n let c = a[j];\n a[j] = a[i];\n a[i] = c;\n }\n }\n }\n a\n}\n\nfn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //Test case for short-circuit\n let mut data = [0 as u32; 32];\n let mut ba = a;\n for i in 0..32 {\n let i_u32 = i as u32;\n if i_u32 == a {\n for j in 0..4 {\n data[i + j] = c[4 - 1 - j];\n for k in 0..4 {\n ba = ba + data[k];\n }\n if ba == 4864 {\n c[3] = ba;\n }\n }\n }\n }\n assert(data[31] == 0);\n assert(ba != 13);\n //Test case for conditional with arrays from function parameters\n let b = sort([1, 2, 3, 4]);\n assert(b[0] == 1);\n\n if a == 0 {\n must_be_zero(0);\n c[0] = 3;\n } else {\n must_be_zero(1);\n c[0] = 1;\n c[1] = c[2] / a + 11 % a;\n let f1 = a as Field;\n assert(10 / f1 != 0);\n }\n assert(c[0] == 3);\n\n let mut y = 0;\n if a == 0 {\n let digest = std::hash::blake3(x);\n y = digest[0];\n } else {\n y = 5;\n }\n assert(y == result[0]);\n c = sort(c);\n assert(c[0] == 0);\n //test 1\n let mut x: u32 = 0;\n if a == 0 {\n c[0] = 12;\n if a != 0 {\n x = 6;\n } else {\n x = 2;\n assert(x == 2);\n }\n } else {\n x = 5;\n assert(x == 5);\n }\n if c[0] == 0 {\n x = 3;\n }\n assert(x == 2);\n //test2: loops\n let mut x: u32 = 0;\n x = a - a;\n for i in 0..4 {\n if c[i] == 0 {\n x = i as u32 + 2;\n }\n }\n assert(x == 0);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_0.snap index 5efe179cb79..d99d1f9a8d6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_0.snap @@ -90,8 +90,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32881 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 42 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32839), size_address: Relative(5), offset_address: Relative(6) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U32) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U32) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U32) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U32) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U32) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Cast { destination: Direct(32878), source: Direct(32878), bit_size: Integer(U8) }, Cast { destination: Direct(32879), source: Direct(32879), bit_size: Integer(U8) }, Cast { destination: Direct(32880), source: Direct(32880), bit_size: Integer(U8) }, Mov { destination: Relative(1), source: Direct(32839) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32840 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(2), source: Relative(5) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32844 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(3), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32849 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(4), source: Relative(5) }, Call { location: 101 }, Call { location: 106 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32881 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 100 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 93 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32836), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 4 }, Return, Call { location: 427 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Mov { destination: Relative(9), source: Relative(7) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 124 }, Store { destination_pointer: Relative(9), source: Direct(32835) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Jump { location: 118 }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 4864 }, Mov { destination: Relative(5), source: Direct(32835) }, Jump { location: 135 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, JumpIf { condition: Relative(11), location: 353 }, Jump { location: 138 }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32835) }, JumpIf { condition: Relative(5), location: 145 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U1), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(7), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 153 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(8) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 433 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Load { destination: Relative(7), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, JumpIf { condition: Relative(8), location: 180 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, Const { destination: Relative(8), bit_size: Integer(U8), value: 0 }, JumpIf { condition: Relative(7), location: 224 }, Jump { location: 184 }, Const { destination: Relative(10), bit_size: Integer(U8), value: 1 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(11), location: 189 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, Load { destination: Relative(10), source_pointer: Relative(6) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, Store { destination_pointer: Relative(12), source: Direct(32837) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(14), rhs: Relative(1) }, BinaryIntOp { destination: Relative(13), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(15) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(14), location: 207 }, Call { location: 513 }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(12) }, Cast { destination: Relative(10), source: Relative(1), bit_size: Field }, Const { destination: Relative(1), bit_size: Field, value: 10 }, BinaryFieldOp { destination: Relative(11), op: Div, lhs: Relative(1), rhs: Relative(10) }, Const { destination: Relative(1), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(1), location: 223 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, Jump { location: 233 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(6), source: Relative(2) }, Jump { location: 233 }, Load { destination: Relative(1), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(2), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(9) }, JumpIf { condition: Relative(1), location: 240 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(8) }, JumpIf { condition: Relative(7), location: 248 }, Jump { location: 245 }, Const { destination: Relative(2), bit_size: Integer(U8), value: 5 }, Store { destination_pointer: Relative(1), source: Relative(2) }, Jump { location: 260 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(8), size: Relative(10) }, output: HeapArray { pointer: Relative(11), size: 32 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(8) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Jump { location: 260 }, Load { destination: Relative(2), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U8, lhs: Relative(2), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 267 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 274 }, Call { location: 516 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 433 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Load { destination: Relative(1), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(4), location: 290 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32835) }, JumpIf { condition: Relative(7), location: 298 }, Jump { location: 295 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 5 }, Store { destination_pointer: Relative(1), source: Relative(2) }, Jump { location: 313 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Store { destination_pointer: Relative(6), source: Relative(4) }, JumpIf { condition: Relative(7), location: 311 }, Jump { location: 308 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 6 }, Store { destination_pointer: Relative(1), source: Relative(2) }, Jump { location: 313 }, Store { destination_pointer: Relative(1), source: Relative(5) }, Jump { location: 313 }, Load { destination: Relative(2), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, JumpIf { condition: Relative(2), location: 319 }, Jump { location: 321 }, Store { destination_pointer: Relative(1), source: Relative(9) }, Jump { location: 321 }, Load { destination: Relative(3), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, JumpIf { condition: Relative(1), location: 326 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32835) }, Mov { destination: Relative(2), source: Direct(32835) }, Jump { location: 331 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, JumpIf { condition: Relative(3), location: 340 }, Jump { location: 334 }, Load { destination: Relative(2), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(1), location: 339 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Return, Load { destination: Relative(3), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32835) }, JumpIf { condition: Relative(3), location: 347 }, Jump { location: 350 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Jump { location: 350 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Mov { destination: Relative(2), source: Relative(3) }, Jump { location: 331 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, JumpIf { condition: Relative(11), location: 356 }, Jump { location: 362 }, Mov { destination: Relative(11), source: Direct(32835) }, Jump { location: 358 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Direct(32838) }, JumpIf { condition: Relative(12), location: 365 }, Jump { location: 361 }, Jump { location: 362 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, Mov { destination: Relative(5), source: Relative(11) }, Jump { location: 135 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 369 }, Call { location: 513 }, Load { destination: Relative(14), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Sub, bit_size: U32, lhs: Relative(9), rhs: Relative(11) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, JumpIf { condition: Relative(16), location: 374 }, Call { location: 519 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(15), rhs: Direct(32838) }, JumpIf { condition: Relative(16), location: 377 }, Call { location: 522 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Load { destination: Relative(14), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, JumpIf { condition: Relative(15), location: 384 }, Call { location: 522 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 491 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(13) }, Store { destination_pointer: Relative(18), source: Relative(16) }, Store { destination_pointer: Relative(7), source: Relative(15) }, Mov { destination: Relative(12), source: Direct(32835) }, Jump { location: 394 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32838) }, JumpIf { condition: Relative(13), location: 414 }, Jump { location: 397 }, Load { destination: Relative(12), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 401 }, Jump { location: 411 }, Load { destination: Relative(12), source_pointer: Relative(2) }, Load { destination: Relative(13), source_pointer: Relative(6) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32838) }, Store { destination_pointer: Relative(15), source: Relative(12) }, Store { destination_pointer: Relative(6), source: Relative(14) }, Jump { location: 411 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, Mov { destination: Relative(11), source: Relative(12) }, Jump { location: 358 }, Load { destination: Relative(13), source_pointer: Relative(2) }, Load { destination: Relative(14), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(14) }, JumpIf { condition: Relative(16), location: 423 }, Call { location: 513 }, Store { destination_pointer: Relative(2), source: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, Mov { destination: Relative(12), source: Relative(13) }, Jump { location: 394 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 432 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 427 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(2), source: Direct(32837) }, Jump { location: 439 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, JumpIf { condition: Relative(1), location: 444 }, Jump { location: 442 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Return, Mov { destination: Relative(1), source: Direct(32835) }, Jump { location: 446 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 452 }, Jump { location: 449 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Mov { destination: Relative(2), source: Relative(1) }, Jump { location: 439 }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, JumpIf { condition: Relative(6), location: 459 }, Call { location: 522 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(4), location: 465 }, Jump { location: 488 }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 491 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Jump { location: 488 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 446 }, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 495 }, Jump { location: 497 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 512 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 509 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 502 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 512 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZnNbhs5EITfRWcf+Nf8yasEQaA4SiBAkA3FXmBh+N23a9jFiQ8GFq2L65PkriGb3RyO9Hb4efrx+vv7+frr6c/hy9e3w4/b+XI5//5+eXo8vpyfrvru2yHgT4wq8UE1mibTbFpMxbSaNtNuOqYm80vml8wvmV8yv2R+yfyS+SXzS+aX9f8SVN/PUH2/qJZgqtcRaDLNpsVUTPU6FdpMu+mYKsE0miZT9WvQYiqm1bSZdtMxtQbTaJpMza+aXzW/an5V/Tq0m46pLZhG02SaTdVvQMUUeQ2ARuiEYdCxVkhyx6Igu10IldAInYBwpH4gHLkdkZAImVAIQoAzMjsaAc6Y+4CzTiaFQIiERIDzABSCECpBnVMAdMIwQLlPiIREyAR1ThGA2kuASoBzBnTCMEDhT4iERIBhAcBQAJXQCJ0wDHIgREI2wwzDChACDBugETphGKBlEnKInpmQCPBB6tAmE9BvyAYaZAN0yIRISIRMKAQhqGFGMtEoE7oBWmS7FnokI71okgkwxEzRJhOEUAmN0AnDAM0yIRISgc6Nzo3OaJmMZULLTOiEYYCWmRAJiZAJcMZ6oZsmwBnLhG6a0AnDAN2UsUzopgmJAB8sE3pnAsKROrQMIKNlJkRCImRCIQhBfUoADAP0RYkAjSoJoFElA4SgwygFgCidYEbNT9CLlgrIhEIQAsIboBEwDJ1XRqkXDAwVLhgPKlwwHlT4hEboBtu9AFHbzQBj3u4GG2QCDDF43AA2Z1T4BijsCfhnzAslKpjOVpBQjAJjR/VNaIROGAaoPsG0UH0TEiETCkEIlQBnJAPVN2EYoPomREIiZAKckQxU34RKaIROGAaovgmRoD4VWcE+XZFmFF3VXBaU2IREyFueylZhUDGtps20m46pqLZN7WIFNTYB9+vto0bohDEHVLDlToiERMiEYoCKqgUghEqAoS53QdnUCsBHDTDsne08gHdQJLUDCkEIldAInQAfTWvBpjchEnAywJS3o8AGOAtgzCiyCZ2A4wUyjiKbEAnwQX5QZBMKQQiV0AidwJmiyCZEAtOCIptQCEKoBEy5vr8/HHja/P5yO51w2Pzr+KmH0ufj7XR9OXy5vl4uD4d/jpfX7Z/+PB+vm74cb/qp5uN0/amqhr/OlxPo/WGPDp+HatVZsJbVCpf/H49+mvE1OOJb5uBbLo74HhjfQ78vPmZPfGL+evbkb+BuuMUPXzwOcxbfPPHC+Q8pd8YPT3xb8a064mPA3XYziEE+rYCYPrdI2Bk2Bz3LuIbQZA3BOYnad4fkchh7Gka70yGG6HHQtVgOMdw7BqdDr3seXA4xjTWGPFwOssagj7J3O/hqcu0LMSRfJmNaDtFV1fo4vGYx0t0OrqpOkfuzoiuTee3wii6HJPsYmm8WI64xBNdqZlmrmauru3Np9zq0fQzN1Vl57A6j3ulQfLtcyasmi29/qHHtk9V16NIv6tYdR0+7HgfZu1tcBx/9sm/lQYovD3mNoWZXZ1XZMyl3O/j26tpWHqqvqutYDi14DmH6xebqzVZceWiyj8GXh9bXHtW6a7fvaa1Fz67u7ntf9Obq7jbWnbf7dtoPDp7ulnWMkuipBilcCCmedZDKCYgrh9JYjNKrK15WfHONf83fdZau68hQXSeGWpg/355UB6/fgmf+VeJd17/3eUjW8vl6eG1lw1N9bazvAzyPo/tzmO8xbH8SHPdd3nc+qvvhxnc3XLcy36livxV+TN83fXV8PN8+/Lr6Dqfb+fjjcrKXv16vj399+vLvMz/hr7PPt6fH08/X2wlO+0+0+udr0UOyHmu+6bew+mqEhxiCvojbZ3qILxmf4dvUr6JPR5Lit3eM7D8=", + "debug_symbols": "pZnNbhtJDITfRWcf+o/9k1cJgkBxlECAIBuKvcAi8Lsva5rVEx+8CKiL67NkltgcsqdH/n34fvr2+vPr+frj6dfh0+ffh2+38+Vy/vn18vR4fDk/XfXV34eAHzGqxAfVaJpMs2kxFdNq2ky76ZiazC+ZXzK/ZH7J/JL5JfNL5pfML5lf1r9LUH09Q/X1olqCqX6OQJNpNi2mYqqfU6HNtJuOqRJMo2kyVb8GLaZiWk2baTcdU2swjabJ1Pyq+VXzq+ZX1a9Du+mY2oJpNE2m2VT9BlRMUdcAaIROGAYd1wpF7rgoqG4XQiU0QicgHKUfCEdtRyQkQiYUghDgjMqORoAz1j7grItJIRAiIRHgPACFIIRKUOcUAJ0wDNDuEyIhETJBnVMEoPcSoBLgnAGdMAzQ+BMiIRFgWAAwFEAlNEInDIMcCJGQzTDDsAKEAMMGaIROGAYYmYQaYmYmJAJ8UDqMyQTMG4qAAdkAEzIhEhIhEwpBCGqYUToMyoRugBHZPgszkrEuDMkEGKJiGJMJQqiERuiEYYBhmRAJiUDnRudGZ4xMRp0xMhM6YRhgZCZEQiJkApxxUTBNE+CMS4BpmtAJwwDTlHEtME0TEgE+KBRmZ4KGF/QqRgaQMTITIiERMqEQhACfCBgGmIuSAIjKAEQVgBA0jSIAROkCM3p+Aj60ATKhEISA8A5oBKSh68podUFi6HBBPuhwQT7o8AmN0A3Q2FvUdjNAztvdYINMgCGSxw1gc0aHb4DGnoA/xrrQooLlbA0JRRbIHd03oRE6YRig+wTLQvdNSIRMKAQhVAKcUQx034RhgO6bEAmJkAnqXFEMdN+ESmiEThgG6L4JkQAfVAX7dEWZ0XRVq1HQYhMSIW91KuiwTcW0mjbTbjqmots2tQ8r6LEJSLoAGqETxkyoYMudEAmJkAnFAB1VBSCESoChXu6CtqkNgLc6YNgr23kAr6BJ6gAUghAqoRE6AccCLWvZzgUbRAJOBljydhTYAGcB5Iwmm9AJ8EHF0GQTIgE+qA+abEIhCKESGqETuFI02YRIYFnQZBMKQQiVgCW3t7eHA0+bX19upxMOm38cP/VQ+ny8na4vh0/X18vl4fDP8fK6/dGv5+N105fjTd/VCp2u31XV8Mf5cgK9PezR4eNQ7ToL1rZa4fL38RjHGV+DI75lJt9yccT3wPge+n3xMXviE+vXs6d+A3fVLX744nGYs/jmiReuf0i5M3544tuKb9URHwPuv5tBDPJhB8T0sUXCprE56FnGlUKTlYJzEbXvDsnlMPYyjHanQwzR46DXYjnEcG8OTode9zq4HGIaK4c8XA6yctBH2bsdfD259oUYkq+SMS2H6OpqfRxeqxjpbgdXV6fI/VnRVcm8dnhFl0OSPYf24Sry/yaB854l8ccWE8ffJzF2h+BqiCyrITQdl0Np9zq0PYfmGs48dodR73Qovo2y5NXWxbfF1Li22uo6t+l3feumpQdmj4PsG4S4zk76feGqgxRfHfLKoWbXcFbZKyl3O/i2+9pWHaqvq+tYDi14znH63eiazVZcdWiy5+CrQ+trj2rddcPoaV2Lnl3T3fe56M013W2sm3f37bTvHDzTLeskJtHTDVJ4IaR4roNULkBcNZTGZpReXfGy4psr/7V+13G8rlNHdR06amH9fHtSHfz8FjzrrxLv+vx7H6lkXT7fDK+tbHi6r431lYLniXZ/lPM9ye0Pk+O+j/edj+p+uPHdDdetzHeq2G+F78v3RX87Pp5v7/5B+wan2/n47XKyX3+8Xh//ePfl32e+w3/wPt+eHk/fX28nOO3/5dUfn4sekvVY80W/yNXfRniIIegvcXtPnwNKxnv4Qvaz6AOWpPjlDZn9Bw==", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn sort(mut a: [u32; 4]) -> [u32; 4] {\n for i in 1..4 {\n for j in 0..i {\n if a[i] < a[j] {\n let c = a[j];\n a[j] = a[i];\n a[i] = c;\n }\n }\n }\n a\n}\n\nfn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //Test case for short-circuit\n let mut data = [0 as u32; 32];\n let mut ba = a;\n for i in 0..32 {\n let i_u32 = i as u32;\n if i_u32 == a {\n for j in 0..4 {\n data[i + j] = c[4 - 1 - j];\n for k in 0..4 {\n ba = ba + data[k];\n }\n if ba == 4864 {\n c[3] = ba;\n }\n }\n }\n }\n assert(data[31] == 0);\n assert(ba != 13);\n //Test case for conditional with arrays from function parameters\n let b = sort([1, 2, 3, 4]);\n assert(b[0] == 1);\n\n if a == 0 {\n must_be_zero(0);\n c[0] = 3;\n } else {\n must_be_zero(1);\n c[0] = 1;\n c[1] = c[2] / a + 11 % a;\n let f1 = a as Field;\n assert(10 / f1 != 0);\n }\n assert(c[0] == 3);\n\n let mut y = 0;\n if a == 0 {\n let digest = std::hash::blake3(x);\n y = digest[0];\n } else {\n y = 5;\n }\n assert(y == result[0]);\n c = sort(c);\n assert(c[0] == 0);\n //test 1\n let mut x: u32 = 0;\n if a == 0 {\n c[0] = 12;\n if a != 0 {\n x = 6;\n } else {\n x = 2;\n assert(x == 2);\n }\n } else {\n x = 5;\n assert(x == 5);\n }\n if c[0] == 0 {\n x = 3;\n }\n assert(x == 2);\n //test2: loops\n let mut x: u32 = 0;\n x = a - a;\n for i in 0..4 {\n if c[i] == 0 {\n x = i as u32 + 2;\n }\n }\n assert(x == 0);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index a1c5ea75a29..c959cb5c21c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -90,8 +90,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32878 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 42 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(5), offset_address: Relative(6) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U32) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U32) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U32) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U32) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Mov { destination: Relative(1), source: Direct(32836) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(2), source: Relative(5) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(3), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32846 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(4), source: Relative(5) }, Call { location: 101 }, Call { location: 102 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32878 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 100 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 93 }, Return, Return, Call { location: 525 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Mov { destination: Relative(10), source: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 121 }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Jump { location: 115 }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(13), bit_size: Integer(U1), value: 1 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4864 }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 135 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(15), location: 451 }, Jump { location: 138 }, Load { destination: Relative(14), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(2) }, JumpIf { condition: Relative(9), location: 145 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U1), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U1, lhs: Relative(9), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 153 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(10) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(11) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(12) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Mov { destination: Relative(5), source: Relative(10) }, Jump { location: 172 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(12) }, JumpIf { condition: Relative(9), location: 404 }, Jump { location: 175 }, Load { destination: Relative(5), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, Load { destination: Relative(9), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(5), location: 182 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U8), value: 0 }, JumpIf { condition: Relative(5), location: 226 }, Jump { location: 186 }, Const { destination: Relative(14), bit_size: Integer(U8), value: 1 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U8, lhs: Relative(14), rhs: Relative(9) }, JumpIf { condition: Relative(15), location: 191 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Load { destination: Relative(14), source_pointer: Relative(6) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 531 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Store { destination_pointer: Relative(16), source: Relative(10) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Div, bit_size: U32, lhs: Relative(14), rhs: Relative(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(18), op: Div, bit_size: U32, lhs: Relative(14), rhs: Relative(1) }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(18), rhs: Relative(1) }, BinaryIntOp { destination: Relative(17), op: Sub, bit_size: U32, lhs: Relative(14), rhs: Relative(19) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(17) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, JumpIf { condition: Relative(18), location: 209 }, Call { location: 553 }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 531 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(8) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Store { destination_pointer: Relative(6), source: Relative(16) }, Cast { destination: Relative(14), source: Relative(1), bit_size: Field }, Const { destination: Relative(1), bit_size: Field, value: 10 }, BinaryFieldOp { destination: Relative(15), op: Div, lhs: Relative(1), rhs: Relative(14) }, Const { destination: Relative(1), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(15), rhs: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(14), rhs: Relative(7) }, JumpIf { condition: Relative(1), location: 225 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Jump { location: 235 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 531 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Store { destination_pointer: Relative(6), source: Relative(7) }, Jump { location: 235 }, Load { destination: Relative(1), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(7), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(11) }, JumpIf { condition: Relative(1), location: 242 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(9) }, JumpIf { condition: Relative(5), location: 250 }, Jump { location: 247 }, Const { destination: Relative(3), bit_size: Integer(U8), value: 5 }, Store { destination_pointer: Relative(1), source: Relative(3) }, Jump { location: 262 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(9), size: Relative(14) }, output: HeapArray { pointer: Relative(15), size: 32 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Load { destination: Relative(3), source_pointer: Relative(9) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Jump { location: 262 }, Load { destination: Relative(7), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, Load { destination: Relative(1), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U8, lhs: Relative(7), rhs: Relative(1) }, JumpIf { condition: Relative(4), location: 269 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 276 }, Call { location: 556 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, Mov { destination: Relative(3), source: Relative(10) }, Jump { location: 283 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(12) }, JumpIf { condition: Relative(1), location: 357 }, Jump { location: 286 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Store { destination_pointer: Relative(6), source: Relative(1) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 294 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(7) } }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, JumpIf { condition: Relative(5), location: 302 }, Jump { location: 299 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 5 }, Store { destination_pointer: Relative(3), source: Relative(1) }, Jump { location: 317 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 531 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Store { destination_pointer: Relative(9), source: Relative(4) }, Store { destination_pointer: Relative(6), source: Relative(7) }, JumpIf { condition: Relative(5), location: 315 }, Jump { location: 312 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 6 }, Store { destination_pointer: Relative(3), source: Relative(1) }, Jump { location: 317 }, Store { destination_pointer: Relative(3), source: Relative(8) }, Jump { location: 317 }, Load { destination: Relative(1), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(4), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(1), location: 323 }, Jump { location: 325 }, Store { destination_pointer: Relative(3), source: Relative(11) }, Jump { location: 325 }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(3), location: 330 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Mov { destination: Relative(1), source: Relative(2) }, Jump { location: 335 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, JumpIf { condition: Relative(4), location: 344 }, Jump { location: 338 }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 343 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Return, Load { destination: Relative(4), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 351 }, Jump { location: 354 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Jump { location: 354 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 335 }, Mov { destination: Relative(1), source: Relative(2) }, Jump { location: 359 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(7), location: 365 }, Jump { location: 362 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(10) }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 283 }, Load { destination: Relative(7), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 372 }, Call { location: 559 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(14) }, JumpIf { condition: Relative(7), location: 378 }, Jump { location: 401 }, Load { destination: Relative(7), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Load { destination: Relative(14), source_pointer: Relative(16) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 531 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(1) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 531 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, Store { destination_pointer: Relative(16), source: Relative(9) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Jump { location: 401 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Mov { destination: Relative(1), source: Relative(7) }, Jump { location: 359 }, Mov { destination: Relative(9), source: Relative(2) }, Jump { location: 406 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(15), location: 412 }, Jump { location: 409 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, Mov { destination: Relative(5), source: Relative(9) }, Jump { location: 172 }, Load { destination: Relative(15), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(5) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(12) }, JumpIf { condition: Relative(17), location: 419 }, Call { location: 559 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(9) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(16), rhs: Relative(17) }, JumpIf { condition: Relative(15), location: 425 }, Jump { location: 448 }, Load { destination: Relative(15), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(9) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(5) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 531 }, Mov { destination: Relative(18), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(9) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(18) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 531 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(5) }, Store { destination_pointer: Relative(19), source: Relative(16) }, Store { destination_pointer: Relative(14), source: Relative(15) }, Jump { location: 448 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, Mov { destination: Relative(9), source: Relative(15) }, Jump { location: 406 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, JumpIf { condition: Relative(15), location: 454 }, Jump { location: 460 }, Mov { destination: Relative(15), source: Relative(2) }, Jump { location: 456 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, JumpIf { condition: Relative(16), location: 463 }, Jump { location: 459 }, Jump { location: 460 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, Mov { destination: Relative(5), source: Relative(15) }, Jump { location: 135 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(15) }, BinaryIntOp { destination: Relative(18), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(17) }, JumpIf { condition: Relative(18), location: 467 }, Call { location: 553 }, Load { destination: Relative(18), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(19), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, JumpIf { condition: Relative(20), location: 472 }, Call { location: 562 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(19), rhs: Relative(12) }, JumpIf { condition: Relative(20), location: 475 }, Call { location: 559 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(19) }, Load { destination: Relative(20), source_pointer: Relative(22) }, Load { destination: Relative(18), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(17), rhs: Relative(9) }, JumpIf { condition: Relative(19), location: 482 }, Call { location: 559 }, Mov { destination: Direct(32771), source: Relative(18) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 531 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(17) }, Store { destination_pointer: Relative(22), source: Relative(20) }, Store { destination_pointer: Relative(8), source: Relative(19) }, Mov { destination: Relative(16), source: Relative(2) }, Jump { location: 492 }, BinaryIntOp { destination: Relative(17), op: LessThan, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, JumpIf { condition: Relative(17), location: 512 }, Jump { location: 495 }, Load { destination: Relative(16), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, JumpIf { condition: Relative(17), location: 499 }, Jump { location: 509 }, Load { destination: Relative(16), source_pointer: Relative(7) }, Load { destination: Relative(17), source_pointer: Relative(6) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 531 }, Mov { destination: Relative(18), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(12) }, Store { destination_pointer: Relative(19), source: Relative(16) }, Store { destination_pointer: Relative(6), source: Relative(18) }, Jump { location: 509 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Mov { destination: Relative(15), source: Relative(16) }, Jump { location: 456 }, Load { destination: Relative(17), source_pointer: Relative(7) }, Load { destination: Relative(18), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(16) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(19) }, BinaryIntOp { destination: Relative(20), op: LessThanEquals, bit_size: U32, lhs: Relative(17), rhs: Relative(18) }, JumpIf { condition: Relative(20), location: 521 }, Call { location: 553 }, Store { destination_pointer: Relative(7), source: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Mov { destination: Relative(16), source: Relative(17) }, Jump { location: 492 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 530 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 535 }, Jump { location: 537 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 552 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 549 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 542 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 552 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn sort(mut a: [u32; 4]) -> [u32; 4] {\n for i in 1..4 {\n for j in 0..i {\n if a[i] < a[j] {\n let c = a[j];\n a[j] = a[i];\n a[i] = c;\n }\n }\n }\n a\n}\n\nfn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //Test case for short-circuit\n let mut data = [0 as u32; 32];\n let mut ba = a;\n for i in 0..32 {\n let i_u32 = i as u32;\n if i_u32 == a {\n for j in 0..4 {\n data[i + j] = c[4 - 1 - j];\n for k in 0..4 {\n ba = ba + data[k];\n }\n if ba == 4864 {\n c[3] = ba;\n }\n }\n }\n }\n assert(data[31] == 0);\n assert(ba != 13);\n //Test case for conditional with arrays from function parameters\n let b = sort([1, 2, 3, 4]);\n assert(b[0] == 1);\n\n if a == 0 {\n must_be_zero(0);\n c[0] = 3;\n } else {\n must_be_zero(1);\n c[0] = 1;\n c[1] = c[2] / a + 11 % a;\n let f1 = a as Field;\n assert(10 / f1 != 0);\n }\n assert(c[0] == 3);\n\n let mut y = 0;\n if a == 0 {\n let digest = std::hash::blake3(x);\n y = digest[0];\n } else {\n y = 5;\n }\n assert(y == result[0]);\n c = sort(c);\n assert(c[0] == 0);\n //test 1\n let mut x: u32 = 0;\n if a == 0 {\n c[0] = 12;\n if a != 0 {\n x = 6;\n } else {\n x = 2;\n assert(x == 2);\n }\n } else {\n x = 5;\n assert(x == 5);\n }\n if c[0] == 0 {\n x = 3;\n }\n assert(x == 2);\n //test2: loops\n let mut x: u32 = 0;\n x = a - a;\n for i in 0..4 {\n if c[i] == 0 {\n x = i as u32 + 2;\n }\n }\n assert(x == 0);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 93a047008db..0cd20770cf7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -157,8 +157,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "nZTdboMgHEffhWsv+AZ9lWVprKWLiVFjdcnS9N33V3507sJm4+pU6TlQaLizSzgvH6e2vw43Vr3d2Xlqu679OHVDU8/t0NPb+6Ng6fE0TyHQK7YbJ2usp9DPrOqXrivYZ90t25duY91vnOuJRnnBQn8hUvDadmH99Ch+bH6sCiEhC1E+dfN3X7nka5njmzL5Nmt+Y5Lv+JGvj32lNXxlRI5v0/4p6458+8Lnaf+UUDm/36fDF95m+JIL+JL7HF+m9UuVNb9WybeH8wtxHDA8/YGMLLMCOp2gMccrUC+3sHzuodxtwj8Kij8Lyu8L7/RQN+30695gWlKwYFpF6AhDOsGSSHARPqJkFR2U4azyBBEhI9YKzW80aEAKrbeDcXH1xoNlpOWgACWoQA0a0ILoWfQseg49h55Dz6Hn0HPoOfQceg49h55Hz6Pn0fPoefQ8eh49j57feo/12Ka2PncBV/Z16ZvdDT5/jWkk3fHjNDThskxhPbVtjM7xGw==", + "debug_symbols": "nZVLboMwFEX34jED/22ylaqKCHEqJASIQKUqyt77wNcJHThKGZ2Ac48/7wE3dg6n+evYdJf+yg4fN3Yam7Ztvo5tX1dT03d093YvWLo8TmMIdIttxik1VGPoJnbo5rYt2HfVzuufrkPVrZyqkUZ5wUJ3JpLw0rRh+XUvnmmejwohERaifMTN+3nlUl7LPXlTprzdNb8xKe94Lq/zeaU18sqIPXmbzk9Zl8vbF3mezk8JtWf/PhVfeLsjL7lAXnK/Jy/T+qXaNb9WKW+z8wuRFxieGsjIbAMtTZ7vYJuOgJr5uQd6HN5eg05NYEx+E/plFcpHGeTmHP9hUPxhUH5r+KSLqm7GP68epiUJC6ZVhI4wFCdYChJchI8o2YFqbTg7eIKIkBGLheY3GjSgXQ6V6OLqjQfLSMtBAUpQgRo0oAXhs/BZ+Bx8Dj4Hn4PPwefgc/A5+Bx8Dj4Pn4fPw+fh8/B5+Dx8Hj6/+u5L2camOrUBb/3L3NWbj8D0M6SR9JkYxr4O53kMS9XWMarjLw==", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //regression for short-circuit2\n if 35 == a {\n assert(false);\n }\n bar(a as Field);\n\n if a == 3 {\n c = test4();\n }\n assert(c[1] != 2);\n call_intrinsic(x, result);\n}\n\nfn foo() {\n let mut x = 1;\n x /= 0;\n}\n\nfn bar(x: Field) {\n if x == 15 {\n foo();\n }\n}\n\nfn call_intrinsic(x: [u8; 5], result: [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n\nfn test4() -> [u32; 4] {\n let b: [u32; 4] = [1, 2, 3, 4];\n b\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_0.snap index 93a047008db..0cd20770cf7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_0.snap @@ -157,8 +157,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "nZTdboMgHEffhWsv+AZ9lWVprKWLiVFjdcnS9N33V3507sJm4+pU6TlQaLizSzgvH6e2vw43Vr3d2Xlqu679OHVDU8/t0NPb+6Ng6fE0TyHQK7YbJ2usp9DPrOqXrivYZ90t25duY91vnOuJRnnBQn8hUvDadmH99Ch+bH6sCiEhC1E+dfN3X7nka5njmzL5Nmt+Y5Lv+JGvj32lNXxlRI5v0/4p6458+8Lnaf+UUDm/36fDF95m+JIL+JL7HF+m9UuVNb9WybeH8wtxHDA8/YGMLLMCOp2gMccrUC+3sHzuodxtwj8Kij8Lyu8L7/RQN+30695gWlKwYFpF6AhDOsGSSHARPqJkFR2U4azyBBEhI9YKzW80aEAKrbeDcXH1xoNlpOWgACWoQA0a0ILoWfQseg49h55Dz6Hn0HPoOfQceg49h55Hz6Pn0fPoefQ8eh49j57feo/12Ka2PncBV/Z16ZvdDT5/jWkk3fHjNDThskxhPbVtjM7xGw==", + "debug_symbols": "nZVLboMwFEX34jED/22ylaqKCHEqJASIQKUqyt77wNcJHThKGZ2Ac48/7wE3dg6n+evYdJf+yg4fN3Yam7Ztvo5tX1dT03d093YvWLo8TmMIdIttxik1VGPoJnbo5rYt2HfVzuufrkPVrZyqkUZ5wUJ3JpLw0rRh+XUvnmmejwohERaifMTN+3nlUl7LPXlTprzdNb8xKe94Lq/zeaU18sqIPXmbzk9Zl8vbF3mezk8JtWf/PhVfeLsjL7lAXnK/Jy/T+qXaNb9WKW+z8wuRFxieGsjIbAMtTZ7vYJuOgJr5uQd6HN5eg05NYEx+E/plFcpHGeTmHP9hUPxhUH5r+KSLqm7GP68epiUJC6ZVhI4wFCdYChJchI8o2YFqbTg7eIKIkBGLheY3GjSgXQ6V6OLqjQfLSMtBAUpQgRo0oAXhs/BZ+Bx8Dj4Hn4PPwefgc/A5+Bx8Dj4Pn4fPw+fh8/B5+Dx8Hj6/+u5L2camOrUBb/3L3NWbj8D0M6SR9JkYxr4O53kMS9XWMarjLw==", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //regression for short-circuit2\n if 35 == a {\n assert(false);\n }\n bar(a as Field);\n\n if a == 3 {\n c = test4();\n }\n assert(c[1] != 2);\n call_intrinsic(x, result);\n}\n\nfn foo() {\n let mut x = 1;\n x /= 0;\n}\n\nfn bar(x: Field) {\n if x == 15 {\n foo();\n }\n}\n\nfn call_intrinsic(x: [u8; 5], result: [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n\nfn test4() -> [u32; 4] {\n let b: [u32; 4] = [1, 2, 3, 4];\n b\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 93a047008db..0cd20770cf7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -157,8 +157,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "nZTdboMgHEffhWsv+AZ9lWVprKWLiVFjdcnS9N33V3507sJm4+pU6TlQaLizSzgvH6e2vw43Vr3d2Xlqu679OHVDU8/t0NPb+6Ng6fE0TyHQK7YbJ2usp9DPrOqXrivYZ90t25duY91vnOuJRnnBQn8hUvDadmH99Ch+bH6sCiEhC1E+dfN3X7nka5njmzL5Nmt+Y5Lv+JGvj32lNXxlRI5v0/4p6458+8Lnaf+UUDm/36fDF95m+JIL+JL7HF+m9UuVNb9WybeH8wtxHDA8/YGMLLMCOp2gMccrUC+3sHzuodxtwj8Kij8Lyu8L7/RQN+30695gWlKwYFpF6AhDOsGSSHARPqJkFR2U4azyBBEhI9YKzW80aEAKrbeDcXH1xoNlpOWgACWoQA0a0ILoWfQseg49h55Dz6Hn0HPoOfQceg49h55Hz6Pn0fPoefQ8eh49j57feo/12Ka2PncBV/Z16ZvdDT5/jWkk3fHjNDThskxhPbVtjM7xGw==", + "debug_symbols": "nZVLboMwFEX34jED/22ylaqKCHEqJASIQKUqyt77wNcJHThKGZ2Ac48/7wE3dg6n+evYdJf+yg4fN3Yam7Ztvo5tX1dT03d093YvWLo8TmMIdIttxik1VGPoJnbo5rYt2HfVzuufrkPVrZyqkUZ5wUJ3JpLw0rRh+XUvnmmejwohERaifMTN+3nlUl7LPXlTprzdNb8xKe94Lq/zeaU18sqIPXmbzk9Zl8vbF3mezk8JtWf/PhVfeLsjL7lAXnK/Jy/T+qXaNb9WKW+z8wuRFxieGsjIbAMtTZ7vYJuOgJr5uQd6HN5eg05NYEx+E/plFcpHGeTmHP9hUPxhUH5r+KSLqm7GP68epiUJC6ZVhI4wFCdYChJchI8o2YFqbTg7eIKIkBGLheY3GjSgXQ6V6OLqjQfLSMtBAUpQgRo0oAXhs/BZ+Bx8Dj4Hn4PPwefgc/A5+Bx8Dj4Pn4fPw+fh8/B5+Dx8Hj6/+u5L2camOrUBb/3L3NWbj8D0M6SR9JkYxr4O53kMS9XWMarjLw==", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //regression for short-circuit2\n if 35 == a {\n assert(false);\n }\n bar(a as Field);\n\n if a == 3 {\n c = test4();\n }\n assert(c[1] != 2);\n call_intrinsic(x, result);\n}\n\nfn foo() {\n let mut x = 1;\n x /= 0;\n}\n\nfn bar(x: Field) {\n if x == 15 {\n foo();\n }\n}\n\nfn call_intrinsic(x: [u8; 5], result: [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n\nfn test4() -> [u32; 4] {\n let b: [u32; 4] = [1, 2, 3, 4];\n b\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index c6cac92878b..62337f1483a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -78,12 +78,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32879 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 42 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32837), size_address: Relative(5), offset_address: Relative(6) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U32) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U32) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U32) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U32) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Cast { destination: Direct(32878), source: Direct(32878), bit_size: Integer(U8) }, Mov { destination: Relative(1), source: Direct(32837) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(2), source: Relative(5) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(3), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32847 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(4), source: Relative(5) }, Call { location: 101 }, Call { location: 104 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32879 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 100 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 93 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 1 }, Return, Call { location: 162 }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 35 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U1), value: 0 }, JumpIf { condition: Relative(6), location: 113 }, Jump { location: 118 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U1, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 117 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(7) } }, Jump { location: 118 }, Cast { destination: Relative(6), source: Relative(1), bit_size: Field }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 168 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(6) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 2 }, JumpIf { condition: Relative(7), location: 130 }, Jump { location: 146 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Direct(32836) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Jump { location: 146 }, Load { destination: Relative(6), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(6), rhs: Relative(2) }, JumpIf { condition: Relative(1), location: 154 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Const { destination: Relative(1), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(3) }, Mov { destination: Relative(7), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 178 }, Mov { destination: Direct(0), source: Relative(0) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 167 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 162 }, Const { destination: Relative(2), bit_size: Field, value: 15 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 173 }, Jump { location: 177 }, Const { destination: Relative(1), bit_size: Field, value: 1 }, Const { destination: Relative(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Relative(3), op: Div, lhs: Relative(1), rhs: Relative(2) }, Jump { location: 177 }, Return, Call { location: 162 }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 185 }, Call { location: 207 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(5), size: Relative(6) }, output: HeapArray { pointer: Relative(7), size: 32 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 210 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(7) }, JumpIf { condition: Relative(1), location: 206 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 162 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 220 }, Call { location: 207 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 226 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, JumpIf { condition: Relative(5), location: 231 }, Jump { location: 229 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U8, lhs: Relative(6), rhs: Relative(8) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(9) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 226 }]" ], - "debug_symbols": "pZbNbuJAEITfxWcO0z3/vEoURQ6YyJJlkAMrrRDvvt2hC9gDUTS5UJ/xVHnc7rHn3G2H99PH2zjv9p/d+uXcvS/jNI0fb9N+0x/H/Sz/njunP+RKt6aVaL0q+W7NqsE0miZTGe9VZXwQZWdKpmzqTYOp5ETVdFUvvqxKpmzqTYNpNE2m2bSY1qsGywuWFywvWF6QvKSaTCWnqBZTyami0ZmSKZt6U8khpxABCZABBVANkgPoP1rn7AASTFrRHAARAHuBvRCAAR6AiRVMrGBiRSemD6EUQDWoDkAABnhAAGiyPryaABlQAPUK7ByAAAzwgACwZCYMJgwmDNaOpKQQAQmQAQVQDbQ/r0AAuFjHSG+wxyltQioKHhAAetGqkAAZIBdlUkCgNuMVNDlfLqsOS+/tuAyDrryHtSgr9NAvw3zs1vNpmlbdn346fQ36PPTzlx77Rc7KwxzmragE7sZpULqs7m733ErEZpale7PHn/t9hj9wiz9W+FPT9WOEP7sWf0HxZF00+KWNzc+uPPOn5/7E8CduqR8z6i/t+kt/0/0HD38qDX4fgvl9bJm/T+hfn/Izv/b40wCHAnjyDRMIAQ0cmho4BtxAjC0FlFcsKigv2XBP+HkHu3prYV9bAugewKklwLv7DMpvZ/DsFvi7KjLd3mPs3WPCqxz0m3H5b5d00ahl7N+nwQ53p3nzcPb494Az2GUdlv1m2J6WQZPuWy35pLxUtyLnXnW/JUckPU0p66F8J15YOpRdfb3oXP4B", + "debug_symbols": "pZbNbuJAEITfxWcO0z3/vEoURQZMZMkyyIGVVoh33+7QBezBEXIu1Gc8VR7a3caXZtdtzp8f/bg/fDXrt0uzmfph6D8/hsO2PfWHUb69NE4/yJVmTSvRelPyzZpVg2k0Taay3qvK+iDKzpRM2dSbBlPJiarppl58WZVM2dSbBtNomkyzaTGtNw2WFywvWF6wvCB5STWZSk5RLaaSU0WjMyVTNvWmkkNOIQISIAMKoBokB9BvtM7ZASSYtKI5ACIA9gJ7IQADPAAbK9hYwcaKbkyLXgqgGlQHIAADPCAANFmLVxMgAwqg3oCdAxCAAR4QAJbMhMWExYTF2pGUFSIgATKgAKqB9ucNCAAX6xq59+xxSpuQqoIHBIDOgVNIgAyQizIrIFCb8QaaXK7XVYPR+zhNXaeT9zSLMqHHdurGU7Mez8Owav60w/l70dexHb/11E5yVq7WjTtRCdz3Q6d0XT3cbt5KxGaW0b3b4+t+n+EPvMQfK/xp0fVjhD+7Jf6C4slcLPBLG5ufXZnzp3l/YvgTL6kfM+ov7fpL/6LfHzz8qSzw+xDM7+OS/fuE/vUpz/m1x2cDHArgyS/YQAho4DDfwBR+mqCEFpBhetwDGccXtxADahDjknsgT2ncBHlOh0fC60Pg6n0KfF0SQI8ATksCvHvsoPx2B3M/QYd1topM90che/ec8C4H7baf/nvRumrU1LebobPD/XncPp09/T3iDF7UjtNh2+3OU6dJj7c1+Vd6q25Fzr3rK5sckYwFpayH8lfzxtLk7Or7VffyDw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //regression for short-circuit2\n if 35 == a {\n assert(false);\n }\n bar(a as Field);\n\n if a == 3 {\n c = test4();\n }\n assert(c[1] != 2);\n call_intrinsic(x, result);\n}\n\nfn foo() {\n let mut x = 1;\n x /= 0;\n}\n\nfn bar(x: Field) {\n if x == 15 {\n foo();\n }\n}\n\nfn call_intrinsic(x: [u8; 5], result: [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n\nfn test4() -> [u32; 4] {\n let b: [u32; 4] = [1, 2, 3, 4];\n b\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_0.snap index 7bfc65c1a2e..3c030578da5 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_0.snap @@ -78,12 +78,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32878 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 42 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(5), offset_address: Relative(6) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U32) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U32) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U32) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U32) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Mov { destination: Relative(1), source: Direct(32836) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(2), source: Relative(5) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(3), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32846 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(4), source: Relative(5) }, Call { location: 101 }, Call { location: 102 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32878 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 100 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 93 }, Return, Return, Call { location: 208 }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 35 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(6), location: 112 }, Jump { location: 117 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U1, lhs: Relative(2), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 116 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Jump { location: 117 }, Cast { destination: Relative(6), source: Relative(1), bit_size: Field }, Const { destination: Relative(8), bit_size: Field, value: 15 }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 122 }, Jump { location: 126 }, Const { destination: Relative(6), bit_size: Field, value: 1 }, Const { destination: Relative(8), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Relative(9), op: Div, lhs: Relative(6), rhs: Relative(8) }, Jump { location: 126 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(6) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, JumpIf { condition: Relative(8), location: 132 }, Jump { location: 148 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(1) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(6) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Jump { location: 148 }, Load { destination: Relative(8), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(8), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 156 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Load { destination: Relative(2), source_pointer: Relative(3) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 162 }, Call { location: 214 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(8), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 32 } }), Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 181 }, Call { location: 214 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 187 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(10) }, JumpIf { condition: Relative(5), location: 195 }, Jump { location: 190 }, Load { destination: Relative(1), source_pointer: Relative(3) }, JumpIf { condition: Relative(1), location: 194 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, Load { destination: Relative(5), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Load { destination: Relative(9), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(8), rhs: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(8) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Mov { destination: Relative(6), source: Relative(5) }, Jump { location: 187 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 213 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tZbLbvIwEIXfJess7BlfeZUKoQChihQFlMIv/UK8e2fAh9BFqipVN5zPxOf4komTa7Vvt5f3TTccjh/V6u1abceu77v3TX/cNefuOMi/18rojzWhWtlaND7UUrUiVS7qivqi0o9VU7XyqvmhJL6oykVdUclPqvGhLP2sUWCAA3hAAERAAuQCzgAsAMkOyQ7JDslOkrNqKqpxumxvABqnC/UEYIADeIBO1ClEQALkAsEALIAADNBk3cXgAQEQAQmQC0QDsABN1l2PDHAATdYbEAMgAhIgF0gGYAEEgCtrH93DrH2CAgEYgEGzDEp6A3IEJIAMSrLzZAzAArQWWYEfY5FxAE3Ot1tdoaY357FttaRfilxK/9SM7XCuVsOl7+vqX9Nf7p0+Ts1w13MzylWZSDvsRSXw0PWt0q2e3GbearUS7mZ5Fp52/3M/R/gdLfH7DH9YNL738Ecz53fzfnau+NnbJf6A/eMQ5/zhG7/B/rHlJetPuPk2hQV+KdfiJ5Pm/HneHwj+QEvuPxHWT2x/6V+0fsfwh9n1W/7DAG/wBHjKiwIcStD7+RmEPwyQ4xBPkRyIbor4cYIcn/lZh5wXJdgpgcKiBDbTHNKv5zC3CqJvdpLs8zwlNq8Ja2k0u2788hl006ixa7Z9W5qHy7B7uXr+f8IVfEadxuOu3V/GVpOmbyl5Sb1lU1tj1vpBJS05EWqyrE2rTXnZkw3rm87lEw==", + "debug_symbols": "tZbNbuowEIXfJess7Bn/8ipVhQKEKlIUUApXukK8+50BH8JdBKFU3XQ+Nz7HHntsfKl27eb8te6G/eG7Wn1cqs3Y9X33te4P2+bUHQb576Uy+seaUK1sLTHeo6VqRRq5RFeiL1H6scZUrbzGfI8kuqiRS3Qlin/SGO+RpZ81CgxwAA8IgAhIgFzAGYAFwNnB2cHZwdmJc9aYSlQ7TdsbgNppop4ADHAAD9CJOoUISIBcIBiABRCAAeocFDwgACIgAXKBaAAWoM66ypEBDqDOmnIMgAhIgFwgGYAFEACqLH1I1zRrH93qTAAGYNAsg5Iub46ABJBBSRaTjAFYgNaiU+D7WGQcQMvRXK91hZpen8a21ZJ+KnIp/WMztsOpWg3nvq+rP01/vnX6PjbDLZ6aUb6KZTvsJIrhvutbpWs9qc281Gol3MRyFh5y/76eI/SOluh9hj4sGt976KOZ07t5PTtX9OztEn3A+nGIc/rwQm+wfmx5Sf4Jm29TWKCXci16MmlOn+f1gaAPtGT/iZA/sf2hflH+jqEPs/lb/kUDb3ACPM2eAOtfHcGAPZDTOC2CnOe35+BQxd7PJxF/0UBuVBxEuVPdZPG2g9zA+VHKnBc52MmBwiIHNtMc0o/nMJcFvdhLS/ZxJRObZ4dPaTTbbvzvJXVVq7FrNn1bmvvzsH36evp7xBe8xI7jYdvuzmOrTtNzTH7nPrKprTGf+iaTllwqNVnWptWmvBfIhs+rzuUf", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //regression for short-circuit2\n if 35 == a {\n assert(false);\n }\n bar(a as Field);\n\n if a == 3 {\n c = test4();\n }\n assert(c[1] != 2);\n call_intrinsic(x, result);\n}\n\nfn foo() {\n let mut x = 1;\n x /= 0;\n}\n\nfn bar(x: Field) {\n if x == 15 {\n foo();\n }\n}\n\nfn call_intrinsic(x: [u8; 5], result: [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n\nfn test4() -> [u32; 4] {\n let b: [u32; 4] = [1, 2, 3, 4];\n b\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 7bfc65c1a2e..3c030578da5 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -78,12 +78,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32878 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 42 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(5), offset_address: Relative(6) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U32) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U32) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U32) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U32) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Cast { destination: Direct(32869), source: Direct(32869), bit_size: Integer(U8) }, Cast { destination: Direct(32870), source: Direct(32870), bit_size: Integer(U8) }, Cast { destination: Direct(32871), source: Direct(32871), bit_size: Integer(U8) }, Cast { destination: Direct(32872), source: Direct(32872), bit_size: Integer(U8) }, Cast { destination: Direct(32873), source: Direct(32873), bit_size: Integer(U8) }, Cast { destination: Direct(32874), source: Direct(32874), bit_size: Integer(U8) }, Cast { destination: Direct(32875), source: Direct(32875), bit_size: Integer(U8) }, Cast { destination: Direct(32876), source: Direct(32876), bit_size: Integer(U8) }, Cast { destination: Direct(32877), source: Direct(32877), bit_size: Integer(U8) }, Mov { destination: Relative(1), source: Direct(32836) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(2), source: Relative(5) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(3), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32846 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(7) }, Mov { destination: Direct(32773), source: Relative(6) }, Call { location: 90 }, Mov { destination: Relative(4), source: Relative(5) }, Call { location: 101 }, Call { location: 102 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32878 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 100 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 93 }, Return, Return, Call { location: 208 }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 35 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(6), location: 112 }, Jump { location: 117 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U1, lhs: Relative(2), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 116 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Jump { location: 117 }, Cast { destination: Relative(6), source: Relative(1), bit_size: Field }, Const { destination: Relative(8), bit_size: Field, value: 15 }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 122 }, Jump { location: 126 }, Const { destination: Relative(6), bit_size: Field, value: 1 }, Const { destination: Relative(8), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Relative(9), op: Div, lhs: Relative(6), rhs: Relative(8) }, Jump { location: 126 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(6) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, JumpIf { condition: Relative(8), location: 132 }, Jump { location: 148 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(1) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(6) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Jump { location: 148 }, Load { destination: Relative(8), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(8), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 156 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Load { destination: Relative(2), source_pointer: Relative(3) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 162 }, Call { location: 214 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(8), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 32 } }), Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 181 }, Call { location: 214 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 187 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(10) }, JumpIf { condition: Relative(5), location: 195 }, Jump { location: 190 }, Load { destination: Relative(1), source_pointer: Relative(3) }, JumpIf { condition: Relative(1), location: 194 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, Load { destination: Relative(5), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Load { destination: Relative(9), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(8), rhs: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(8) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Mov { destination: Relative(6), source: Relative(5) }, Jump { location: 187 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 213 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tZbLbvIwEIXfJess7BlfeZUKoQChihQFlMIv/UK8e2fAh9BFqipVN5zPxOf4komTa7Vvt5f3TTccjh/V6u1abceu77v3TX/cNefuOMi/18rojzWhWtlaND7UUrUiVS7qivqi0o9VU7XyqvmhJL6oykVdUclPqvGhLP2sUWCAA3hAAERAAuQCzgAsAMkOyQ7JDslOkrNqKqpxumxvABqnC/UEYIADeIBO1ClEQALkAsEALIAADNBk3cXgAQEQAQmQC0QDsABN1l2PDHAATdYbEAMgAhIgF0gGYAEEgCtrH93DrH2CAgEYgEGzDEp6A3IEJIAMSrLzZAzAArQWWYEfY5FxAE3Ot1tdoaY357FttaRfilxK/9SM7XCuVsOl7+vqX9Nf7p0+Ts1w13MzylWZSDvsRSXw0PWt0q2e3GbearUS7mZ5Fp52/3M/R/gdLfH7DH9YNL738Ecz53fzfnau+NnbJf6A/eMQ5/zhG7/B/rHlJetPuPk2hQV+KdfiJ5Pm/HneHwj+QEvuPxHWT2x/6V+0fsfwh9n1W/7DAG/wBHjKiwIcStD7+RmEPwyQ4xBPkRyIbor4cYIcn/lZh5wXJdgpgcKiBDbTHNKv5zC3CqJvdpLs8zwlNq8Ja2k0u2788hl006ixa7Z9W5qHy7B7uXr+f8IVfEadxuOu3V/GVpOmbyl5Sb1lU1tj1vpBJS05EWqyrE2rTXnZkw3rm87lEw==", + "debug_symbols": "tZbNbuowEIXfJess7Bn/8ipVhQKEKlIUUApXukK8+50BH8JdBKFU3XQ+Nz7HHntsfKl27eb8te6G/eG7Wn1cqs3Y9X33te4P2+bUHQb576Uy+seaUK1sLTHeo6VqRRq5RFeiL1H6scZUrbzGfI8kuqiRS3Qlin/SGO+RpZ81CgxwAA8IgAhIgFzAGYAFwNnB2cHZwdmJc9aYSlQ7TdsbgNppop4ADHAAD9CJOoUISIBcIBiABRCAAeocFDwgACIgAXKBaAAWoM66ypEBDqDOmnIMgAhIgFwgGYAFEACqLH1I1zRrH93qTAAGYNAsg5Iub46ABJBBSRaTjAFYgNaiU+D7WGQcQMvRXK91hZpen8a21ZJ+KnIp/WMztsOpWg3nvq+rP01/vnX6PjbDLZ6aUb6KZTvsJIrhvutbpWs9qc281Gol3MRyFh5y/76eI/SOluh9hj4sGt976KOZ07t5PTtX9OztEn3A+nGIc/rwQm+wfmx5Sf4Jm29TWKCXci16MmlOn+f1gaAPtGT/iZA/sf2hflH+jqEPs/lb/kUDb3ACPM2eAOtfHcGAPZDTOC2CnOe35+BQxd7PJxF/0UBuVBxEuVPdZPG2g9zA+VHKnBc52MmBwiIHNtMc0o/nMJcFvdhLS/ZxJRObZ4dPaTTbbvzvJXVVq7FrNn1bmvvzsH36evp7xBe8xI7jYdvuzmOrTtNzTH7nPrKprTGf+iaTllwqNVnWptWmvBfIhs+rzuUf", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "fn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //regression for short-circuit2\n if 35 == a {\n assert(false);\n }\n bar(a as Field);\n\n if a == 3 {\n c = test4();\n }\n assert(c[1] != 2);\n call_intrinsic(x, result);\n}\n\nfn foo() {\n let mut x = 1;\n x /= 0;\n}\n\nfn bar(x: Field) {\n if x == 15 {\n foo();\n }\n}\n\nfn call_intrinsic(x: [u8; 5], result: [u8; 32]) {\n let mut digest = std::hash::blake3(x);\n digest[0] = 5 as u8;\n digest = std::hash::blake3(x);\n assert(digest == result);\n}\n\nfn test4() -> [u32; 4] {\n let b: [u32; 4] = [1, 2, 3, 4];\n b\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__expanded.snap index e33f317df68..f56d34e6831 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__expanded.snap @@ -9,8 +9,8 @@ fn main(mut x: [u32; 4], y: [u32; 3], z: [u32; 4]) -> return_data [u32; 4] { result[idx] = y[idx] + z[idx]; } { - let i_3775: u32 = x[3]; - result[i_3775] = z[x[3]]; + let i_3778: u32 = x[3]; + result[i_3778] = z[x[3]]; }; result } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__expanded.snap index 63614e27df9..6483d85209d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__expanded.snap @@ -39,15 +39,15 @@ fn compute_encrypted_log( if flag { for i in 0..EPH_PK_SIZE { { - let i_3788: u32 = offset + i; - encrypted_bytes[i_3788] = eph_pk_bytes[i]; + let i_3791: u32 = offset + i; + encrypted_bytes[i_3791] = eph_pk_bytes[i]; } } offset = offset + EPH_PK_SIZE; for i in 0..HEADER_SIZE { { - let i_3790: u32 = offset + i; - encrypted_bytes[i_3790] = incoming_header_ciphertext[i]; + let i_3793: u32 = offset + i; + encrypted_bytes[i_3793] = incoming_header_ciphertext[i]; } } offset = offset + HEADER_SIZE; @@ -56,8 +56,8 @@ fn compute_encrypted_log( assert(size == incoming_body_ciphertext.len(), "ciphertext length mismatch"); for i in 0..size { { - let i_3793: u32 = offset + i; - encrypted_bytes[i_3793] = incoming_body_ciphertext[i]; + let i_3796: u32 = offset + i; + encrypted_bytes[i_3796] = incoming_body_ciphertext[i]; } } }; diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index a37bb6c1231..e7e8af3d5e7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -486,14 +486,14 @@ expression: artifact "unconstrained func 2", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "rZjNThtZEEbfxWsWXV/V/curjEaRQ0xkyTLIQKQRyrtP03XawMIocrLpD2ju0a3rOna1Xzbfd9+ef3zdH+/uHzdf/nnZfDvtD4f9j6+H+9vt0/7+OP/15dfNZv3169Npt5v/tHl3f171sD3tjk+bL8fnw+Fm83N7eF7+6fFhe1zyaXua7043m93x+5wz8G5/2L3+9OvmbfV0eWkYa1s5Ly4fV9vl1T56YX1Mk84EGx8I+oTQpwHBu972YP0DwS8TqmpAqBrTJYI+O4NS1yqs6U8JvV9DkHwlqMRVe5jOBJuuIng9v5pe2yXCJ/0QU9G5H9rFfviUIHsj+EXCJwgzj3UX88/lciG/D6n1SsiIMyQs/gJEfm059lZOsyshHn8BMvxdOf1KSG9/Dik+nSHFr4UoLkL+nX/b3u5PH971N9Pc2zcbW65arr5cY7mW5VqXa1uufbmOXMXiXG253HK9JcCSYImwZFhCLClKithDUpQUJUVJUVKUFCVFSfGkeFKcUpLiM2V+S/SSUTNmyvyyec8YS8SUYRla/jM8IylR8l7NSEokJZJSklKSUpJSklKSUnIvJfdSklKSUpJSk1KTUpXhGZGRe6lJqS2jZ4wl2pSRlJaUlpSWlJaUlhW13EvLvbTcS09Kt4ysqGdFPSvqSelJ6UnpSelJGVnRyL2M3MvIvYykjDyXkRWNrGhkRSMpNk2kkSKdDLKQlWxk4mzKEzKbSCNFwjN4Bs/gGTzrJPsT+xP7Ezw5GWQhKwlP8ATP4Tk8p15nf87+nP3R4OaNpF6n3qBeutwCXsALeHS60epGrxvNbnS7FXiF86PhjY43Wt4KvAKPrjfa3uh7o/GNzjda3+h9q/Aq50f7G/1vCGAVXoOHA4YEhgWGBoYHhgiGCdbgNc4PGQwbDB2sw+vwMMJQwnDCkMKwwtDC8MIGvMH5oYbhhiGHDXgDHn4IP4Qfwg/hh/BD+KEpeZoa2cmsV/ghg2fw8EP4IfwQfgg/hB/CDwmejBTpZJDwBA8/hB/CD+GH8EP4IfwQb//i/V/4IfwQfojPAPEhIPwQfgg/hB/CD+GH8EMBLzg//BB+CD9U4BV4+CH8EH4IP4Qfwg/hhyq8yvnhh/BD+KEKr8LDD+GH8EP4IfwQfgg/1OA1zg8/hB/CD3V4HR5+CD+EH8IP4YfwQ/ihAW9wfvgh/BB+aMAb8PBD+CH8cPxw/HD8cPzwiXFhYl7AD8cPxw+f4Bk8/HD8cPxw/HD8cPxw/HCDZ3l+jh+OH44fLniChx+OH44fjh+OH44fjh/u8NxJ6l3no3VAWiekdUTCD8cPxw/HD8cPxw/HDw94wfnhh+OH44czL3mBhx+OH44fjh+OH44fjh9e4VXODz8cPxw/nOnJKzz8cPxw/HD8cPxw/HD88AavcX5tHTCpFz+cWco7PPxw/HD8cPxw/HD88L5OrPA654cfjh+OH85k5QMefjh+OH74WEfgdQZmCMaPmBiDJ+Zg/Aj8CPwI5quYGIbxI2wdquHhR+BH4EfgRxg8a2Qns97Aj9A6pcPDj8CPwI/Aj8CPwI/Aj3B4buQ69lMvfgTzVeBH8PkRfH7E+gzBfBUBb32MwI/Aj1ifJNZHiVc/xmvOPHv97ujn9rTffjvsHvPrubvn4+27b+ue/ntY76zf5z2c7m93359Pu9dnvOXe/NT3Pw==", + "debug_symbols": "rZjLTiNJEEX/xWsWFTciX/0ro1HLgGlZsgwy0NII9b9PUXGKx8Ko5e5NXaDIQ0YSx47yy+Z2d/384/v+eHf/uPn2z8vm+rQ/HPY/vh/ub7ZP+/vj/NOXX1eb9dvvT6fdbv7R5sP9edXD9rQ7Pm2+HZ8Ph6vNz+3hefmlx4ftccmn7Wm+O11tdsfbOWfg3f6we/3q19X76un80jDWtvK2uHxebV+sjuKsj2jvf97GJ4LOE7xPA4J3ve/B+ieCnydU1YBQNaZzBH11BqWuVVjTnxJ6v4QgvZ2kSly0h+mNYNNFBK9lJXht5whf9UPR2otR4mw/fNlRfbwT7CzhC4SZh2DMX5fzhfw+pNYLISPeIGHxFyDyS8ux93KaXQjx+AuQ4R/K6RdCevtzSPHpDVL8UojiLOTf+bvtzf706VV/M829fbWx5arl6ss1lmtZrnW5tuXal+vIVSzO1ZbLLddbAiwJlghLhiXEkqKkiD0kRUlRUpQUJUVJUVKUFE+KJ8UpJSk+U+aXRC8ZNWOmzP827xljiZgyLEPLb4ZnJCVK3qsZSYmkRFJKUkpSSlJKUkpSSu6l5F5KUkpSSlJqUmpSqjI8IzJyLzUptWX0jLFEmzKS0pLSktKS0pLSsqKWe2m5l5Z76UnplpEV9ayoZ0U9KT0pPSk9KT0pIysauZeRexm5l5GUkecysqKRFY2saCTFpok0UqSTQRayko1MnE15QmYTaaRIeAbP4Bk8g2edZH9if2J/gicngyxkJeEJnuA5PIfn1Ovsz9mfsz8a3LyR1OvUG9RLl1vAC3gBj043Wt3odaPZjW63Aq9wfjS80fFGy1uBV+DR9UbbG31vNL7R+UbrG71vFV7l/Gh/o/8NAazCa/BwwJDAsMDQwPDAEMEwwRq8xvkhg2GDoYN1eB0eRhhKGE4YUhhWGFoYXtiANzg/1DDcMOSwAW/Aww/hh/BD+CH8EH4IPzQlT1MjO5n1Cj9k8Awefgg/hB/CD+GH8EP4IcGTkSKdDBKe4OGH8EP4IfwQfgg/hB/i5V+8/gs/hB/CD/EeIN4EhB/CD+GH8EP4IfwQfijgBeeHH8IP4YcKvAIPP4Qfwg/hh/BD+CH8UIVXOT/8EH4IP1ThVXj4IfwQfgg/hB/CD+GHGrzG+eGH8EP4oQ6vw8MP4YfwQ/gh/BB+CD804A3ODz+EH8IPDXgDHn4IP4Qfjh+OH44fjh8+MS5MzAv44fjh+OETPIOHH44fjh+OH44fjh+OH27wLM/P8cPxw/HDBU/w8MPxw/HD8cPxw/HD8cMdnjtJvet8tA5I64S0jkj44fjh+OH44fjh+OH44QEvOD/8cPxw/HDmJS/w8MPxw/HD8cPxw/HD8cMrvMr54Yfjh+OHMz15hYcfjh+OH44fjh+OH44f3uA1zq+tAyb14oczS3mHhx+OH44fjh+OH44f3teJFV7n/PDD8cPxw5msfMDDD8cPxw8f6wi8zsAMwfgRE2PwxByMH4EfgR/BfBUTwzB+hK1DNTz8CPwI/Aj8CINnjexk1hv4EVqndHj4EfgR+BH4EfgR+BH4EQ7PjVzHfurFj2C+CvwI3j+C949YnyGYryLgrY8R+BH4EeuTxPoo8erHeM2ZZ6+fV/zcnvbb68PuMT+eu3s+3nz4tO7pv4f1zvp53sPp/mZ3+3zavT7jLffmp77/AQ==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_0.snap index a37bb6c1231..e7e8af3d5e7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_0.snap @@ -486,14 +486,14 @@ expression: artifact "unconstrained func 2", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "rZjNThtZEEbfxWsWXV/V/curjEaRQ0xkyTLIQKQRyrtP03XawMIocrLpD2ju0a3rOna1Xzbfd9+ef3zdH+/uHzdf/nnZfDvtD4f9j6+H+9vt0/7+OP/15dfNZv3169Npt5v/tHl3f171sD3tjk+bL8fnw+Fm83N7eF7+6fFhe1zyaXua7043m93x+5wz8G5/2L3+9OvmbfV0eWkYa1s5Ly4fV9vl1T56YX1Mk84EGx8I+oTQpwHBu972YP0DwS8TqmpAqBrTJYI+O4NS1yqs6U8JvV9DkHwlqMRVe5jOBJuuIng9v5pe2yXCJ/0QU9G5H9rFfviUIHsj+EXCJwgzj3UX88/lciG/D6n1SsiIMyQs/gJEfm059lZOsyshHn8BMvxdOf1KSG9/Dik+nSHFr4UoLkL+nX/b3u5PH971N9Pc2zcbW65arr5cY7mW5VqXa1uufbmOXMXiXG253HK9JcCSYImwZFhCLClKithDUpQUJUVJUVKUFCVFSfGkeFKcUpLiM2V+S/SSUTNmyvyyec8YS8SUYRla/jM8IylR8l7NSEokJZJSklKSUpJSklKSUnIvJfdSklKSUpJSk1KTUpXhGZGRe6lJqS2jZ4wl2pSRlJaUlpSWlJaUlhW13EvLvbTcS09Kt4ysqGdFPSvqSelJ6UnpSelJGVnRyL2M3MvIvYykjDyXkRWNrGhkRSMpNk2kkSKdDLKQlWxk4mzKEzKbSCNFwjN4Bs/gGTzrJPsT+xP7Ezw5GWQhKwlP8ATP4Tk8p15nf87+nP3R4OaNpF6n3qBeutwCXsALeHS60epGrxvNbnS7FXiF86PhjY43Wt4KvAKPrjfa3uh7o/GNzjda3+h9q/Aq50f7G/1vCGAVXoOHA4YEhgWGBoYHhgiGCdbgNc4PGQwbDB2sw+vwMMJQwnDCkMKwwtDC8MIGvMH5oYbhhiGHDXgDHn4IP4Qfwg/hh/BD+KEpeZoa2cmsV/ghg2fw8EP4IfwQfgg/hB/CDwmejBTpZJDwBA8/hB/CD+GH8EP4IfwQb//i/V/4IfwQfojPAPEhIPwQfgg/hB/CD+GH8EMBLzg//BB+CD9U4BV4+CH8EH4IP4Qfwg/hhyq8yvnhh/BD+KEKr8LDD+GH8EP4IfwQfgg/1OA1zg8/hB/CD3V4HR5+CD+EH8IP4YfwQ/ihAW9wfvgh/BB+aMAb8PBD+CH8cPxw/HD8cPzwiXFhYl7AD8cPxw+f4Bk8/HD8cPxw/HD8cPxw/HCDZ3l+jh+OH44fLniChx+OH44fjh+OH44fjh/u8NxJ6l3no3VAWiekdUTCD8cPxw/HD8cPxw/HDw94wfnhh+OH44czL3mBhx+OH44fjh+OH44fjh9e4VXODz8cPxw/nOnJKzz8cPxw/HD8cPxw/HD88AavcX5tHTCpFz+cWco7PPxw/HD8cPxw/HD88L5OrPA654cfjh+OH85k5QMefjh+OH74WEfgdQZmCMaPmBiDJ+Zg/Aj8CPwI5quYGIbxI2wdquHhR+BH4EfgRxg8a2Qns97Aj9A6pcPDj8CPwI/Aj8CPwI/Aj3B4buQ69lMvfgTzVeBH8PkRfH7E+gzBfBUBb32MwI/Aj1ifJNZHiVc/xmvOPHv97ujn9rTffjvsHvPrubvn4+27b+ue/ntY76zf5z2c7m93359Pu9dnvOXe/NT3Pw==", + "debug_symbols": "rZjLTiNJEEX/xWsWFTciX/0ro1HLgGlZsgwy0NII9b9PUXGKx8Ko5e5NXaDIQ0YSx47yy+Z2d/384/v+eHf/uPn2z8vm+rQ/HPY/vh/ub7ZP+/vj/NOXX1eb9dvvT6fdbv7R5sP9edXD9rQ7Pm2+HZ8Ph6vNz+3hefmlx4ftccmn7Wm+O11tdsfbOWfg3f6we/3q19X76un80jDWtvK2uHxebV+sjuKsj2jvf97GJ4LOE7xPA4J3ve/B+ieCnydU1YBQNaZzBH11BqWuVVjTnxJ6v4QgvZ2kSly0h+mNYNNFBK9lJXht5whf9UPR2otR4mw/fNlRfbwT7CzhC4SZh2DMX5fzhfw+pNYLISPeIGHxFyDyS8ux93KaXQjx+AuQ4R/K6RdCevtzSPHpDVL8UojiLOTf+bvtzf706VV/M829fbWx5arl6ss1lmtZrnW5tuXal+vIVSzO1ZbLLddbAiwJlghLhiXEkqKkiD0kRUlRUpQUJUVJUVKUFE+KJ8UpJSk+U+aXRC8ZNWOmzP827xljiZgyLEPLb4ZnJCVK3qsZSYmkRFJKUkpSSlJKUkpSSu6l5F5KUkpSSlJqUmpSqjI8IzJyLzUptWX0jLFEmzKS0pLSktKS0pLSsqKWe2m5l5Z76UnplpEV9ayoZ0U9KT0pPSk9KT0pIysauZeRexm5l5GUkecysqKRFY2saCTFpok0UqSTQRayko1MnE15QmYTaaRIeAbP4Bk8g2edZH9if2J/gicngyxkJeEJnuA5PIfn1Ovsz9mfsz8a3LyR1OvUG9RLl1vAC3gBj043Wt3odaPZjW63Aq9wfjS80fFGy1uBV+DR9UbbG31vNL7R+UbrG71vFV7l/Gh/o/8NAazCa/BwwJDAsMDQwPDAEMEwwRq8xvkhg2GDoYN1eB0eRhhKGE4YUhhWGFoYXtiANzg/1DDcMOSwAW/Aww/hh/BD+CH8EH4IPzQlT1MjO5n1Cj9k8Awefgg/hB/CD+GH8EP4IcGTkSKdDBKe4OGH8EP4IfwQfgg/hB/i5V+8/gs/hB/CD/EeIN4EhB/CD+GH8EP4IfwQfijgBeeHH8IP4YcKvAIPP4Qfwg/hh/BD+CH8UIVXOT/8EH4IP1ThVXj4IfwQfgg/hB/CD+GHGrzG+eGH8EP4oQ6vw8MP4YfwQ/gh/BB+CD804A3ODz+EH8IPDXgDHn4IP4Qfjh+OH44fjh8+MS5MzAv44fjh+OETPIOHH44fjh+OH44fjh+OH27wLM/P8cPxw/HDBU/w8MPxw/HD8cPxw/HD8cMdnjtJvet8tA5I64S0jkj44fjh+OH44fjh+OH44QEvOD/8cPxw/HDmJS/w8MPxw/HD8cPxw/HD8cMrvMr54Yfjh+OHMz15hYcfjh+OH44fjh+OH44f3uA1zq+tAyb14oczS3mHhx+OH44fjh+OH44f3teJFV7n/PDD8cPxw5msfMDDD8cPxw8f6wi8zsAMwfgRE2PwxByMH4EfgR/BfBUTwzB+hK1DNTz8CPwI/Aj8CINnjexk1hv4EVqndHj4EfgR+BH4EfgR+BH4EQ7PjVzHfurFj2C+CvwI3j+C949YnyGYryLgrY8R+BH4EeuTxPoo8erHeM2ZZ6+fV/zcnvbb68PuMT+eu3s+3nz4tO7pv4f1zvp53sPp/mZ3+3zavT7jLffmp77/AQ==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index a37bb6c1231..e7e8af3d5e7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -486,14 +486,14 @@ expression: artifact "unconstrained func 2", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "rZjNThtZEEbfxWsWXV/V/curjEaRQ0xkyTLIQKQRyrtP03XawMIocrLpD2ju0a3rOna1Xzbfd9+ef3zdH+/uHzdf/nnZfDvtD4f9j6+H+9vt0/7+OP/15dfNZv3169Npt5v/tHl3f171sD3tjk+bL8fnw+Fm83N7eF7+6fFhe1zyaXua7043m93x+5wz8G5/2L3+9OvmbfV0eWkYa1s5Ly4fV9vl1T56YX1Mk84EGx8I+oTQpwHBu972YP0DwS8TqmpAqBrTJYI+O4NS1yqs6U8JvV9DkHwlqMRVe5jOBJuuIng9v5pe2yXCJ/0QU9G5H9rFfviUIHsj+EXCJwgzj3UX88/lciG/D6n1SsiIMyQs/gJEfm059lZOsyshHn8BMvxdOf1KSG9/Dik+nSHFr4UoLkL+nX/b3u5PH971N9Pc2zcbW65arr5cY7mW5VqXa1uufbmOXMXiXG253HK9JcCSYImwZFhCLClKithDUpQUJUVJUVKUFCVFSfGkeFKcUpLiM2V+S/SSUTNmyvyyec8YS8SUYRla/jM8IylR8l7NSEokJZJSklKSUpJSklKSUnIvJfdSklKSUpJSk1KTUpXhGZGRe6lJqS2jZ4wl2pSRlJaUlpSWlJaUlhW13EvLvbTcS09Kt4ysqGdFPSvqSelJ6UnpSelJGVnRyL2M3MvIvYykjDyXkRWNrGhkRSMpNk2kkSKdDLKQlWxk4mzKEzKbSCNFwjN4Bs/gGTzrJPsT+xP7Ezw5GWQhKwlP8ATP4Tk8p15nf87+nP3R4OaNpF6n3qBeutwCXsALeHS60epGrxvNbnS7FXiF86PhjY43Wt4KvAKPrjfa3uh7o/GNzjda3+h9q/Aq50f7G/1vCGAVXoOHA4YEhgWGBoYHhgiGCdbgNc4PGQwbDB2sw+vwMMJQwnDCkMKwwtDC8MIGvMH5oYbhhiGHDXgDHn4IP4Qfwg/hh/BD+KEpeZoa2cmsV/ghg2fw8EP4IfwQfgg/hB/CDwmejBTpZJDwBA8/hB/CD+GH8EP4IfwQb//i/V/4IfwQfojPAPEhIPwQfgg/hB/CD+GH8EMBLzg//BB+CD9U4BV4+CH8EH4IP4Qfwg/hhyq8yvnhh/BD+KEKr8LDD+GH8EP4IfwQfgg/1OA1zg8/hB/CD3V4HR5+CD+EH8IP4YfwQ/ihAW9wfvgh/BB+aMAb8PBD+CH8cPxw/HD8cPzwiXFhYl7AD8cPxw+f4Bk8/HD8cPxw/HD8cPxw/HCDZ3l+jh+OH44fLniChx+OH44fjh+OH44fjh/u8NxJ6l3no3VAWiekdUTCD8cPxw/HD8cPxw/HDw94wfnhh+OH44czL3mBhx+OH44fjh+OH44fjh9e4VXODz8cPxw/nOnJKzz8cPxw/HD8cPxw/HD88AavcX5tHTCpFz+cWco7PPxw/HD8cPxw/HD88L5OrPA654cfjh+OH85k5QMefjh+OH74WEfgdQZmCMaPmBiDJ+Zg/Aj8CPwI5quYGIbxI2wdquHhR+BH4EfgRxg8a2Qns97Aj9A6pcPDj8CPwI/Aj8CPwI/Aj3B4buQ69lMvfgTzVeBH8PkRfH7E+gzBfBUBb32MwI/Aj1ifJNZHiVc/xmvOPHv97ujn9rTffjvsHvPrubvn4+27b+ue/ntY76zf5z2c7m93359Pu9dnvOXe/NT3Pw==", + "debug_symbols": "rZjLTiNJEEX/xWsWFTciX/0ro1HLgGlZsgwy0NII9b9PUXGKx8Ko5e5NXaDIQ0YSx47yy+Z2d/384/v+eHf/uPn2z8vm+rQ/HPY/vh/ub7ZP+/vj/NOXX1eb9dvvT6fdbv7R5sP9edXD9rQ7Pm2+HZ8Ph6vNz+3hefmlx4ftccmn7Wm+O11tdsfbOWfg3f6we/3q19X76un80jDWtvK2uHxebV+sjuKsj2jvf97GJ4LOE7xPA4J3ve/B+ieCnydU1YBQNaZzBH11BqWuVVjTnxJ6v4QgvZ2kSly0h+mNYNNFBK9lJXht5whf9UPR2otR4mw/fNlRfbwT7CzhC4SZh2DMX5fzhfw+pNYLISPeIGHxFyDyS8ux93KaXQjx+AuQ4R/K6RdCevtzSPHpDVL8UojiLOTf+bvtzf706VV/M829fbWx5arl6ss1lmtZrnW5tuXal+vIVSzO1ZbLLddbAiwJlghLhiXEkqKkiD0kRUlRUpQUJUVJUVKUFE+KJ8UpJSk+U+aXRC8ZNWOmzP827xljiZgyLEPLb4ZnJCVK3qsZSYmkRFJKUkpSSlJKUkpSSu6l5F5KUkpSSlJqUmpSqjI8IzJyLzUptWX0jLFEmzKS0pLSktKS0pLSsqKWe2m5l5Z76UnplpEV9ayoZ0U9KT0pPSk9KT0pIysauZeRexm5l5GUkecysqKRFY2saCTFpok0UqSTQRayko1MnE15QmYTaaRIeAbP4Bk8g2edZH9if2J/gicngyxkJeEJnuA5PIfn1Ovsz9mfsz8a3LyR1OvUG9RLl1vAC3gBj043Wt3odaPZjW63Aq9wfjS80fFGy1uBV+DR9UbbG31vNL7R+UbrG71vFV7l/Gh/o/8NAazCa/BwwJDAsMDQwPDAEMEwwRq8xvkhg2GDoYN1eB0eRhhKGE4YUhhWGFoYXtiANzg/1DDcMOSwAW/Aww/hh/BD+CH8EH4IPzQlT1MjO5n1Cj9k8Awefgg/hB/CD+GH8EP4IcGTkSKdDBKe4OGH8EP4IfwQfgg/hB/i5V+8/gs/hB/CD/EeIN4EhB/CD+GH8EP4IfwQfijgBeeHH8IP4YcKvAIPP4Qfwg/hh/BD+CH8UIVXOT/8EH4IP1ThVXj4IfwQfgg/hB/CD+GHGrzG+eGH8EP4oQ6vw8MP4YfwQ/gh/BB+CD804A3ODz+EH8IPDXgDHn4IP4Qfjh+OH44fjh8+MS5MzAv44fjh+OETPIOHH44fjh+OH44fjh+OH27wLM/P8cPxw/HDBU/w8MPxw/HD8cPxw/HD8cMdnjtJvet8tA5I64S0jkj44fjh+OH44fjh+OH44QEvOD/8cPxw/HDmJS/w8MPxw/HD8cPxw/HD8cMrvMr54Yfjh+OHMz15hYcfjh+OH44fjh+OH44f3uA1zq+tAyb14oczS3mHhx+OH44fjh+OH44f3teJFV7n/PDD8cPxw5msfMDDD8cPxw8f6wi8zsAMwfgRE2PwxByMH4EfgR/BfBUTwzB+hK1DNTz8CPwI/Aj8CINnjexk1hv4EVqndHj4EfgR+BH4EfgR+BH4EQ7PjVzHfurFj2C+CvwI3j+C949YnyGYryLgrY8R+BH4EeuTxPoo8erHeM2ZZ6+fV/zcnvbb68PuMT+eu3s+3nz4tO7pv4f1zvp53sPp/mZ3+3zavT7jLffmp77/AQ==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 040079916b7..cb27fbc35c3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -50,14 +50,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32841 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32839), size_address: Relative(2), offset_address: Relative(3) }, Mov { destination: Relative(1), source: Direct(32839) }, Call { location: 13 }, Call { location: 18 }, Mov { destination: Direct(32840), source: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32840 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 1 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, Const { destination: Direct(32835), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32836), bit_size: Field, value: 0 }, Const { destination: Direct(32837), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Return, Call { location: 42 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Direct(32838) }, Mov { destination: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 48 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(5) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 47 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 42 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 58 }, Call { location: 107 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 256 }, Mov { destination: Relative(3), source: Direct(32835) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(6), location: 68 }, Jump { location: 66 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, JumpIf { condition: Relative(6), location: 70 }, Call { location: 110 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(6), radix: Relative(5), output_pointer: Relative(9), num_limbs: Relative(10), output_bits: Relative(8) }), Const { destination: Relative(11), bit_size: Integer(U32), value: 32 }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(11) }, Call { location: 113 }, Load { destination: Relative(6), source_pointer: Relative(4) }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(9), size: Relative(10) }, output: HeapArray { pointer: Relative(11), size: 32 } }), Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 132 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, BinaryFieldOp { destination: Relative(8), op: Add, lhs: Relative(6), rhs: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 63 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 131 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 117 }, Return, Call { location: 42 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(3), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32836) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 16 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 31 }, Const { destination: Relative(10), bit_size: Field, value: 256 }, Mov { destination: Relative(2), source: Direct(32835) }, Jump { location: 150 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(6) }, JumpIf { condition: Relative(11), location: 160 }, Jump { location: 153 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Load { destination: Relative(11), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Sub, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, JumpIf { condition: Relative(13), location: 165 }, Call { location: 193 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 168 }, Call { location: 110 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Field }, Load { destination: Relative(13), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(14), op: Mul, lhs: Relative(12), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(12), op: Add, lhs: Relative(11), rhs: Relative(14) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Load { destination: Relative(11), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(12), op: Sub, bit_size: U32, lhs: Relative(9), rhs: Relative(2) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, JumpIf { condition: Relative(14), location: 181 }, Call { location: 110 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Load { destination: Relative(14), source_pointer: Relative(16) }, Cast { destination: Relative(12), source: Relative(14), bit_size: Field }, BinaryFieldOp { destination: Relative(14), op: Mul, lhs: Relative(12), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(12), op: Add, lhs: Relative(11), rhs: Relative(14) }, Store { destination_pointer: Relative(5), source: Relative(12) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Relative(13), rhs: Relative(10) }, Store { destination_pointer: Relative(3), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, Mov { destination: Relative(2), source: Relative(11) }, Jump { location: 150 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZbLbvIwEIXfJWsWtsdXXqWqqgChihQFlMIv/UK8e+d44oQuqCqz4TvBzLHnYpFbc+h218+Pfjyevprt263ZTf0w9J8fw2nfXvrTyN/eGoUPomarNw1ZgRN4QRBEQcqwSsBPZtM4JdAC02yJQQIrcAIvCIIoSBleAjz/xDJkzctaUAItkB2CBATeITCcwAuCIApSRlQCLTACEohLFJfILo7BLpERBSkjKYEWGAEJrIBdEsMLgiAKUoZWaqaeaXLeWtFMK8y9URC2CFeELwI90hCxiDSL3CkDoYsws0DbNEFgC+yFZolwRWALB4EtPAtfojwMA4QpgoqwRbgifBGhCBw1QqRZoMki4IyaoNEi2NkgUzTbIC+0W4Qvgp0N8kLTRaRZoPEiMKI4PJovgoqAM1LGCBikjCEwSBljICLOZcEoZIFh0PZ+3zTlVn1cpq7DpXq4Znz5zu3UjZdmO16HYdP8a4dr/tHXuR0zL+3Eq5xiNx6YbHjshw7qvlmj1fNQq+fY4JZg9+doSqhzjqdk1u11+ruDVYuD9RUOVqGk2cGqQFVniG5xUOaZg/vFIaqlDtGsldTxh4N/7uCNL1l4k9Qzh1/r4MxaB1NVSaNfq6TWhmi2gLYVeXCcc6uHd3Ue8cEj1XnQMljQvsrDWrN4WJuqPBypxcNRrPMw9mUPcus5yNXVgx7qQS687uFrz6FXj6DrPMi+7MF3bp0PTXXnSPbBw77uYWrPQQ8elTMWw1OPd35q9/3041X0Drepb3dDNz8er+P+YfXy/1xWyqvseTrtu8N16uC0vs/yv/wbn2DDl/0dr1L8yJNmAx7yGuenk3u/4yjf", + "debug_symbols": "pZbtiuowEIbvpb/9kWQmX97KIlK1LoVSpasHDuK9n5lM0nY5uCzxj89bY558TIJ9NKfucP/c9+P58tVsPx7NYeqHof/cD5dje+svI337aBR/ADRbvWkABVbgBF4QBDEBlYCezKaxSqAFptkCAQQosAIn8IIgiAlOOjj6CRKkzUmbVwItkBG8dPA0gidYgRN4QRDEhKAEWmAEIBBLEEsgiyWQJRCCICZEJdACIwABCsgSCU7gBUEQE7RSmTrTpHVrBZkoTLVRHLAEW4IrgWukOYQSYg6pUoaDLsHkwGXTwIGH4LG4WBJsCTyE5cBDOAqu9HIs9BxMCVAClmBLcCX4EniqgUPMgYssgc28J1xoCWQ2vFIutuF1cbkluBLIbHhdXHQJMQcuvAQ+ojx5Lr4EKIHNvGQ+AoaXzIfA8JL5GEgIeVv4KKTAh0Hj87lpyq3a36au40u1umZ0+a7t1I23Zjveh2HT/GmHe/rR17UdE2/tRK20xG48EUl47oeO03Oz9Favu6LOfb2dO9vf94bgc3+KYTbo+GsDqlAMSFtSYwimGCzqKoOFeQ5evTLY1wYIKmYDBLPspA7fDO61wRmH2eBMVK8MP63CGrXsg6rbyfjeTmptoGwlZ6xYB/WzdnE4W+cIK0esc4DG2QHaVTkQzexAjFUOC2p2WAh1DoNvO8Au8wBbtx+w2g+w/n2Hq52HXhxe1zkA33agWp0PDXXziLhy4PsOUzsPWDkqz9j8h/K/Y0dP7bGfvr2KPtk29e1h6PLj+T4eV623v9fSUl5lr9Pl2J3uU8em5X2W/uU/aAYbuuw7fpWiRzpp6PkhtdH6dLS7J0/lHw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_0.snap index d29e3330bcb..46ec8f0724f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_0.snap @@ -46,14 +46,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Mov { destination: Direct(32837), source: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 1 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, Return, Call { location: 100 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(5), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(1), radix: Relative(3), output_pointer: Relative(6), num_limbs: Relative(7), output_bits: Relative(5) }), Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(8) }, Call { location: 106 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(3), size: Relative(5) }, output: HeapArray { pointer: Relative(6), size: 32 } }), Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(3), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Field, value: 0 }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 16 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(10), bit_size: Integer(U1), value: 1 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 31 }, Const { destination: Relative(12), bit_size: Field, value: 256 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(2), source: Relative(5) }, Jump { location: 57 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, JumpIf { condition: Relative(5), location: 67 }, Jump { location: 60 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Sub, bit_size: U32, lhs: Relative(8), rhs: Relative(2) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(15), location: 72 }, Call { location: 125 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, JumpIf { condition: Relative(15), location: 75 }, Call { location: 128 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(14), source: Relative(15), bit_size: Field }, Load { destination: Relative(15), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(14), op: Add, lhs: Relative(5), rhs: Relative(16) }, Store { destination_pointer: Relative(4), source: Relative(14) }, Load { destination: Relative(5), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(14), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, JumpIf { condition: Relative(16), location: 88 }, Call { location: 128 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Cast { destination: Relative(14), source: Relative(16), bit_size: Field }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(14), op: Add, lhs: Relative(5), rhs: Relative(16) }, Store { destination_pointer: Relative(6), source: Relative(14) }, BinaryFieldOp { destination: Relative(5), op: Mul, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(3), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, Mov { destination: Relative(2), source: Relative(5) }, Jump { location: 57 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 105 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 124 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 110 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZbNzqpADIbvhTWLaTu/3sqJMaj4hYSg4dOTnBju/XRoBVzgAjc+jEMf+pIa51mc6+Pj59B0l+tvsfvzLI5907bNz6G9nqp7c+3422dh8ge4YmfLArwgCKIgjUAjAAEKSGAFYkGxoFiQLY6RRpARgAAFJLACJ2BLYARBFKQRli2RAQIUkIAtieEEfoRjC5iy8FwIwAQlKrkWkMnFQMzX/fxY4BA+CYNRghKVpLRKfjpwiOCVQZl9npmEMfs4UMw+bj6ikpTZx/1Hp/TKoGQfcp8xCZNRsg85V2Ifcq7EPuRcySqd5E5emX0wDGXxmo3Dva/rPBqLYeERulV93d2LXfdo27L4W7WP8abfW9WNvFc973IHdXdmsvDStHW+Gsq52qyXWtDa4KZi914N69WUotN6awxOBkhvBvxgiCapgSLOPUB8M9C6waO3avCYzJrhQwprHE4pwmqKjwaE2UBrBr9uAEAiVeRru5bjs8O52eHdNkdcONI2B4GdHAR+k8NanBzWpk0OR2ZyOIrbHGi/dpCb+yC37X3Q4n2QC987/NY+YHYE2OYg+7WDf3PzfABt6yPZhcN+78CtfdDCsXHGYlh17HlVnZr+7SgyZFvfVMe21uXl0Z0Wu/d/t9fO6yhz66+n+vzo62xanGf4zwqMLwHtnk8wZlyaEozLy3EXHe+G/ZCb+Q8=", + "debug_symbols": "pZbLrqJAEED/hTWLrke//JWJMah4Q0LQcHWSieHfp5pqBBe4wI2HtqnTVZVK6Gdxro+Pn0PTXa6/xe7Pszj2Tds2P4f2eqruzbWTf5+FST9gix2XBTiFVwRFHIFGAQpUkIIVakG1oFpQLFYQR5BRgAIVpGCFVYjFC7wiKOIIFksQgAIVpBBLFFiFG2HFAqYsnAQCCCETMyUWUCjBQMLpfTkWpAgXld5kQiZmUiZnyukgRXiX6TOTzwmjMiSfFBSST5IPmEmZySf5B5vpMn2m+FDyDFEZTab4UOqK4kOpK4oPpa7ImVbrji4z+WAYymKajcO9r+s0GothkRG6VX3d3Ytd92jbsvhbtY/xpd9b1Y28V73sSgZ1dxaK8NK0dXoayjnarIcy5FhvX8H2PRo+RLOlHM/s5+Mhvhlw3UDBxGyggHMOEN4MtG5w6DgbHEazZvhUhcWpg2x5tYqPfQhxNsCawa0bAJCmVqZnXqvjs8Pa2eHsNkdYOOI2BwG/HARuk4MZXw7muMlhybwclsI2B/LXDrJzHmS39YMW/SDrv3e4rXnA7PCwzUH8tYPNYj6AtuUReeHg7x24NQ9aODbOWPCrjr2sqlPTv11FhmTrm+rY1nl5eXSnxe79323ama4yt/56qs+Pvk6mxX1GPlZgXAnIe7nBmHFpSjA2LcddtLLr90NK5j8=", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index d29e3330bcb..46ec8f0724f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -46,14 +46,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Mov { destination: Direct(32837), source: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 1 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, Return, Call { location: 100 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(5), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(1), radix: Relative(3), output_pointer: Relative(6), num_limbs: Relative(7), output_bits: Relative(5) }), Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, Mov { destination: Direct(32771), source: Relative(6) }, Mov { destination: Direct(32772), source: Relative(8) }, Call { location: 106 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(3), size: Relative(5) }, output: HeapArray { pointer: Relative(6), size: 32 } }), Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(3), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Field, value: 0 }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 16 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(10), bit_size: Integer(U1), value: 1 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 31 }, Const { destination: Relative(12), bit_size: Field, value: 256 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(2), source: Relative(5) }, Jump { location: 57 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, JumpIf { condition: Relative(5), location: 67 }, Jump { location: 60 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Sub, bit_size: U32, lhs: Relative(8), rhs: Relative(2) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, JumpIf { condition: Relative(15), location: 72 }, Call { location: 125 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, JumpIf { condition: Relative(15), location: 75 }, Call { location: 128 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(14), source: Relative(15), bit_size: Field }, Load { destination: Relative(15), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(14), op: Add, lhs: Relative(5), rhs: Relative(16) }, Store { destination_pointer: Relative(4), source: Relative(14) }, Load { destination: Relative(5), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(14), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, JumpIf { condition: Relative(16), location: 88 }, Call { location: 128 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Cast { destination: Relative(14), source: Relative(16), bit_size: Field }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(14), op: Add, lhs: Relative(5), rhs: Relative(16) }, Store { destination_pointer: Relative(6), source: Relative(14) }, BinaryFieldOp { destination: Relative(5), op: Mul, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(3), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, Mov { destination: Relative(2), source: Relative(5) }, Jump { location: 57 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 105 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 124 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 110 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZbNzqpADIbvhTWLaTu/3sqJMaj4hYSg4dOTnBju/XRoBVzgAjc+jEMf+pIa51mc6+Pj59B0l+tvsfvzLI5907bNz6G9nqp7c+3422dh8ge4YmfLArwgCKIgjUAjAAEKSGAFYkGxoFiQLY6RRpARgAAFJLACJ2BLYARBFKQRli2RAQIUkIAtieEEfoRjC5iy8FwIwAQlKrkWkMnFQMzX/fxY4BA+CYNRghKVpLRKfjpwiOCVQZl9npmEMfs4UMw+bj6ikpTZx/1Hp/TKoGQfcp8xCZNRsg85V2Ifcq7EPuRcySqd5E5emX0wDGXxmo3Dva/rPBqLYeERulV93d2LXfdo27L4W7WP8abfW9WNvFc973IHdXdmsvDStHW+Gsq52qyXWtDa4KZi914N69WUotN6awxOBkhvBvxgiCapgSLOPUB8M9C6waO3avCYzJrhQwprHE4pwmqKjwaE2UBrBr9uAEAiVeRru5bjs8O52eHdNkdcONI2B4GdHAR+k8NanBzWpk0OR2ZyOIrbHGi/dpCb+yC37X3Q4n2QC987/NY+YHYE2OYg+7WDf3PzfABt6yPZhcN+78CtfdDCsXHGYlh17HlVnZr+7SgyZFvfVMe21uXl0Z0Wu/d/t9fO6yhz66+n+vzo62xanGf4zwqMLwHtnk8wZlyaEozLy3EXHe+G/ZCb+Q8=", + "debug_symbols": "pZbLrqJAEED/hTWLrke//JWJMah4Q0LQcHWSieHfp5pqBBe4wI2HtqnTVZVK6Gdxro+Pn0PTXa6/xe7Pszj2Tds2P4f2eqruzbWTf5+FST9gix2XBTiFVwRFHIFGAQpUkIIVakG1oFpQLFYQR5BRgAIVpGCFVYjFC7wiKOIIFksQgAIVpBBLFFiFG2HFAqYsnAQCCCETMyUWUCjBQMLpfTkWpAgXld5kQiZmUiZnyukgRXiX6TOTzwmjMiSfFBSST5IPmEmZySf5B5vpMn2m+FDyDFEZTab4UOqK4kOpK4oPpa7ImVbrji4z+WAYymKajcO9r+s0GothkRG6VX3d3Ytd92jbsvhbtY/xpd9b1Y28V73sSgZ1dxaK8NK0dXoayjnarIcy5FhvX8H2PRo+RLOlHM/s5+Mhvhlw3UDBxGyggHMOEN4MtG5w6DgbHEazZvhUhcWpg2x5tYqPfQhxNsCawa0bAJCmVqZnXqvjs8Pa2eHsNkdYOOI2BwG/HARuk4MZXw7muMlhybwclsI2B/LXDrJzHmS39YMW/SDrv3e4rXnA7PCwzUH8tYPNYj6AtuUReeHg7x24NQ9aODbOWPCrjr2sqlPTv11FhmTrm+rY1nl5eXSnxe79323ama4yt/56qs+Pvk6mxX1GPlZgXAnIe7nBmHFpSjA2LcddtLLr90NK5j8=", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 360a76ea902..fdbc981b6cd 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -245,7 +245,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32918 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 12 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32906), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32906 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 23 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 34 }, Call { location: 106 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32918 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 33 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 26 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 6 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Const { destination: Direct(32838), bit_size: Integer(U1), value: 0 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32840), bit_size: Integer(U64), value: 0 }, Const { destination: Direct(32841), bit_size: Field, value: 0 }, Const { destination: Direct(32842), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32843), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32844), bit_size: Field, value: 1 }, Const { destination: Direct(32845), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32846), bit_size: Field, value: 2 }, Const { destination: Direct(32847), bit_size: Field, value: 3 }, Const { destination: Direct(32848), bit_size: Integer(U32), value: 5 }, Const { destination: Direct(32849), bit_size: Field, value: 5 }, Const { destination: Direct(32850), bit_size: Field, value: 6 }, Const { destination: Direct(32851), bit_size: Field, value: 7 }, Const { destination: Direct(32852), bit_size: Integer(U32), value: 8 }, Const { destination: Direct(32853), bit_size: Field, value: 11 }, Const { destination: Direct(32854), bit_size: Field, value: 12 }, Const { destination: Direct(32855), bit_size: Field, value: 13 }, Const { destination: Direct(32856), bit_size: Field, value: 31 }, Const { destination: Direct(32857), bit_size: Integer(U8), value: 32 }, Const { destination: Direct(32858), bit_size: Integer(U8), value: 34 }, Const { destination: Direct(32859), bit_size: Field, value: 42 }, Const { destination: Direct(32860), bit_size: Integer(U8), value: 44 }, Const { destination: Direct(32861), bit_size: Integer(U8), value: 46 }, Const { destination: Direct(32862), bit_size: Integer(U8), value: 49 }, Const { destination: Direct(32863), bit_size: Field, value: 55 }, Const { destination: Direct(32864), bit_size: Integer(U8), value: 58 }, Const { destination: Direct(32865), bit_size: Integer(U8), value: 65 }, Const { destination: Direct(32866), bit_size: Field, value: 72 }, Const { destination: Direct(32867), bit_size: Integer(U8), value: 73 }, Const { destination: Direct(32868), bit_size: Field, value: 74 }, Const { destination: Direct(32869), bit_size: Field, value: 76 }, Const { destination: Direct(32870), bit_size: Integer(U8), value: 78 }, Const { destination: Direct(32871), bit_size: Integer(U8), value: 95 }, Const { destination: Direct(32872), bit_size: Integer(U8), value: 97 }, Const { destination: Direct(32873), bit_size: Integer(U8), value: 98 }, Const { destination: Direct(32874), bit_size: Integer(U8), value: 99 }, Const { destination: Direct(32875), bit_size: Integer(U8), value: 100 }, Const { destination: Direct(32876), bit_size: Integer(U8), value: 101 }, Const { destination: Direct(32877), bit_size: Integer(U8), value: 102 }, Const { destination: Direct(32878), bit_size: Integer(U8), value: 103 }, Const { destination: Direct(32879), bit_size: Integer(U8), value: 104 }, Const { destination: Direct(32880), bit_size: Integer(U8), value: 105 }, Const { destination: Direct(32881), bit_size: Integer(U8), value: 107 }, Const { destination: Direct(32882), bit_size: Integer(U8), value: 108 }, Const { destination: Direct(32883), bit_size: Integer(U8), value: 109 }, Const { destination: Direct(32884), bit_size: Integer(U8), value: 110 }, Const { destination: Direct(32885), bit_size: Integer(U8), value: 111 }, Const { destination: Direct(32886), bit_size: Integer(U8), value: 112 }, Const { destination: Direct(32887), bit_size: Integer(U8), value: 114 }, Const { destination: Direct(32888), bit_size: Integer(U8), value: 115 }, Const { destination: Direct(32889), bit_size: Integer(U8), value: 116 }, Const { destination: Direct(32890), bit_size: Field, value: 116 }, Const { destination: Direct(32891), bit_size: Integer(U8), value: 117 }, Const { destination: Direct(32892), bit_size: Integer(U8), value: 118 }, Const { destination: Direct(32893), bit_size: Field, value: 118 }, Const { destination: Direct(32894), bit_size: Integer(U8), value: 121 }, Const { destination: Direct(32895), bit_size: Integer(U8), value: 123 }, Const { destination: Direct(32896), bit_size: Field, value: 123 }, Const { destination: Direct(32897), bit_size: Integer(U8), value: 125 }, Const { destination: Direct(32898), bit_size: Field, value: 125 }, Const { destination: Direct(32899), bit_size: Field, value: 127 }, Const { destination: Direct(32900), bit_size: Field, value: 132 }, Const { destination: Direct(32901), bit_size: Field, value: 169 }, Const { destination: Direct(32902), bit_size: Field, value: 170 }, Const { destination: Direct(32903), bit_size: Field, value: 171 }, Const { destination: Direct(32904), bit_size: Field, value: 174 }, Const { destination: Direct(32905), bit_size: Field, value: 10944121435919637611123202872628637544274182200208017171849102093287904247809 }, Return, Call { location: 184 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32843) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32845) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 190 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 476 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32848) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32852) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 826 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 149 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 1061 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 1339 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1590 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1736 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2065 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2545 }, Mov { destination: Direct(0), source: Relative(0) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 189 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 272 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(4) }, Mov { destination: Relative(10), source: Relative(5) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 291 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, JumpIf { condition: Relative(8), location: 296 }, Call { location: 3430 }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 302 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Direct(32843) }, Mov { destination: Relative(15), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 3433 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, JumpIf { condition: Relative(6), location: 316 }, Call { location: 3533 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(6) }, Store { destination_pointer: Relative(11), source: Direct(32867) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32884) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32876) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32887) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32889) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32876) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32875) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32895) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32892) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32872) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32891) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32876) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32897) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32873) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32891) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32889) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32885) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32889) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32895) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32885) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32889) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32897) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32885) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32887) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32889) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32879) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32876) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32872) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32883) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32876) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32881) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32876) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32894) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32861) }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(2), rhs: Relative(10) }, JumpIf { condition: Relative(6), location: 441 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, Mov { destination: Relative(13), source: Relative(12) }, IndirectConst { destination_pointer: Relative(13), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(14) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(15) }, Call { location: 23 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(14) }, Store { destination_pointer: Relative(13), source: Direct(32845) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(12), size: Relative(11) } }, Const { destination: Relative(2), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 3536 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 457 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 462 }, Call { location: 3667 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Direct(32839) }, Mov { destination: Relative(13), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 3433 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(11) }, Mov { destination: Relative(4), source: Relative(12) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(3), rhs: Direct(32838) }, JumpIf { condition: Relative(1), location: 475 }, Call { location: 3670 }, Return, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, Load { destination: Relative(7), source_pointer: Relative(4) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 558 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 562 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, JumpIf { condition: Relative(4), location: 814 }, Jump { location: 565 }, Load { destination: Relative(3), source_pointer: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 573 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 72 }, Const { destination: Relative(7), bit_size: Integer(U8), value: 77 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32872) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32888) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32879) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32872) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32886) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32857) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32882) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32876) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32884) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32878) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32889) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32879) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32857) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32883) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32891) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32888) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32889) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32857) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32873) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32876) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32857) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32862) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32860) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32857) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32878) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32885) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32889) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32857) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32895) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32882) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32876) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32884) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32897) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32861) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, JumpIf { condition: Relative(5), location: 676 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 39 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 39 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 12389747999246339213 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 36 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(7) } }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Direct(32843) }, Mov { destination: Relative(11), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 3433 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Mov { destination: Relative(5), source: Relative(10) }, JumpIf { condition: Relative(4), location: 688 }, Call { location: 3533 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Direct(32867) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32884) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32888) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32876) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32887) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32889) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32876) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32875) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32857) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32895) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32892) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32872) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32882) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32891) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32876) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32897) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32857) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32873) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32891) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32889) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32857) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32885) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32889) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32857) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32895) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32885) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32889) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32897) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32857) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32877) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32885) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32887) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32857) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32889) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32879) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32876) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32857) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32888) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32872) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32883) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32876) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32857) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32881) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32876) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32894) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32861) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 813 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(8) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 23 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, Store { destination_pointer: Relative(8), source: Direct(32845) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(7), size: Relative(4) } }, Return, Const { destination: Relative(4), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(5) }, Mov { destination: Relative(9), source: Relative(6) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(4) }, Jump { location: 562 }, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, Load { destination: Relative(7), source_pointer: Relative(4) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 908 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(5) }, Mov { destination: Relative(11), source: Relative(6) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(5) }, Mov { destination: Relative(11), source: Relative(6) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 936 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, JumpIf { condition: Relative(5), location: 941 }, Call { location: 3673 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Direct(32843) }, Mov { destination: Relative(12), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 3433 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(10) }, Mov { destination: Relative(5), source: Relative(11) }, JumpIf { condition: Relative(4), location: 953 }, Call { location: 3533 }, Const { destination: Relative(1), bit_size: Integer(U8), value: 69 }, Const { destination: Relative(2), bit_size: Integer(U8), value: 120 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 119 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32886) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32876) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32874) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32889) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32876) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32875) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32857) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32895) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32884) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32876) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32871) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32892) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32872) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32882) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32891) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32876) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32897) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32860) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32857) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32873) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32891) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32889) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32857) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32878) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32885) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32889) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32857) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32895) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32878) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32885) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32889) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32897) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32861) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 1057 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 40 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, Mov { destination: Relative(9), source: Relative(4) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U64), value: 3316745884754988903 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 36 }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 23 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, Store { destination_pointer: Relative(9), source: Direct(32845) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(3) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(5) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(4), size: Relative(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1143 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(3) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1151 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32839) }, Jump { location: 1155 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(3), location: 1319 }, Jump { location: 1158 }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 1166 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32835) }, JumpIf { condition: Relative(3), location: 1171 }, Call { location: 3676 }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(3) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 1177 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, Store { destination_pointer: Relative(9), source: Direct(32870) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32885) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32889) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32857) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32877) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32885) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32891) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32884) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32875) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32857) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32880) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32884) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32888) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32876) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32887) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32889) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32876) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32875) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32857) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32881) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32876) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32894) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32857) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32895) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32876) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32884) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32889) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32887) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32894) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32871) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32881) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32876) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32894) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32897) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32861) }, Mov { destination: Relative(2), source: Direct(32839) }, Jump { location: 1256 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 1271 }, Jump { location: 1259 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(4) }, Mov { destination: Relative(8), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3679 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, JumpIf { condition: Relative(2), location: 1270 }, Call { location: 3752 }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1283 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 3433 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, JumpIf { condition: Relative(9), location: 1316 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 38 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, Mov { destination: Relative(12), source: Relative(8) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U64), value: 9862881900111276825 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 35 }, Mov { destination: Direct(32771), source: Relative(13) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(14) }, Call { location: 23 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 35 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, Store { destination_pointer: Relative(12), source: Direct(32843) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(7) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(8), size: Relative(6) } }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32843) }, Mov { destination: Relative(2), source: Relative(6) }, Jump { location: 1256 }, BinaryIntOp { destination: Relative(3), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(9) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(4) }, Mov { destination: Relative(10), source: Relative(5) }, Mov { destination: Relative(11), source: Relative(6) }, Mov { destination: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32843) }, Mov { destination: Relative(2), source: Relative(3) }, Jump { location: 1155 }, Call { location: 184 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32841) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32839) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 1496 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Mov { destination: Relative(2), source: Direct(32839) }, Jump { location: 1500 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(7), location: 1561 }, Jump { location: 1503 }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1511 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1521 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(9) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 3755 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(13) }, JumpIf { condition: Relative(9), location: 1535 }, Call { location: 3847 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32843) }, Load { destination: Relative(3), source_pointer: Relative(8) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3536 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 3755 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(12) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(1), location: 1560 }, Call { location: 3850 }, Return, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(8) }, Mov { destination: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(6) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(8) }, Mov { destination: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32843) }, Mov { destination: Relative(2), source: Relative(7) }, Jump { location: 1500 }, Call { location: 184 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32839) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 1672 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Direct(32849) }, Mov { destination: Relative(10), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Direct(32846) }, Mov { destination: Relative(10), source: Direct(32855) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Direct(32853) }, Mov { destination: Relative(10), source: Direct(32849) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Direct(32904) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3853 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 1717 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32845) }, JumpIf { condition: Relative(3), location: 1722 }, Call { location: 4003 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32845) }, Mov { destination: Relative(10), source: Direct(32846) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 3433 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Relative(9) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(2), rhs: Direct(32838) }, JumpIf { condition: Relative(1), location: 1735 }, Call { location: 4006 }, Return, Call { location: 184 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32839) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32846) }, Mov { destination: Relative(8), source: Direct(32847) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32849) }, Mov { destination: Relative(8), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32853) }, Mov { destination: Relative(8), source: Direct(32855) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 1847 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 4009 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(8) }, Mov { destination: Relative(5), source: Relative(9) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4284 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(9) }, Load { destination: Relative(1), source_pointer: Relative(6) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 1872 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 1883 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Direct(32839) }, Mov { destination: Relative(12), source: Direct(32845) }, Mov { destination: Relative(13), source: Direct(32901) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 4334 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(1) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 1901 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4478 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4284 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(13) }, Load { destination: Relative(1), source_pointer: Relative(10) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(1) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1926 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1937 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32839) }, Mov { destination: Relative(16), source: Direct(32845) }, Mov { destination: Relative(17), source: Direct(32902) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4334 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 4757 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(15) }, Mov { destination: Relative(11), source: Relative(16) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5059 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(14) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1972 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1983 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32839) }, Mov { destination: Relative(17), source: Direct(32845) }, Mov { destination: Relative(18), source: Direct(32903) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 5121 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(11) }, Store { destination_pointer: Relative(14), source: Direct(32846) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32849) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32853) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(6) }, Mov { destination: Relative(17), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 5265 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(16) }, JumpIf { condition: Relative(11), location: 2016 }, Call { location: 5297 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(6) }, Store { destination_pointer: Relative(11), source: Direct(32847) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32851) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32855) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(10) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 5265 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(15) }, JumpIf { condition: Relative(6), location: 2037 }, Call { location: 5300 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(10), source: Direct(32846) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32847) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32849) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32851) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32853) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32855) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 5303 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(15) }, JumpIf { condition: Relative(6), location: 2064 }, Call { location: 5345 }, Return, Call { location: 184 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32839) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32846) }, Mov { destination: Relative(8), source: Direct(32847) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32849) }, Mov { destination: Relative(8), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32853) }, Mov { destination: Relative(8), source: Direct(32855) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5348 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5511 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 2192 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(3) }, Mov { destination: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 4009 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(7), source: Relative(11) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 4284 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(11) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 2217 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2228 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Direct(32839) }, Mov { destination: Relative(14), source: Direct(32845) }, Mov { destination: Relative(15), source: Direct(32896) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 4334 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2246 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4478 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 4284 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(13) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2271 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2282 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(11) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Direct(32839) }, Mov { destination: Relative(16), source: Direct(32845) }, Mov { destination: Relative(17), source: Direct(32898) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 4334 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2300 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 15 }, Const { destination: Relative(13), bit_size: Field, value: 33 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(15) }, Store { destination_pointer: Relative(16), source: Direct(32850) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 5265 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(13), source: Relative(17) }, Const { destination: Relative(14), bit_size: Integer(U8), value: 71 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32885) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32889) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32857) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32880) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32884) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32874) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32885) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32887) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32887) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32876) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32874) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32889) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32857) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32880) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32889) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32876) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32887) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32872) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32889) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32880) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32885) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32884) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32857) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32885) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32877) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32857) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32881) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32876) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32894) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32888) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32864) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32857) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32895) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32881) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32876) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32894) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32888) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32897) }, JumpIf { condition: Relative(13), location: 2434 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 44 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 44 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, Mov { destination: Relative(17), source: Relative(16) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U64), value: 2386996775688025706 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 39 }, Mov { destination: Direct(32771), source: Relative(18) }, Mov { destination: Direct(32772), source: Relative(17) }, Mov { destination: Direct(32773), source: Relative(19) }, Call { location: 23 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 39 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(18) }, Store { destination_pointer: Relative(17), source: Direct(32843) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(18) }, Mov { destination: Direct(32772), source: Relative(17) }, Mov { destination: Direct(32773), source: Relative(19) }, Call { location: 23 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(18) }, Trap { revert_data: HeapVector { pointer: Relative(16), size: Relative(14) } }, Const { destination: Relative(8), bit_size: Field, value: 35 }, Const { destination: Relative(13), bit_size: Field, value: 65 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(15) }, Store { destination_pointer: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 5265 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(16) }, JumpIf { condition: Relative(4), location: 2457 }, Call { location: 5300 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32899) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5633 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 4757 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(14) }, Mov { destination: Relative(4), source: Relative(15) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5059 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(14) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 2490 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2501 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32839) }, Mov { destination: Relative(16), source: Direct(32845) }, Mov { destination: Relative(17), source: Direct(32900) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 5121 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(1), bit_size: Field, value: 30 }, Const { destination: Relative(4), bit_size: Field, value: 70 }, Const { destination: Relative(13), bit_size: Field, value: 66 }, Const { destination: Relative(14), bit_size: Field, value: 130 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Direct(32854) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(1) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(1) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(13) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5303 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(17) }, JumpIf { condition: Relative(1), location: 2544 }, Call { location: 5345 }, Return, Call { location: 184 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5784 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(5) }, Mov { destination: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, JumpIf { condition: Relative(3), location: 2557 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32839) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(3) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Direct(32854) }, Mov { destination: Relative(9), source: Direct(32859) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5874 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 2625 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, JumpIf { condition: Relative(6), location: 2631 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 2637 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(4) }, Mov { destination: Relative(10), source: Direct(32843) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 6062 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6084 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2662 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32839) }, JumpIf { condition: Relative(4), location: 2668 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6084 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2684 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32839) }, JumpIf { condition: Relative(8), location: 2690 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2696 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Direct(32844) }, Mov { destination: Relative(15), source: Direct(32846) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5874 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(4) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2715 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32839) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(4), rhs: Direct(32838) }, JumpIf { condition: Relative(5), location: 2722 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Direct(32844) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6084 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2738 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32839) }, JumpIf { condition: Relative(11), location: 2744 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2750 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32846) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5874 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Field, value: 4 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Direct(32847) }, Mov { destination: Relative(18), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 5874 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Direct(32849) }, Mov { destination: Relative(18), source: Direct(32850) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5874 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(14), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 2788 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(14) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, JumpIf { condition: Relative(4), location: 2794 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(3) }, Mov { destination: Relative(18), source: Relative(2) }, Mov { destination: Relative(19), source: Direct(32847) }, Mov { destination: Relative(20), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5874 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(14), source_pointer: Relative(4) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 2811 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(14) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, JumpIf { condition: Relative(4), location: 2817 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(3) }, Mov { destination: Relative(19), source: Relative(2) }, Mov { destination: Relative(20), source: Direct(32844) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6084 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(14), source_pointer: Relative(4) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 2833 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32845) }, JumpIf { condition: Relative(14), location: 2839 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Const { destination: Relative(18), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(18) }, Call { location: 6214 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(20) }, Mov { destination: Relative(14), source: Relative(21) }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Direct(32839) }, JumpIf { condition: Relative(18), location: 2850 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(19) } }, Load { destination: Relative(14), source_pointer: Relative(4) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(14) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 2856 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(14) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(3) }, Mov { destination: Relative(21), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6239 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(14), source_pointer: Relative(2) }, Load { destination: Relative(19), source_pointer: Relative(4) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(19) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 2873 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Direct(32839) }, JumpIf { condition: Relative(19), location: 2879 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, Load { destination: Relative(14), source_pointer: Relative(4) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(14) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 2885 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(14) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 23 }, Mov { destination: Relative(23), source: Direct(0) }, Mov { destination: Relative(24), source: Relative(4) }, Mov { destination: Relative(25), source: Direct(32839) }, Mov { destination: Relative(26), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(22) }, Call { location: 6288 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(14), source: Relative(24) }, Mov { destination: Relative(21), source: Relative(25) }, JumpIf { condition: Relative(14), location: 3012 }, Jump { location: 2899 }, Const { destination: Relative(1), bit_size: Integer(U8), value: 55 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 33 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32887) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(1), bit_size: Integer(U8), value: 57 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32864) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32887) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32864) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32862) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32842)), HeapArray(HeapArray { pointer: Relative(1), size: 19 }), HeapArray(HeapArray { pointer: Relative(6), size: 29 }), MemoryAddress(Direct(32838))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 19 }, Array { value_types: [Simple(Integer(U8))], size: 29 }, Simple(Integer(U1))] }, Jump { location: 3036 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 3020 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 6288 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(7), source: Relative(11) }, JumpIf { condition: Relative(5), location: 3035 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, Jump { location: 3036 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 3044 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 6387 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 3059 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(5) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Direct(32866) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6721 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(5) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Direct(32868) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6848 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(5) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Direct(32869) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6987 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Direct(32856) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 7109 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32839) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32839) }, Const { destination: Relative(5), bit_size: Integer(U64), value: 2 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Direct(32844) }, Mov { destination: Relative(13), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 7259 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(8), bit_size: Integer(U64), value: 4 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Direct(32847) }, Mov { destination: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7259 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Direct(32847) }, Mov { destination: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7259 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Direct(32844) }, Mov { destination: Relative(13), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 7259 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(5) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 7448 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(10) }, JumpIf { condition: Relative(3), location: 3240 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, Return, Call { location: 184 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3250 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 3257 }, Call { location: 7540 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 3261 }, Call { location: 7543 }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3267 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 7546 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(13) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 3283 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32852) }, JumpIf { condition: Relative(7), location: 3287 }, Jump { location: 3286 }, Return, Load { destination: Relative(7), source_pointer: Relative(6) }, JumpIf { condition: Relative(7), location: 3427 }, Jump { location: 3290 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3297 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 3307 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, JumpIf { condition: Relative(13), location: 3307 }, Call { location: 7540 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 3311 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(9), op: Div, bit_size: U32, lhs: Relative(11), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 3316 }, Call { location: 7582 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Direct(32852) }, JumpIf { condition: Relative(11), location: 3323 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(13) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(15) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(16) }, Mov { destination: Relative(18), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32838) }, Not { destination: Relative(19), source: Relative(9), bit_size: U1 }, BinaryIntOp { destination: Relative(9), op: Or, bit_size: U1, lhs: Relative(16), rhs: Relative(19) }, JumpIf { condition: Relative(9), location: 3363 }, Jump { location: 3358 }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(13), rhs: Relative(3) }, JumpIf { condition: Relative(9), location: 3361 }, Jump { location: 3373 }, Store { destination_pointer: Relative(18), source: Direct(32842) }, Jump { location: 3373 }, Store { destination_pointer: Relative(18), source: Direct(32842) }, Load { destination: Relative(9), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 3369 }, Call { location: 7582 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Jump { location: 3373 }, Load { destination: Relative(9), source_pointer: Relative(18) }, JumpIf { condition: Relative(9), location: 3376 }, Jump { location: 3427 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(7) }, Mov { destination: Relative(20), source: Relative(14) }, Mov { destination: Relative(21), source: Relative(17) }, Mov { destination: Relative(22), source: Relative(15) }, Mov { destination: Relative(23), source: Relative(3) }, Mov { destination: Relative(24), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7588 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(17) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Store { destination_pointer: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(6), source: Direct(32842) }, Jump { location: 3427 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 3283 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 9417307514377997680 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3446 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7546 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 3462 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32852) }, JumpIf { condition: Relative(8), location: 3468 }, Jump { location: 3465 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(6) }, Return, Load { destination: Relative(8), source_pointer: Relative(2) }, JumpIf { condition: Relative(8), location: 3530 }, Jump { location: 3471 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3477 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 3487 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 3487 }, Call { location: 7540 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 3491 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(8), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 3496 }, Call { location: 7582 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(12), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32852) }, JumpIf { condition: Relative(10), location: 3503 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(10), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 3523 }, Jump { location: 3530 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(8), location: 3526 }, Jump { location: 3530 }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Jump { location: 3530 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 3462 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12632160011611521689 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3545 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7546 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 3561 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32852) }, JumpIf { condition: Relative(6), location: 3565 }, Jump { location: 3564 }, Return, Load { destination: Relative(6), source_pointer: Relative(5) }, JumpIf { condition: Relative(6), location: 3664 }, Jump { location: 3568 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3575 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 3585 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 3585 }, Call { location: 7540 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 3589 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(8), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 3594 }, Call { location: 7582 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(12), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32852) }, JumpIf { condition: Relative(10), location: 3601 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Not { destination: Relative(6), source: Relative(15), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U1, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 3621 }, Jump { location: 3664 }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 3624 }, Jump { location: 3664 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(14) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Store { destination_pointer: Relative(12), source: Direct(32842) }, BinaryIntOp { destination: Relative(6), op: Sub, bit_size: U32, lhs: Relative(9), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Direct(32843), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 3660 }, Call { location: 7624 }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Jump { location: 3664 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 3561 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14479745468926698352 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 11665340019033496436 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17677620431177272765 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 1359149291226868540 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Store { destination_pointer: Relative(2), source: Direct(32839) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 15535192719431679058 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 3765 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3773 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 3778 }, Jump { location: 3793 }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 3785 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(2), source: Direct(32839) }, Jump { location: 3789 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32852) }, JumpIf { condition: Relative(6), location: 3795 }, Jump { location: 3792 }, Jump { location: 3793 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Not { destination: Relative(11), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 3817 }, Jump { location: 3844 }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 3823 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 3433 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(13) }, Mov { destination: Relative(8), source: Relative(14) }, JumpIf { condition: Relative(6), location: 3839 }, Jump { location: 3837 }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Jump { location: 3844 }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(6), location: 3844 }, Jump { location: 3842 }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Jump { location: 3844 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32843) }, Mov { destination: Relative(2), source: Relative(6) }, Jump { location: 3789 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16567169223151679177 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 6895136539169241630 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(3), rhs: Direct(32856) }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(3), rhs: Direct(32896) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(3), rhs: Direct(32898) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(3), rhs: Direct(32901) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(3), rhs: Direct(32902) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 3861 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32852) }, JumpIf { condition: Relative(10), location: 3865 }, Jump { location: 3864 }, Return, Load { destination: Relative(10), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Not { destination: Relative(10), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 3886 }, Jump { location: 4000 }, JumpIf { condition: Relative(5), location: 3952 }, Jump { location: 3888 }, JumpIf { condition: Relative(6), location: 3940 }, Jump { location: 3890 }, JumpIf { condition: Relative(7), location: 3928 }, Jump { location: 3892 }, JumpIf { condition: Relative(8), location: 3916 }, Jump { location: 3894 }, JumpIf { condition: Relative(9), location: 3904 }, Jump { location: 3896 }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(3), rhs: Direct(32904) }, JumpIf { condition: Relative(20), location: 3900 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Relative(14), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(20), rhs: Direct(32863) }, Mov { destination: Relative(19), source: Relative(21) }, Jump { location: 3914 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 22 }, Mov { destination: Relative(22), source: Direct(0) }, Mov { destination: Relative(23), source: Relative(14) }, Mov { destination: Relative(24), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(21) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(20), source: Relative(23) }, Mov { destination: Relative(19), source: Relative(20) }, Jump { location: 3914 }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 3926 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(14) }, Mov { destination: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(19), source: Relative(22) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 3926 }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 3938 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(14) }, Mov { destination: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(19) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(18), source: Relative(21) }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 3938 }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 3950 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(14) }, Mov { destination: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(18) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(17), source: Relative(20) }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 3950 }, Mov { destination: Relative(10), source: Relative(15) }, Jump { location: 3959 }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(14), rhs: Direct(32841) }, Not { destination: Relative(17), source: Relative(15), bit_size: U1 }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(16), rhs: Direct(32841) }, Not { destination: Relative(18), source: Relative(15), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(17), rhs: Relative(18) }, Mov { destination: Relative(10), source: Relative(15) }, Jump { location: 3959 }, JumpIf { condition: Relative(10), location: 4000 }, Jump { location: 3961 }, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U32, lhs: Direct(32843), rhs: Relative(10) }, JumpIf { condition: Relative(17), location: 3966 }, Call { location: 7624 }, Load { destination: Relative(10), source_pointer: Relative(1) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(11) }, Store { destination_pointer: Relative(19), source: Relative(12) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(13) }, Store { destination_pointer: Relative(12), source: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Store { destination_pointer: Relative(14), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Store { destination_pointer: Relative(14), source: Direct(32842) }, Store { destination_pointer: Relative(1), source: Relative(11) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Jump { location: 4000 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(10) }, Jump { location: 3861 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 955212737754845985 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 15583592523844085222 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4043 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 4047 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32852) }, JumpIf { condition: Relative(6), location: 4256 }, Jump { location: 4050 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 4058 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 80 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32861) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4229 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 4255 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 83 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 6693878053340631133 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 79 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 79 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Not { destination: Relative(8), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 4272 }, Jump { location: 4281 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 7631 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 4281 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 4047 }, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Direct(32845), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 4305 }, Call { location: 7651 }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 4307 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(2), location: 4312 }, Jump { location: 4310 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Return, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(2) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 4318 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(2), source_pointer: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(5) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 7654 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(2) }, Jump { location: 4307 }, Call { location: 184 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32843) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 4359 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 4362 }, Jump { location: 4477 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4370 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32839) }, JumpIf { condition: Relative(7), location: 4476 }, Jump { location: 4375 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4383 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 7674 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 4400 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 4408 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, JumpIf { condition: Relative(13), location: 4474 }, Jump { location: 4412 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(11) }, Mov { destination: Relative(16), source: Relative(12) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7711 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 4428 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 4434 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 7878 }, Mov { destination: Relative(15), source: Direct(32773) }, Mov { destination: Relative(16), source: Direct(32774) }, Store { destination_pointer: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Direct(32839), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 4448 }, Jump { location: 4472 }, Load { destination: Relative(8), source_pointer: Relative(15) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4454 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Direct(32843), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 4460 }, Call { location: 7624 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 7878 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(12), source: Direct(32774) }, Store { destination_pointer: Relative(12), source: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Jump { location: 4472 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 4359 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 4359 }, Jump { location: 4477 }, Return, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4512 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 4516 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32852) }, JumpIf { condition: Relative(6), location: 4729 }, Jump { location: 4519 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 4527 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32861) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4702 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 4728 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 85 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 85 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9965974553718638037 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 81 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 81 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Not { destination: Relative(8), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 4745 }, Jump { location: 4754 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 7631 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 4754 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 4516 }, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4807 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 4811 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32852) }, JumpIf { condition: Relative(6), location: 5026 }, Jump { location: 4814 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 4822 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32887) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32861) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4999 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 5025 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, Not { destination: Relative(8), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 5046 }, Jump { location: 5056 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(9) }, Mov { destination: Relative(15), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 7934 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 5056 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 4811 }, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Direct(32845), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 5086 }, Call { location: 7651 }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 5088 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(2), location: 5093 }, Jump { location: 5091 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Return, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(2) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5099 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Load { destination: Relative(2), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(5) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(7) }, Mov { destination: Relative(13), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 7963 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(2) }, Jump { location: 5088 }, Call { location: 184 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32843) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 5146 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 5149 }, Jump { location: 5264 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5157 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32839) }, JumpIf { condition: Relative(7), location: 5263 }, Jump { location: 5162 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5170 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 7674 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5187 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 5195 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, JumpIf { condition: Relative(13), location: 5261 }, Jump { location: 5199 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(11) }, Mov { destination: Relative(16), source: Relative(12) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7992 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 5215 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 5221 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 7878 }, Mov { destination: Relative(15), source: Direct(32773) }, Mov { destination: Relative(16), source: Direct(32774) }, Store { destination_pointer: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Direct(32839), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 5235 }, Jump { location: 5259 }, Load { destination: Relative(8), source_pointer: Relative(15) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5241 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Direct(32843), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 5247 }, Call { location: 7624 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 7878 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(12), source: Direct(32774) }, Store { destination_pointer: Relative(12), source: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Jump { location: 5259 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 5146 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 5146 }, Jump { location: 5264 }, Return, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32842) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5275 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 5279 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 5284 }, Jump { location: 5282 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 5279 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16291778408346427203 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 3078107792722303059 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32842) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5313 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 5317 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 5322 }, Jump { location: 5320 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(7), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(9), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 5317 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 10951819287827820458 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 5357 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4757 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(3), rhs: Direct(32868) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(3), rhs: Direct(32869) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(3), rhs: Direct(32890) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 5451 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32852) }, JumpIf { condition: Relative(8), location: 5459 }, Jump { location: 5454 }, Load { destination: Relative(3), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Return, Load { destination: Relative(8), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 5463 }, Jump { location: 5508 }, Load { destination: Relative(9), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(15) }, Load { destination: Relative(13), source_pointer: Relative(17) }, JumpIf { condition: Relative(10), location: 5495 }, Jump { location: 5474 }, JumpIf { condition: Relative(11), location: 5490 }, Jump { location: 5476 }, JumpIf { condition: Relative(12), location: 5485 }, Jump { location: 5478 }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(3), rhs: Direct(32893) }, JumpIf { condition: Relative(16), location: 5482 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(17) } }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Direct(32849) }, Mov { destination: Relative(15), source: Relative(16) }, Jump { location: 5488 }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Direct(32847) }, Mov { destination: Relative(15), source: Relative(16) }, Jump { location: 5488 }, Mov { destination: Relative(9), source: Relative(15) }, Jump { location: 5493 }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(14), rhs: Direct(32905) }, Mov { destination: Relative(9), source: Relative(15) }, Jump { location: 5493 }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 5498 }, BinaryFieldOp { destination: Relative(9), op: Mul, lhs: Relative(14), rhs: Direct(32846) }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 5498 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(6) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(13) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 5508 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 5451 }, Call { location: 184 }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(3), rhs: Direct(32868) }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(3), rhs: Direct(32869) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(3), rhs: Direct(32890) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 5517 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32852) }, JumpIf { condition: Relative(8), location: 5521 }, Jump { location: 5520 }, Return, Load { destination: Relative(8), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(16), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(15) }, Not { destination: Relative(18), source: Relative(15), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(18), rhs: Relative(10) }, JumpIf { condition: Relative(15), location: 5554 }, Jump { location: 5630 }, JumpIf { condition: Relative(5), location: 5577 }, Jump { location: 5556 }, JumpIf { condition: Relative(6), location: 5572 }, Jump { location: 5558 }, JumpIf { condition: Relative(7), location: 5567 }, Jump { location: 5560 }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(3), rhs: Direct(32893) }, JumpIf { condition: Relative(19), location: 5564 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(14), rhs: Direct(32849) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 5570 }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(14), rhs: Direct(32847) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 5570 }, Mov { destination: Relative(15), source: Relative(18) }, Jump { location: 5575 }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(14), rhs: Direct(32905) }, Mov { destination: Relative(15), source: Relative(18) }, Jump { location: 5575 }, Mov { destination: Relative(10), source: Relative(15) }, Jump { location: 5580 }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(14), rhs: Direct(32846) }, Mov { destination: Relative(10), source: Relative(15) }, Jump { location: 5580 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(8) }, Mov { destination: Relative(20), source: Relative(13) }, Mov { destination: Relative(21), source: Relative(16) }, Mov { destination: Relative(22), source: Relative(17) }, Mov { destination: Relative(23), source: Relative(12) }, Mov { destination: Relative(24), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 7588 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(13) }, Load { destination: Relative(12), source_pointer: Relative(16) }, Load { destination: Relative(13), source_pointer: Relative(17) }, Load { destination: Relative(14), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(9) }, Store { destination_pointer: Relative(18), source: Relative(10) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Store { destination_pointer: Relative(14), source: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 7602 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Jump { location: 5630 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 5517 }, Call { location: 184 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 5642 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4757 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(3), rhs: Direct(32866) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 5734 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32852) }, JumpIf { condition: Relative(8), location: 5742 }, Jump { location: 5737 }, Load { destination: Relative(3), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Return, Load { destination: Relative(8), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 5746 }, Jump { location: 5781 }, Load { destination: Relative(11), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, Load { destination: Relative(12), source_pointer: Relative(16) }, JumpIf { condition: Relative(10), location: 5766 }, Jump { location: 5757 }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(3), rhs: Direct(32899) }, JumpIf { condition: Relative(11), location: 5761 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Relative(13), rhs: Direct(32846) }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(12), rhs: Direct(32846) }, Mov { destination: Relative(8), source: Relative(11) }, Mov { destination: Relative(9), source: Relative(13) }, Jump { location: 5771 }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(13), rhs: Direct(32844) }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(12), rhs: Direct(32846) }, Mov { destination: Relative(8), source: Relative(11) }, Mov { destination: Relative(9), source: Relative(13) }, Jump { location: 5771 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 3241 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 5781 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 5734 }, Call { location: 184 }, Const { destination: Relative(1), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 41 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(32839) }, Return, Call { location: 184 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5883 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 5890 }, Call { location: 7540 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 5894 }, Call { location: 7543 }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 5900 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 8156 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(13) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 5916 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32848) }, JumpIf { condition: Relative(7), location: 5920 }, Jump { location: 5919 }, Return, Load { destination: Relative(7), source_pointer: Relative(6) }, JumpIf { condition: Relative(7), location: 6059 }, Jump { location: 5923 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 5930 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 5940 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, JumpIf { condition: Relative(13), location: 5940 }, Call { location: 7540 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 5944 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(9), op: Div, bit_size: U32, lhs: Relative(11), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 5949 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(12), op: Div, bit_size: U32, lhs: Relative(11), rhs: Direct(32848) }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(12), rhs: Direct(32848) }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(13) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Direct(32848) }, JumpIf { condition: Relative(11), location: 5955 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(13) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(15) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(16) }, Mov { destination: Relative(18), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32838) }, Not { destination: Relative(19), source: Relative(9), bit_size: U1 }, BinaryIntOp { destination: Relative(9), op: Or, bit_size: U1, lhs: Relative(16), rhs: Relative(19) }, JumpIf { condition: Relative(9), location: 5995 }, Jump { location: 5990 }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(13), rhs: Relative(3) }, JumpIf { condition: Relative(9), location: 5993 }, Jump { location: 6005 }, Store { destination_pointer: Relative(18), source: Direct(32842) }, Jump { location: 6005 }, Store { destination_pointer: Relative(18), source: Direct(32842) }, Load { destination: Relative(9), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 6001 }, Call { location: 7582 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Jump { location: 6005 }, Load { destination: Relative(9), source_pointer: Relative(18) }, JumpIf { condition: Relative(9), location: 6008 }, Jump { location: 6059 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(7) }, Mov { destination: Relative(20), source: Relative(14) }, Mov { destination: Relative(21), source: Relative(17) }, Mov { destination: Relative(22), source: Relative(15) }, Mov { destination: Relative(23), source: Relative(3) }, Mov { destination: Relative(24), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7588 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(17) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Store { destination_pointer: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(6), source: Direct(32842) }, Jump { location: 6059 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 5916 }, Call { location: 184 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(1) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 6288 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(7) }, Mov { destination: Relative(4), source: Relative(8) }, JumpIf { condition: Relative(3), location: 6075 }, Jump { location: 6083 }, JumpIf { condition: Relative(3), location: 6078 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(4), rhs: Direct(32859) }, JumpIf { condition: Relative(1), location: 6082 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Jump { location: 6083 }, Return, Call { location: 184 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6093 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 8156 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 6109 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32848) }, JumpIf { condition: Relative(6), location: 6113 }, Jump { location: 6112 }, Return, Load { destination: Relative(6), source_pointer: Relative(5) }, JumpIf { condition: Relative(6), location: 6211 }, Jump { location: 6116 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6123 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 6133 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 6133 }, Call { location: 7540 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 6137 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(8), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 6142 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32848) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32848) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32848) }, JumpIf { condition: Relative(10), location: 6148 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Not { destination: Relative(6), source: Relative(15), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U1, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 6168 }, Jump { location: 6211 }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 6171 }, Jump { location: 6211 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(14) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Store { destination_pointer: Relative(12), source: Direct(32842) }, BinaryIntOp { destination: Relative(6), op: Sub, bit_size: U32, lhs: Relative(9), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Direct(32843), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 6207 }, Call { location: 7624 }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Jump { location: 6211 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 6109 }, Call { location: 184 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 169 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 168 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(3) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 6237 }, Mov { destination: Relative(5), source: Relative(6) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Jump { location: 6224 }, Mov { destination: Relative(2), source: Direct(32839) }, Return, Call { location: 184 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Store { destination_pointer: Relative(2), source: Direct(32839) }, Return, Call { location: 184 }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6301 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 8156 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 6317 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32848) }, JumpIf { condition: Relative(8), location: 6323 }, Jump { location: 6320 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(6) }, Return, Load { destination: Relative(8), source_pointer: Relative(2) }, JumpIf { condition: Relative(8), location: 6384 }, Jump { location: 6326 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6332 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 6342 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 6342 }, Call { location: 7540 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 6346 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(8), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 6351 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32848) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32848) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32848) }, JumpIf { condition: Relative(10), location: 6357 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(10), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 6377 }, Jump { location: 6384 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(8), location: 6380 }, Jump { location: 6384 }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Jump { location: 6384 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 6317 }, Call { location: 184 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 6394 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 8192 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Mov { destination: Relative(6), source: Relative(10) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6411 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U8), value: 45 }, Const { destination: Relative(9), bit_size: Integer(U8), value: 62 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Direct(32895) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32881) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32876) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32894) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32897) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(7) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32895) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32892) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32872) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32882) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32891) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32876) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32897) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Direct(32895) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32858) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32881) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32880) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32884) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32875) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32858) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32864) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32858) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32880) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32876) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32875) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32858) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32897) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 6495 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 6499 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32848) }, JumpIf { condition: Relative(5), location: 6684 }, Jump { location: 6502 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 6508 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 8482 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(6), source: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 6525 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 6533 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 6537 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32848) }, JumpIf { condition: Relative(5), location: 6636 }, Jump { location: 6540 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 8751 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Mov { destination: Relative(5), source: Relative(10) }, Const { destination: Relative(1), bit_size: Integer(U8), value: 70 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(6) }, Store { destination_pointer: Relative(8), source: Relative(1) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32885) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32891) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32884) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32892) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32872) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32882) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32891) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32876) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32895) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32892) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32872) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32882) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32891) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32876) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32897) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 6599 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 6603 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32848) }, JumpIf { condition: Relative(1), location: 6607 }, Jump { location: 6606 }, Return, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, JumpIf { condition: Relative(1), location: 6610 }, Jump { location: 6633 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(3) }, Load { destination: Relative(1), source_pointer: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6619 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6627 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32842)), HeapArray(HeapArray { pointer: Relative(6), size: 19 }), MemoryAddress(Direct(32843)), MemoryAddress(Relative(1)), HeapArray(HeapArray { pointer: Relative(10), size: 16 }), MemoryAddress(Direct(32842))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 19 }, Simple(Integer(U32)), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, Jump { location: 6633 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 6603 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 6639 }, Jump { location: 6681 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 6648 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 6288 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, Load { destination: Relative(12), source_pointer: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 6666 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(12) }, Load { destination: Relative(12), source_pointer: Relative(7) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 6674 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32842)), HeapArray(HeapArray { pointer: Relative(12), size: 16 }), MemoryAddress(Direct(32845)), MemoryAddress(Relative(5)), MemoryAddress(Relative(11)), HeapArray(HeapArray { pointer: Relative(15), size: 16 }), HeapArray(HeapArray { pointer: Relative(16), size: 16 }), MemoryAddress(Direct(32842))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, Jump { location: 6681 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 6537 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 6687 }, Jump { location: 6718 }, JumpIf { condition: Relative(5), location: 6689 }, Call { location: 7651 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 6703 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6711 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32842)), HeapArray(HeapArray { pointer: Relative(9), size: 16 }), MemoryAddress(Direct(32845)), MemoryAddress(Relative(8)), MemoryAddress(Relative(5)), HeapArray(HeapArray { pointer: Relative(13), size: 16 }), HeapArray(HeapArray { pointer: Relative(14), size: 16 }), MemoryAddress(Direct(32842))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, Jump { location: 6718 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 6499 }, Call { location: 184 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6730 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 8192 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(3), rhs: Direct(32866) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 6798 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32848) }, JumpIf { condition: Relative(8), location: 6806 }, Jump { location: 6801 }, Load { destination: Relative(3), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Return, Load { destination: Relative(8), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 6810 }, Jump { location: 6845 }, Load { destination: Relative(11), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, Load { destination: Relative(12), source_pointer: Relative(16) }, JumpIf { condition: Relative(10), location: 6830 }, Jump { location: 6821 }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(3), rhs: Direct(32899) }, JumpIf { condition: Relative(11), location: 6825 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Relative(13), rhs: Direct(32846) }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(12), rhs: Direct(32846) }, Mov { destination: Relative(8), source: Relative(11) }, Mov { destination: Relative(9), source: Relative(13) }, Jump { location: 6835 }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(13), rhs: Direct(32844) }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(12), rhs: Direct(32846) }, Mov { destination: Relative(8), source: Relative(11) }, Mov { destination: Relative(9), source: Relative(13) }, Jump { location: 6835 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 5874 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 6845 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 6798 }, Call { location: 184 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6857 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 8192 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(3), rhs: Direct(32868) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(3), rhs: Direct(32869) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(3), rhs: Direct(32890) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 6927 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32848) }, JumpIf { condition: Relative(8), location: 6935 }, Jump { location: 6930 }, Load { destination: Relative(3), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Return, Load { destination: Relative(8), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 6939 }, Jump { location: 6984 }, Load { destination: Relative(9), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(15) }, Load { destination: Relative(13), source_pointer: Relative(17) }, JumpIf { condition: Relative(10), location: 6971 }, Jump { location: 6950 }, JumpIf { condition: Relative(11), location: 6966 }, Jump { location: 6952 }, JumpIf { condition: Relative(12), location: 6961 }, Jump { location: 6954 }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(3), rhs: Direct(32893) }, JumpIf { condition: Relative(16), location: 6958 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(17) } }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Direct(32849) }, Mov { destination: Relative(15), source: Relative(16) }, Jump { location: 6964 }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Direct(32847) }, Mov { destination: Relative(15), source: Relative(16) }, Jump { location: 6964 }, Mov { destination: Relative(9), source: Relative(15) }, Jump { location: 6969 }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(14), rhs: Direct(32905) }, Mov { destination: Relative(9), source: Relative(15) }, Jump { location: 6969 }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 6974 }, BinaryFieldOp { destination: Relative(9), op: Mul, lhs: Relative(14), rhs: Direct(32846) }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 6974 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(6) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(13) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 5874 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 6984 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 6927 }, Call { location: 184 }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(3), rhs: Direct(32868) }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(3), rhs: Direct(32869) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(3), rhs: Direct(32890) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 6993 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32848) }, JumpIf { condition: Relative(8), location: 6997 }, Jump { location: 6996 }, Return, Load { destination: Relative(8), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(16), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(15) }, Not { destination: Relative(18), source: Relative(15), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(18), rhs: Relative(10) }, JumpIf { condition: Relative(15), location: 7030 }, Jump { location: 7106 }, JumpIf { condition: Relative(5), location: 7053 }, Jump { location: 7032 }, JumpIf { condition: Relative(6), location: 7048 }, Jump { location: 7034 }, JumpIf { condition: Relative(7), location: 7043 }, Jump { location: 7036 }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(3), rhs: Direct(32893) }, JumpIf { condition: Relative(19), location: 7040 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(14), rhs: Direct(32849) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 7046 }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(14), rhs: Direct(32847) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 7046 }, Mov { destination: Relative(15), source: Relative(18) }, Jump { location: 7051 }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(14), rhs: Direct(32905) }, Mov { destination: Relative(15), source: Relative(18) }, Jump { location: 7051 }, Mov { destination: Relative(10), source: Relative(15) }, Jump { location: 7056 }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(14), rhs: Direct(32846) }, Mov { destination: Relative(10), source: Relative(15) }, Jump { location: 7056 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(8) }, Mov { destination: Relative(20), source: Relative(13) }, Mov { destination: Relative(21), source: Relative(16) }, Mov { destination: Relative(22), source: Relative(17) }, Mov { destination: Relative(23), source: Relative(12) }, Mov { destination: Relative(24), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 7588 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(13) }, Load { destination: Relative(12), source_pointer: Relative(16) }, Load { destination: Relative(13), source_pointer: Relative(17) }, Load { destination: Relative(14), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(9) }, Store { destination_pointer: Relative(18), source: Relative(10) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Store { destination_pointer: Relative(14), source: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Jump { location: 7106 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 6993 }, Call { location: 184 }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(3), rhs: Direct(32856) }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(3), rhs: Direct(32896) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(3), rhs: Direct(32898) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(3), rhs: Direct(32901) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(3), rhs: Direct(32902) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 7117 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32848) }, JumpIf { condition: Relative(10), location: 7121 }, Jump { location: 7120 }, Return, Load { destination: Relative(10), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Not { destination: Relative(10), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 7142 }, Jump { location: 7256 }, JumpIf { condition: Relative(5), location: 7208 }, Jump { location: 7144 }, JumpIf { condition: Relative(6), location: 7196 }, Jump { location: 7146 }, JumpIf { condition: Relative(7), location: 7184 }, Jump { location: 7148 }, JumpIf { condition: Relative(8), location: 7172 }, Jump { location: 7150 }, JumpIf { condition: Relative(9), location: 7160 }, Jump { location: 7152 }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(3), rhs: Direct(32904) }, JumpIf { condition: Relative(20), location: 7156 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Relative(14), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(20), rhs: Direct(32863) }, Mov { destination: Relative(19), source: Relative(21) }, Jump { location: 7170 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 22 }, Mov { destination: Relative(22), source: Direct(0) }, Mov { destination: Relative(23), source: Relative(14) }, Mov { destination: Relative(24), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(21) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(20), source: Relative(23) }, Mov { destination: Relative(19), source: Relative(20) }, Jump { location: 7170 }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 7182 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(14) }, Mov { destination: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(19), source: Relative(22) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 7182 }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 7194 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(14) }, Mov { destination: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(19) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(18), source: Relative(21) }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 7194 }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 7206 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(14) }, Mov { destination: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(18) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(17), source: Relative(20) }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 7206 }, Mov { destination: Relative(10), source: Relative(15) }, Jump { location: 7215 }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(14), rhs: Direct(32841) }, Not { destination: Relative(17), source: Relative(15), bit_size: U1 }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(16), rhs: Direct(32841) }, Not { destination: Relative(18), source: Relative(15), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(17), rhs: Relative(18) }, Mov { destination: Relative(10), source: Relative(15) }, Jump { location: 7215 }, JumpIf { condition: Relative(10), location: 7256 }, Jump { location: 7217 }, Load { destination: Relative(10), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(17), op: LessThanEquals, bit_size: U32, lhs: Direct(32843), rhs: Relative(10) }, JumpIf { condition: Relative(17), location: 7222 }, Call { location: 7624 }, Load { destination: Relative(10), source_pointer: Relative(1) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(11) }, Store { destination_pointer: Relative(19), source: Relative(12) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(13) }, Store { destination_pointer: Relative(12), source: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Store { destination_pointer: Relative(14), source: Relative(16) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 7602 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Store { destination_pointer: Relative(14), source: Direct(32842) }, Store { destination_pointer: Relative(1), source: Relative(11) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Jump { location: 7256 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(10) }, Jump { location: 7117 }, Call { location: 184 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7268 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 7275 }, Call { location: 7540 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 7279 }, Call { location: 7543 }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 7285 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 9024 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(13) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 7301 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(7), location: 7305 }, Jump { location: 7304 }, Return, Load { destination: Relative(7), source_pointer: Relative(6) }, JumpIf { condition: Relative(7), location: 7445 }, Jump { location: 7308 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 7315 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 7325 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, JumpIf { condition: Relative(13), location: 7325 }, Call { location: 7540 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 7329 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(9), op: Div, bit_size: U32, lhs: Relative(11), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 7334 }, Call { location: 7582 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, JumpIf { condition: Relative(11), location: 7341 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(13) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(15) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(16) }, Mov { destination: Relative(18), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32838) }, Not { destination: Relative(19), source: Relative(9), bit_size: U1 }, BinaryIntOp { destination: Relative(9), op: Or, bit_size: U1, lhs: Relative(16), rhs: Relative(19) }, JumpIf { condition: Relative(9), location: 7381 }, Jump { location: 7376 }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(13), rhs: Relative(3) }, JumpIf { condition: Relative(9), location: 7379 }, Jump { location: 7391 }, Store { destination_pointer: Relative(18), source: Direct(32842) }, Jump { location: 7391 }, Store { destination_pointer: Relative(18), source: Direct(32842) }, Load { destination: Relative(9), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 7387 }, Call { location: 7582 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Jump { location: 7391 }, Load { destination: Relative(9), source_pointer: Relative(18) }, JumpIf { condition: Relative(9), location: 7394 }, Jump { location: 7445 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(7) }, Mov { destination: Relative(20), source: Relative(14) }, Mov { destination: Relative(21), source: Relative(17) }, Mov { destination: Relative(22), source: Relative(15) }, Mov { destination: Relative(23), source: Relative(3) }, Mov { destination: Relative(24), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 9060 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(17) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 7602 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 7602 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Store { destination_pointer: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 7602 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 7602 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(6), source: Direct(32842) }, Jump { location: 7445 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 7301 }, Call { location: 184 }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7458 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7466 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 7471 }, Jump { location: 7486 }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7478 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(2), source: Direct(32839) }, Jump { location: 7482 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, JumpIf { condition: Relative(6), location: 7488 }, Jump { location: 7485 }, Jump { location: 7486 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Not { destination: Relative(11), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 7510 }, Jump { location: 7537 }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7516 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 9070 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(13) }, Mov { destination: Relative(8), source: Relative(14) }, JumpIf { condition: Relative(6), location: 7532 }, Jump { location: 7530 }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Jump { location: 7537 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U64, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(6), location: 7537 }, Jump { location: 7535 }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Jump { location: 7537 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32843) }, Mov { destination: Relative(2), source: Relative(6) }, Jump { location: 7482 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 7233212735005103307 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16850003084350092401 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 7567 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Direct(32843) }, Mov { destination: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 9170 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(8) }, Cast { destination: Relative(6), source: Relative(3), bit_size: Integer(U32) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Field }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(3) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Load { destination: Relative(7), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Direct(32842) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 7606 }, Jump { location: 7608 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 7623 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 7620 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 7613 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 7623 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, BinaryFieldOp { destination: Relative(3), op: LessThan, lhs: Relative(1), rhs: Relative(2) }, Mov { destination: Relative(1), source: Relative(3) }, Return, Call { location: 184 }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32852) }, JumpIf { condition: Relative(5), location: 7636 }, Call { location: 9247 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 7602 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Store { destination_pointer: Relative(8), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 7648 }, Call { location: 7582 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16954218183513903507 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 7659 }, Call { location: 9247 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7602 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Store { destination_pointer: Relative(8), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 7671 }, Call { location: 7582 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32775), source_pointer: Direct(32775) }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32775), rhs: Direct(32772) }, Load { destination: Direct(32777), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Const { destination: Direct(32780), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32780) }, JumpIf { condition: Direct(32778), location: 7683 }, Jump { location: 7687 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Jump { location: 7709 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32781) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32780) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Mov { destination: Direct(32783), source: Direct(32779) }, Mov { destination: Direct(32784), source: Direct(32780) }, BinaryIntOp { destination: Direct(32785), op: Equals, bit_size: U32, lhs: Direct(32783), rhs: Direct(32782) }, JumpIf { condition: Direct(32785), location: 7708 }, Load { destination: Direct(32781), source_pointer: Direct(32783) }, Store { destination_pointer: Direct(32784), source: Direct(32781) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, Jump { location: 7701 }, Jump { location: 7709 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Return, Call { location: 184 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(4), rhs: Direct(32856) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(4), rhs: Direct(32896) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32898) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Direct(32901) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32902) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 7723 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 7756 }, Jump { location: 7726 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(4), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 7731 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(8) }, JumpIf { condition: Relative(7), location: 7736 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7602 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7602 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(3) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Mov { destination: Relative(1), source: Relative(4) }, Return, Load { destination: Relative(13), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, JumpIf { condition: Relative(14), location: 7760 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, Load { destination: Relative(14), source_pointer: Relative(16) }, JumpIf { condition: Relative(7), location: 7765 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(3) }, Load { destination: Relative(15), source_pointer: Relative(17) }, JumpIf { condition: Relative(8), location: 7834 }, Jump { location: 7770 }, JumpIf { condition: Relative(9), location: 7822 }, Jump { location: 7772 }, JumpIf { condition: Relative(10), location: 7810 }, Jump { location: 7774 }, JumpIf { condition: Relative(11), location: 7798 }, Jump { location: 7776 }, JumpIf { condition: Relative(12), location: 7786 }, Jump { location: 7778 }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(4), rhs: Direct(32904) }, JumpIf { condition: Relative(19), location: 7782 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(19), rhs: Direct(32863) }, Mov { destination: Relative(18), source: Relative(14) }, Jump { location: 7796 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(14) }, Mov { destination: Relative(23), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(19), source: Relative(22) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 7796 }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 7808 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(14) }, Mov { destination: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(19) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(18), source: Relative(21) }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 7808 }, Mov { destination: Relative(16), source: Relative(17) }, Jump { location: 7820 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(14) }, Mov { destination: Relative(21), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(18) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(17), source: Relative(20) }, Mov { destination: Relative(16), source: Relative(17) }, Jump { location: 7820 }, Mov { destination: Relative(13), source: Relative(16) }, Jump { location: 7832 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(14) }, Mov { destination: Relative(20), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(17) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(16), source: Relative(19) }, Mov { destination: Relative(13), source: Relative(16) }, Jump { location: 7832 }, Mov { destination: Relative(2), source: Relative(13) }, Jump { location: 7841 }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(14), rhs: Direct(32841) }, Not { destination: Relative(14), source: Relative(13), bit_size: U1 }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(15), rhs: Direct(32841) }, Not { destination: Relative(15), source: Relative(13), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U1, lhs: Relative(14), rhs: Relative(15) }, Mov { destination: Relative(2), source: Relative(13) }, Jump { location: 7841 }, JumpIf { condition: Relative(2), location: 7843 }, Jump { location: 7875 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(13), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32837) }, JumpIf { condition: Relative(14), location: 7848 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(5) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7602 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(13) }, Store { destination_pointer: Relative(18), source: Relative(15) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7602 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Store { destination_pointer: Relative(1), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, JumpIf { condition: Relative(14), location: 7873 }, Call { location: 7582 }, Store { destination_pointer: Relative(6), source: Relative(2) }, Jump { location: 7875 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 7723 }, Load { destination: Direct(32775), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32776), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Load { destination: Direct(32777), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32780), op: LessThanEquals, bit_size: U32, lhs: Direct(32779), rhs: Direct(32777) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32775), rhs: Direct(2) }, JumpIf { condition: Direct(32780), location: 7889 }, Jump { location: 7906 }, JumpIf { condition: Direct(32781), location: 7891 }, Jump { location: 7895 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, Jump { location: 7905 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(32783) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32782) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32777) }, Jump { location: 7905 }, Jump { location: 7918 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32782), op: Mul, bit_size: U32, lhs: Direct(32779), rhs: Direct(32783) }, Const { destination: Direct(32784), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(32784) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32783) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32779) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32782) }, Jump { location: 7918 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, JumpIf { condition: Direct(32781), location: 7932 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(32776) }, Mov { destination: Direct(32784), source: Direct(32778) }, Mov { destination: Direct(32785), source: Direct(32780) }, BinaryIntOp { destination: Direct(32786), op: Equals, bit_size: U32, lhs: Direct(32784), rhs: Direct(32783) }, JumpIf { condition: Direct(32786), location: 7932 }, Load { destination: Direct(32782), source_pointer: Direct(32784) }, Store { destination_pointer: Direct(32785), source: Direct(32782) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32785), op: Add, bit_size: U32, lhs: Direct(32785), rhs: Direct(2) }, Jump { location: 7925 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(32776) }, Return, Call { location: 184 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32852) }, JumpIf { condition: Relative(6), location: 7939 }, Call { location: 9247 }, Load { destination: Relative(6), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32845) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 7602 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 7602 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Store { destination_pointer: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 7960 }, Call { location: 7582 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, Call { location: 184 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, JumpIf { condition: Relative(6), location: 7968 }, Call { location: 9247 }, Load { destination: Relative(6), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32845) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7602 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7602 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Store { destination_pointer: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 7989 }, Call { location: 7582 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, Call { location: 184 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32843) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32900) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 8002 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 8057 }, Jump { location: 8005 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(3), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(4), location: 8010 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(12) }, JumpIf { condition: Relative(7), location: 8020 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7602 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, Store { destination_pointer: Relative(14), source: Relative(7) }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7602 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(11) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7602 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7602 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Mov { destination: Relative(1), source: Relative(3) }, Return, Load { destination: Relative(11), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, JumpIf { condition: Relative(12), location: 8061 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32843) }, JumpIf { condition: Relative(7), location: 8068 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(8) }, Load { destination: Relative(15), source_pointer: Relative(17) }, JumpIf { condition: Relative(10), location: 8087 }, Jump { location: 8073 }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Direct(32903) }, JumpIf { condition: Relative(11), location: 8077 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(13) }, Mov { destination: Relative(19), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(18) }, Mov { destination: Relative(2), source: Relative(11) }, Jump { location: 8097 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(13) }, Mov { destination: Relative(19), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 7627 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(18) }, Mov { destination: Relative(2), source: Relative(11) }, Jump { location: 8097 }, JumpIf { condition: Relative(2), location: 8099 }, Jump { location: 8153 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(11), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, JumpIf { condition: Relative(13), location: 8104 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(12) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(14) }, Load { destination: Relative(19), source_pointer: Relative(21) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7602 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(13) }, Store { destination_pointer: Relative(22), source: Relative(18) }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7602 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(16) }, Store { destination_pointer: Relative(18), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7602 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, Store { destination_pointer: Relative(18), source: Relative(15) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7602 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(17) }, Store { destination_pointer: Relative(1), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, JumpIf { condition: Relative(12), location: 8151 }, Call { location: 7582 }, Store { destination_pointer: Relative(6), source: Relative(2) }, Jump { location: 8153 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 8002 }, Call { location: 184 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 8177 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Direct(32843) }, Mov { destination: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 9170 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(8) }, Cast { destination: Relative(6), source: Relative(3), bit_size: Integer(U32) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Field }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(3) }, Return, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 8230 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 8234 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32848) }, JumpIf { condition: Relative(6), location: 8449 }, Jump { location: 8237 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 8245 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32887) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32861) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 8422 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 8448 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, Not { destination: Relative(8), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 8469 }, Jump { location: 8479 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(9) }, Mov { destination: Relative(15), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 9250 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 8479 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 8234 }, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 8510 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 8514 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32848) }, JumpIf { condition: Relative(6), location: 8723 }, Jump { location: 8517 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 8525 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 80 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32861) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 8696 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 8722 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 83 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 6693878053340631133 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 79 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 79 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Not { destination: Relative(8), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 8739 }, Jump { location: 8748 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 9279 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 8748 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 8514 }, Call { location: 184 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 8779 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 8783 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32848) }, JumpIf { condition: Relative(6), location: 8996 }, Jump { location: 8786 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 8794 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32857) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32895) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32891) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32861) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 8969 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 8995 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 85 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 85 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9965974553718638037 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 81 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 81 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Not { destination: Relative(8), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 9012 }, Jump { location: 9021 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 9279 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 9021 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 8783 }, Call { location: 184 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 9045 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Direct(32843) }, Mov { destination: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 9170 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(8) }, Cast { destination: Relative(6), source: Relative(3), bit_size: Integer(U32) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Field }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(3) }, Return, Call { location: 184 }, Load { destination: Relative(7), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Direct(32842) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Return, Call { location: 184 }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 9083 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 9024 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 9099 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 9105 }, Jump { location: 9102 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(6) }, Return, Load { destination: Relative(8), source_pointer: Relative(2) }, JumpIf { condition: Relative(8), location: 9167 }, Jump { location: 9108 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 9114 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 9124 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 9124 }, Call { location: 7540 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 9128 }, Call { location: 7582 }, BinaryIntOp { destination: Relative(8), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 9133 }, Call { location: 7582 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(12), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, JumpIf { condition: Relative(10), location: 9140 }, Call { location: 7585 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32845) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(10), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 9160 }, Jump { location: 9167 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(8), location: 9163 }, Jump { location: 9167 }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Jump { location: 9167 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 9099 }, Call { location: 184 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 9177 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Cast { destination: Relative(4), source: Relative(1), bit_size: Field }, Const { destination: Relative(6), bit_size: Field, value: 18446744073709551616 }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(4), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 9299 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(6), source: Relative(13) }, Mov { destination: Relative(8), source: Relative(14) }, Mov { destination: Relative(9), source: Relative(15) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 9210 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 9214 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 9228 }, Jump { location: 9217 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 9329 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(10) }, Return, JumpIf { condition: Relative(5), location: 9230 }, Call { location: 7585 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(8) }, Mov { destination: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 9354 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 9214 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5727012404371710682 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 184 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32848) }, JumpIf { condition: Relative(6), location: 9255 }, Call { location: 9247 }, Load { destination: Relative(6), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32845) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 11 }, Call { location: 7602 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 11 }, Call { location: 7602 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Store { destination_pointer: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 9276 }, Call { location: 7582 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, Call { location: 184 }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32848) }, JumpIf { condition: Relative(5), location: 9284 }, Call { location: 9247 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 6 }, Call { location: 7602 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Store { destination_pointer: Relative(8), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 9296 }, Call { location: 7582 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, Call { location: 184 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(1) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(32839) }, Mov { destination: Relative(4), source: Direct(32838) }, Return, Call { location: 184 }, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(6), location: 9335 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(7) } }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(1) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 9411 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Direct(32842) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Return, Call { location: 184 }, Load { destination: Relative(6), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U1, lhs: Relative(6), rhs: Direct(32838) }, JumpIf { condition: Relative(7), location: 9360 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, JumpIf { condition: Relative(7), location: 9387 }, Jump { location: 9364 }, Load { destination: Relative(6), source_pointer: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, JumpIf { condition: Relative(10), location: 9371 }, Call { location: 7585 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7602 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Store { destination_pointer: Relative(12), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, JumpIf { condition: Relative(7), location: 9382 }, Call { location: 7582 }, Store { destination_pointer: Relative(1), source: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Jump { location: 9410 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Relative(2) }, Mov { destination: Relative(10), source: Relative(3) }, Mov { destination: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 9411 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7602 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32843) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Direct(32843) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Jump { location: 9410 }, Return, Call { location: 184 }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 9414 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, JumpIf { condition: Relative(6), location: 9442 }, Jump { location: 9417 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 9424 }, Call { location: 1058 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BlackBox(Poseidon2Permutation { message: HeapVector { pointer: Relative(8), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 4 }, len: Direct(32836) }), Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Return, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 9446 }, Jump { location: 9469 }, Load { destination: Relative(6), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryFieldOp { destination: Relative(10), op: Add, lhs: Relative(7), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 7602 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Jump { location: 9469 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 9414 }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", @@ -276,7 +276,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "22": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_0.snap index a5093d57850..3e60f9be340 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_0.snap @@ -241,7 +241,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32903 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 12 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32891), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32891 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 23 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 34 }, Call { location: 91 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32903 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 33 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 26 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 6 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Const { destination: Direct(32838), bit_size: Integer(U1), value: 0 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32840), bit_size: Field, value: 0 }, Const { destination: Direct(32841), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32842), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32843), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32844), bit_size: Field, value: 2 }, Const { destination: Direct(32845), bit_size: Field, value: 3 }, Const { destination: Direct(32846), bit_size: Integer(U32), value: 5 }, Const { destination: Direct(32847), bit_size: Field, value: 5 }, Const { destination: Direct(32848), bit_size: Field, value: 6 }, Const { destination: Direct(32849), bit_size: Field, value: 7 }, Const { destination: Direct(32850), bit_size: Integer(U32), value: 8 }, Const { destination: Direct(32851), bit_size: Field, value: 11 }, Const { destination: Direct(32852), bit_size: Field, value: 12 }, Const { destination: Direct(32853), bit_size: Field, value: 13 }, Const { destination: Direct(32854), bit_size: Integer(U8), value: 32 }, Const { destination: Direct(32855), bit_size: Integer(U8), value: 44 }, Const { destination: Direct(32856), bit_size: Integer(U8), value: 46 }, Const { destination: Direct(32857), bit_size: Integer(U8), value: 49 }, Const { destination: Direct(32858), bit_size: Field, value: 55 }, Const { destination: Direct(32859), bit_size: Integer(U8), value: 58 }, Const { destination: Direct(32860), bit_size: Integer(U8), value: 65 }, Const { destination: Direct(32861), bit_size: Integer(U8), value: 78 }, Const { destination: Direct(32862), bit_size: Integer(U8), value: 95 }, Const { destination: Direct(32863), bit_size: Integer(U8), value: 97 }, Const { destination: Direct(32864), bit_size: Integer(U8), value: 98 }, Const { destination: Direct(32865), bit_size: Integer(U8), value: 99 }, Const { destination: Direct(32866), bit_size: Integer(U8), value: 100 }, Const { destination: Direct(32867), bit_size: Integer(U8), value: 101 }, Const { destination: Direct(32868), bit_size: Integer(U8), value: 102 }, Const { destination: Direct(32869), bit_size: Integer(U8), value: 103 }, Const { destination: Direct(32870), bit_size: Integer(U8), value: 104 }, Const { destination: Direct(32871), bit_size: Integer(U8), value: 105 }, Const { destination: Direct(32872), bit_size: Integer(U8), value: 107 }, Const { destination: Direct(32873), bit_size: Integer(U8), value: 108 }, Const { destination: Direct(32874), bit_size: Integer(U8), value: 109 }, Const { destination: Direct(32875), bit_size: Integer(U8), value: 110 }, Const { destination: Direct(32876), bit_size: Integer(U8), value: 111 }, Const { destination: Direct(32877), bit_size: Integer(U8), value: 114 }, Const { destination: Direct(32878), bit_size: Integer(U8), value: 115 }, Const { destination: Direct(32879), bit_size: Integer(U8), value: 116 }, Const { destination: Direct(32880), bit_size: Integer(U8), value: 117 }, Const { destination: Direct(32881), bit_size: Integer(U8), value: 118 }, Const { destination: Direct(32882), bit_size: Integer(U8), value: 121 }, Const { destination: Direct(32883), bit_size: Integer(U8), value: 123 }, Const { destination: Direct(32884), bit_size: Field, value: 123 }, Const { destination: Direct(32885), bit_size: Integer(U8), value: 125 }, Const { destination: Direct(32886), bit_size: Field, value: 125 }, Const { destination: Direct(32887), bit_size: Field, value: 132 }, Const { destination: Direct(32888), bit_size: Field, value: 169 }, Const { destination: Direct(32889), bit_size: Field, value: 170 }, Const { destination: Direct(32890), bit_size: Field, value: 171 }, Return, Call { location: 1481 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32843) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32839) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 177 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(6) }, Mov { destination: Relative(12), source: Relative(7) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 196 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, JumpIf { condition: Relative(10), location: 201 }, Call { location: 1679 }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 207 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Direct(32842) }, Mov { destination: Relative(17), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 1682 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(15) }, Mov { destination: Relative(12), source: Relative(16) }, JumpIf { condition: Relative(8), location: 221 }, Call { location: 1782 }, Const { destination: Relative(5), bit_size: Integer(U8), value: 73 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(5) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32878) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32867) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32877) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32879) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32867) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32866) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32854) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32883) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32863) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32873) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32880) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32867) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32854) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32864) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32880) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32879) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32854) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32869) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32876) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32879) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32854) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32883) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32869) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32876) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32879) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32854) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32868) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32876) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32877) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32854) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32879) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32870) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32867) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32854) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32878) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32863) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32874) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32867) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32854) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32872) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32867) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32882) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(4), rhs: Relative(12) }, JumpIf { condition: Relative(5), location: 347 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, Mov { destination: Relative(15), source: Relative(14) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(16) }, Mov { destination: Direct(32772), source: Relative(15) }, Mov { destination: Direct(32773), source: Relative(17) }, Call { location: 23 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(16) }, Store { destination_pointer: Relative(15), source: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(4) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(12) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(14), size: Relative(13) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1785 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 363 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32839) }, JumpIf { condition: Relative(6), location: 368 }, Call { location: 1916 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Direct(32839) }, Mov { destination: Relative(16), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 1682 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(14) }, Mov { destination: Relative(6), source: Relative(15) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(4), location: 381 }, Call { location: 1919 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32840) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32838) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32839) }, Load { destination: Relative(15), source_pointer: Relative(12) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(15) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 466 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(15) }, Mov { destination: Relative(2), source: Direct(32839) }, Jump { location: 470 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 1469 }, Jump { location: 473 }, Load { destination: Relative(6), source_pointer: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 481 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U8), value: 72 }, Const { destination: Relative(11), bit_size: Integer(U8), value: 77 }, Const { destination: Relative(12), bit_size: Integer(U8), value: 112 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(13), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32863) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32878) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32870) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(11) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32863) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(12) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32854) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32873) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32867) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32869) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32879) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32870) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32854) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32874) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32880) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32878) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32879) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32854) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32864) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32867) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32854) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32857) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32855) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32854) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32869) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32876) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32879) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32854) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32883) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32873) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32867) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32885) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, JumpIf { condition: Relative(9), location: 585 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 39 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 39 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, Mov { destination: Relative(15), source: Relative(14) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U64), value: 12389747999246339213 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 36 }, Mov { destination: Direct(32771), source: Relative(16) }, Mov { destination: Direct(32772), source: Relative(15) }, Mov { destination: Direct(32773), source: Relative(17) }, Call { location: 23 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(16) }, Store { destination_pointer: Relative(15), source: Direct(32842) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(14), size: Relative(11) } }, Const { destination: Relative(11), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Direct(32842) }, Mov { destination: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 1682 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(14) }, Mov { destination: Relative(9), source: Relative(15) }, JumpIf { condition: Relative(7), location: 597 }, Call { location: 1782 }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(4), location: 621 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, Mov { destination: Relative(11), source: Relative(7) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(13) }, Mov { destination: Direct(32772), source: Relative(11) }, Mov { destination: Direct(32773), source: Relative(14) }, Call { location: 23 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(13) }, Store { destination_pointer: Relative(11), source: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(9) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(7), size: Relative(6) } }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32846) }, Load { destination: Relative(4), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, Load { destination: Relative(5), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32850) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32839) }, Load { destination: Relative(11), source_pointer: Relative(7) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 708 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(11) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(4) }, Mov { destination: Relative(18), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(4) }, Mov { destination: Relative(18), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 736 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, JumpIf { condition: Relative(8), location: 741 }, Call { location: 1922 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Direct(32842) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 1682 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(15) }, Mov { destination: Relative(8), source: Relative(16) }, JumpIf { condition: Relative(7), location: 753 }, Call { location: 1782 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 69 }, Const { destination: Relative(5), bit_size: Integer(U8), value: 120 }, Const { destination: Relative(7), bit_size: Integer(U8), value: 119 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(4) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(12) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32867) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32865) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32879) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32867) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32866) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32854) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32883) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32867) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32862) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32881) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32863) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32873) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32880) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32867) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32885) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32855) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32854) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32864) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32880) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32879) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32854) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32869) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32876) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32879) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32854) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32883) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32869) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32876) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32879) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32885) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(8), rhs: Relative(6) }, JumpIf { condition: Relative(4), location: 857 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 40 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, Mov { destination: Relative(12), source: Relative(7) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U64), value: 3316745884754988903 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 36 }, Mov { destination: Direct(32771), source: Relative(14) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(15) }, Call { location: 23 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(14) }, Store { destination_pointer: Relative(12), source: Direct(32843) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(6) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(7), size: Relative(5) } }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 863 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32839) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 946 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 954 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(2), source: Direct(32839) }, Jump { location: 958 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(4), location: 1449 }, Jump { location: 961 }, Load { destination: Relative(4), source_pointer: Relative(6) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 969 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(4), location: 974 }, Call { location: 1925 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 980 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(8) }, Store { destination_pointer: Relative(10), source: Direct(32861) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32876) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32879) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32868) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32876) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32880) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32875) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32866) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32871) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32875) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32878) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32867) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32877) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32879) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32867) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32866) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32872) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32867) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32882) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32883) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32867) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32875) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32879) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32877) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32882) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32862) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32872) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32867) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32882) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32885) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32856) }, Mov { destination: Relative(2), source: Direct(32839) }, Jump { location: 1059 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(5), location: 1401 }, Jump { location: 1062 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(5) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Store { destination_pointer: Relative(7), source: Direct(32839) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, Load { destination: Relative(8), source_pointer: Relative(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1289 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(8) }, Mov { destination: Relative(2), source: Direct(32839) }, Jump { location: 1293 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 1372 }, Jump { location: 1296 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1304 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1314 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 1928 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(13) }, JumpIf { condition: Relative(9), location: 1328 }, Call { location: 2020 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(7) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1785 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 1928 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(12) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(6), rhs: Direct(32838) }, JumpIf { condition: Relative(1), location: 1351 }, Call { location: 2023 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2026 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2236 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2565 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3376 }, Mov { destination: Direct(0), source: Relative(0) }, Return, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(9) }, Mov { destination: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(7) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(9) }, Mov { destination: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(8) }, Jump { location: 1293 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1413 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 1682 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(15) }, Mov { destination: Relative(12), source: Relative(16) }, JumpIf { condition: Relative(10), location: 1446 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 38 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, Mov { destination: Relative(13), source: Relative(9) }, IndirectConst { destination_pointer: Relative(13), bit_size: Integer(U64), value: 9862881900111276825 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 35 }, Mov { destination: Direct(32771), source: Relative(14) }, Mov { destination: Direct(32772), source: Relative(13) }, Mov { destination: Direct(32773), source: Relative(15) }, Call { location: 23 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 35 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(14) }, Store { destination_pointer: Relative(13), source: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(5) } }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(5) }, Jump { location: 1059 }, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(6) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(4) }, Jump { location: 958 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(13) }, Mov { destination: Relative(17), source: Relative(14) }, Mov { destination: Relative(18), source: Relative(4) }, Mov { destination: Relative(19), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(6) }, Jump { location: 470 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 1486 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1481 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1499 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 1506 }, Call { location: 5315 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 24 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 1510 }, Call { location: 5318 }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1516 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 5321 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(13) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 1532 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32850) }, JumpIf { condition: Relative(7), location: 1536 }, Jump { location: 1535 }, Return, Load { destination: Relative(7), source_pointer: Relative(6) }, JumpIf { condition: Relative(7), location: 1676 }, Jump { location: 1539 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1546 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 1556 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, JumpIf { condition: Relative(13), location: 1556 }, Call { location: 5315 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 1560 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(9), op: Div, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 1565 }, Call { location: 5357 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Direct(32850) }, JumpIf { condition: Relative(11), location: 1572 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(13) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(15) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(16) }, Mov { destination: Relative(18), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32838) }, Not { destination: Relative(19), source: Relative(9), bit_size: U1 }, BinaryIntOp { destination: Relative(9), op: Or, bit_size: U1, lhs: Relative(16), rhs: Relative(19) }, JumpIf { condition: Relative(9), location: 1612 }, Jump { location: 1607 }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(13), rhs: Relative(3) }, JumpIf { condition: Relative(9), location: 1610 }, Jump { location: 1622 }, Store { destination_pointer: Relative(18), source: Direct(32841) }, Jump { location: 1622 }, Store { destination_pointer: Relative(18), source: Direct(32841) }, Load { destination: Relative(9), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 1618 }, Call { location: 5357 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Jump { location: 1622 }, Load { destination: Relative(9), source_pointer: Relative(18) }, JumpIf { condition: Relative(9), location: 1625 }, Jump { location: 1676 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(7) }, Mov { destination: Relative(20), source: Relative(14) }, Mov { destination: Relative(21), source: Relative(17) }, Mov { destination: Relative(22), source: Relative(15) }, Mov { destination: Relative(23), source: Relative(3) }, Mov { destination: Relative(24), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 5363 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(17) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Store { destination_pointer: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Jump { location: 1676 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 1532 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 9417307514377997680 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1481 }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 1695 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 5321 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 1711 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32850) }, JumpIf { condition: Relative(8), location: 1717 }, Jump { location: 1714 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(6) }, Return, Load { destination: Relative(8), source_pointer: Relative(2) }, JumpIf { condition: Relative(8), location: 1779 }, Jump { location: 1720 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1726 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 1736 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 1736 }, Call { location: 5315 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 1740 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(8), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 1745 }, Call { location: 5357 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(12), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32850) }, JumpIf { condition: Relative(10), location: 1752 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(10), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 1772 }, Jump { location: 1779 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(8), location: 1775 }, Jump { location: 1779 }, Store { destination_pointer: Relative(5), source: Direct(32841) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Store { destination_pointer: Relative(2), source: Direct(32841) }, Jump { location: 1779 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 1711 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12632160011611521689 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1481 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 1794 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 5321 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 1810 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32850) }, JumpIf { condition: Relative(6), location: 1814 }, Jump { location: 1813 }, Return, Load { destination: Relative(6), source_pointer: Relative(5) }, JumpIf { condition: Relative(6), location: 1913 }, Jump { location: 1817 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1824 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 1834 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 1834 }, Call { location: 5315 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 1838 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(8), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 1843 }, Call { location: 5357 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(12), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32850) }, JumpIf { condition: Relative(10), location: 1850 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Not { destination: Relative(6), source: Relative(15), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U1, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 1870 }, Jump { location: 1913 }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 1873 }, Jump { location: 1913 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(14) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Store { destination_pointer: Relative(12), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Sub, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 1909 }, Call { location: 5399 }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, Jump { location: 1913 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 1810 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14479745468926698352 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 11665340019033496436 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17677620431177272765 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 1359149291226868540 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1481 }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1938 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 1946 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 1951 }, Jump { location: 1966 }, Store { destination_pointer: Relative(5), source: Direct(32841) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1958 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(2), source: Direct(32839) }, Jump { location: 1962 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32850) }, JumpIf { condition: Relative(6), location: 1968 }, Jump { location: 1965 }, Jump { location: 1966 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Not { destination: Relative(11), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 1990 }, Jump { location: 2017 }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1996 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 1682 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(13) }, Mov { destination: Relative(8), source: Relative(14) }, JumpIf { condition: Relative(6), location: 2012 }, Jump { location: 2010 }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Jump { location: 2017 }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(6), location: 2017 }, Jump { location: 2015 }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Jump { location: 2017 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(6) }, Jump { location: 1962 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16567169223151679177 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 6895136539169241630 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1481 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 2108 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Relative(4) }, Mov { destination: Relative(10), source: Direct(32847) }, Mov { destination: Relative(11), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Relative(4) }, Mov { destination: Relative(10), source: Direct(32844) }, Mov { destination: Relative(11), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Relative(4) }, Mov { destination: Relative(10), source: Direct(32851) }, Mov { destination: Relative(11), source: Direct(32847) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Direct(32839) }, Jump { location: 2139 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32850) }, JumpIf { condition: Relative(2), location: 2169 }, Jump { location: 2142 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 2150 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32843) }, JumpIf { condition: Relative(3), location: 2155 }, Call { location: 5402 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(1) }, Mov { destination: Relative(8), source: Direct(32843) }, Mov { destination: Relative(9), source: Direct(32844) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 1682 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(7) }, Mov { destination: Relative(3), source: Relative(8) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(2), rhs: Direct(32838) }, JumpIf { condition: Relative(1), location: 2168 }, Call { location: 5405 }, Return, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, Not { destination: Relative(2), source: Relative(11), bit_size: U1 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U1, lhs: Relative(2), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 2190 }, Jump { location: 2233 }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(8), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(2), rhs: Direct(32858) }, JumpIf { condition: Relative(9), location: 2233 }, Jump { location: 2194 }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(11), op: Sub, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 2200 }, Call { location: 5399 }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Store { destination_pointer: Relative(13), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Store { destination_pointer: Relative(6), source: Relative(8) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Store { destination_pointer: Relative(8), source: Relative(10) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Store { destination_pointer: Relative(8), source: Direct(32841) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Store { destination_pointer: Relative(4), source: Relative(11) }, Jump { location: 2233 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Mov { destination: Relative(1), source: Relative(2) }, Jump { location: 2139 }, Call { location: 1481 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32839) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32844) }, Mov { destination: Relative(8), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32847) }, Mov { destination: Relative(8), source: Direct(32849) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32851) }, Mov { destination: Relative(8), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 2347 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 5408 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(8) }, Mov { destination: Relative(5), source: Relative(9) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 5683 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(9) }, Load { destination: Relative(1), source_pointer: Relative(6) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 2372 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 2383 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Direct(32839) }, Mov { destination: Relative(12), source: Direct(32843) }, Mov { destination: Relative(13), source: Direct(32888) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 5743 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(1) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 2401 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6014 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 5683 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(13) }, Load { destination: Relative(1), source_pointer: Relative(10) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(1) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2426 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2437 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32839) }, Mov { destination: Relative(16), source: Direct(32843) }, Mov { destination: Relative(17), source: Direct(32889) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 5743 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 6293 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(15) }, Mov { destination: Relative(11), source: Relative(16) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 6613 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(14) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2472 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2483 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32839) }, Mov { destination: Relative(17), source: Direct(32843) }, Mov { destination: Relative(18), source: Direct(32890) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 6693 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(11) }, Store { destination_pointer: Relative(14), source: Direct(32844) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32847) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32851) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(6) }, Mov { destination: Relative(17), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 6975 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(16) }, JumpIf { condition: Relative(11), location: 2516 }, Call { location: 7007 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(6) }, Store { destination_pointer: Relative(11), source: Direct(32845) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32849) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32853) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(10) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 6975 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(15) }, JumpIf { condition: Relative(6), location: 2537 }, Call { location: 7010 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32845) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32847) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32849) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32851) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32853) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 7013 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(15) }, JumpIf { condition: Relative(6), location: 2564 }, Call { location: 7055 }, Return, Call { location: 1481 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32839) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(3) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Direct(32844) }, Mov { destination: Relative(9), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(3) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Direct(32847) }, Mov { destination: Relative(9), source: Direct(32849) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(3) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Direct(32851) }, Mov { destination: Relative(9), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 2676 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 6293 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(11) }, Mov { destination: Relative(8), source: Relative(12) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(6) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32839) }, Mov { destination: Relative(1), source: Direct(32839) }, Jump { location: 2767 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32850) }, JumpIf { condition: Relative(7), location: 3349 }, Jump { location: 2770 }, Load { destination: Relative(4), source_pointer: Relative(6) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(1), source: Direct(32839) }, Jump { location: 2776 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32850) }, JumpIf { condition: Relative(4), location: 3262 }, Jump { location: 2779 }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 2787 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 5408 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(11) }, Mov { destination: Relative(8), source: Relative(12) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 5683 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(12) }, Load { destination: Relative(6), source_pointer: Relative(9) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2812 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(9) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 2823 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(10) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Direct(32839) }, Mov { destination: Relative(15), source: Direct(32843) }, Mov { destination: Relative(16), source: Direct(32884) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 5743 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(9), source_pointer: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 2841 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 6014 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(15) }, Mov { destination: Relative(12), source: Relative(16) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(6) }, Mov { destination: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 5683 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(13), source: Relative(16) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2866 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(13) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 2877 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(14) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Direct(32839) }, Mov { destination: Relative(19), source: Direct(32843) }, Mov { destination: Relative(20), source: Direct(32886) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 5743 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(13), source_pointer: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(9) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 2895 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(6), bit_size: Field, value: 15 }, Const { destination: Relative(16), bit_size: Field, value: 33 }, Mov { destination: Relative(17), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Mov { destination: Relative(19), source: Relative(18) }, Store { destination_pointer: Relative(19), source: Direct(32848) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(6) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(16) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(9) }, Mov { destination: Relative(21), source: Relative(17) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(18) }, Call { location: 6975 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(16), source: Relative(20) }, Const { destination: Relative(17), bit_size: Integer(U8), value: 71 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(20), source: Relative(19) }, Store { destination_pointer: Relative(20), source: Relative(17) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32876) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32879) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32854) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32871) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32875) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32865) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32876) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32877) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32877) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32867) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32865) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32879) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32854) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32871) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32879) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32867) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32877) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32863) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32879) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32871) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32876) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32875) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32854) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32876) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32868) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32854) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32872) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32867) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32882) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32878) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32859) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32854) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32883) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32872) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32867) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32882) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32878) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32885) }, JumpIf { condition: Relative(16), location: 3029 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 44 }, Mov { destination: Relative(19), source: Direct(1) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 44 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(20) }, Mov { destination: Relative(20), source: Relative(19) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U64), value: 2386996775688025706 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 39 }, Mov { destination: Direct(32771), source: Relative(21) }, Mov { destination: Direct(32772), source: Relative(20) }, Mov { destination: Direct(32773), source: Relative(22) }, Call { location: 23 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 39 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(21) }, Store { destination_pointer: Relative(20), source: Direct(32842) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(21) }, Mov { destination: Direct(32772), source: Relative(20) }, Mov { destination: Direct(32773), source: Relative(22) }, Call { location: 23 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(21) }, Trap { revert_data: HeapVector { pointer: Relative(19), size: Relative(17) } }, Const { destination: Relative(9), bit_size: Field, value: 35 }, Const { destination: Relative(16), bit_size: Field, value: 65 }, Mov { destination: Relative(17), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Mov { destination: Relative(19), source: Relative(18) }, Store { destination_pointer: Relative(19), source: Relative(6) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(9) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(16) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(13) }, Mov { destination: Relative(20), source: Relative(17) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 6975 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(19) }, JumpIf { condition: Relative(6), location: 3052 }, Call { location: 7010 }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 3058 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(4) }, Mov { destination: Relative(19), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 6293 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(18) }, Mov { destination: Relative(13), source: Relative(19) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(6) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32839) }, Mov { destination: Relative(1), source: Direct(32839) }, Jump { location: 3149 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32850) }, JumpIf { condition: Relative(7), location: 3234 }, Jump { location: 3152 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(1) }, Mov { destination: Relative(8), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 6293 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(7) }, Mov { destination: Relative(3), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6613 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 3179 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 3190 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Direct(32839) }, Mov { destination: Relative(9), source: Direct(32843) }, Mov { destination: Relative(10), source: Direct(32887) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 6693 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(2), bit_size: Field, value: 30 }, Const { destination: Relative(4), bit_size: Field, value: 70 }, Const { destination: Relative(6), bit_size: Field, value: 66 }, Const { destination: Relative(7), bit_size: Field, value: 130 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Direct(32852) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 7013 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(10) }, JumpIf { condition: Relative(2), location: 3233 }, Call { location: 7055 }, Return, Load { destination: Relative(7), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 3238 }, Jump { location: 3259 }, Load { destination: Relative(7), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(9), rhs: Direct(32844) }, BinaryFieldOp { destination: Relative(9), op: Mul, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(6) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 3259 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Mov { destination: Relative(1), source: Relative(7) }, Jump { location: 3149 }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(8) }, Mov { destination: Relative(12), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(10) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(11) }, Not { destination: Relative(14), source: Relative(11), bit_size: U1 }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U1, lhs: Relative(14), rhs: Relative(6) }, JumpIf { condition: Relative(11), location: 3295 }, Jump { location: 3346 }, BinaryFieldOp { destination: Relative(6), op: Mul, lhs: Relative(10), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(12) }, Mov { destination: Relative(18), source: Relative(13) }, Mov { destination: Relative(19), source: Relative(8) }, Mov { destination: Relative(20), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 5363 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(12) }, Load { destination: Relative(9), source_pointer: Relative(13) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Load { destination: Relative(11), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(5) }, Store { destination_pointer: Relative(14), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Store { destination_pointer: Relative(10), source: Relative(8) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 33 }, Call { location: 5377 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Jump { location: 3346 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 2776 }, Load { destination: Relative(7), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 3353 }, Jump { location: 3373 }, Load { destination: Relative(7), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(9), rhs: Direct(32845) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(6) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 1490 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 3373 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Mov { destination: Relative(1), source: Relative(7) }, Jump { location: 2767 }, Call { location: 1481 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32839) }, Const { destination: Relative(3), bit_size: Field, value: 42 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(1) }, Mov { destination: Relative(8), source: Direct(32852) }, Mov { destination: Relative(9), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 7058 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 3446 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(6), location: 3452 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 3458 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(32842) }, Mov { destination: Relative(13), source: Direct(32852) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7246 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(11) }, Mov { destination: Relative(8), source: Relative(12) }, JumpIf { condition: Relative(5), location: 3472 }, Jump { location: 3480 }, JumpIf { condition: Relative(5), location: 3475 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(8), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 3479 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Jump { location: 3480 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32852) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 7345 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 3496 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(5) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(3), location: 3502 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Const { destination: Relative(3), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Direct(32852) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 7345 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 3518 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, JumpIf { condition: Relative(5), location: 3524 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Load { destination: Relative(4), source_pointer: Relative(3) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 3530 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(3), bit_size: Field, value: 1 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(2) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Direct(32844) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 7058 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3550 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U1, lhs: Relative(4), rhs: Direct(32838) }, JumpIf { condition: Relative(8), location: 3557 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 7345 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3573 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, JumpIf { condition: Relative(9), location: 3579 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3585 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Direct(32844) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 7058 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Field, value: 4 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32845) }, Mov { destination: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 7058 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32847) }, Mov { destination: Relative(16), source: Direct(32848) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 7058 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 3623 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(12) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, JumpIf { condition: Relative(4), location: 3629 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(1) }, Mov { destination: Relative(17), source: Direct(32845) }, Mov { destination: Relative(18), source: Direct(32849) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 7058 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 3646 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(12) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, JumpIf { condition: Relative(4), location: 3652 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 7345 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 3668 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Direct(32843) }, JumpIf { condition: Relative(12), location: 3674 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 3680 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(8) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32840) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Store { destination_pointer: Relative(1), source: Direct(32839) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(8) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 3735 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(4) }, Mov { destination: Relative(21), source: Direct(32839) }, Mov { destination: Relative(22), source: Direct(32849) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(18) }, Call { location: 7246 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(20) }, Mov { destination: Relative(17), source: Relative(21) }, Const { destination: Relative(18), bit_size: Integer(U8), value: 34 }, JumpIf { condition: Relative(8), location: 3863 }, Jump { location: 3750 }, Const { destination: Relative(5), bit_size: Integer(U8), value: 55 }, Const { destination: Relative(6), bit_size: Integer(U8), value: 33 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Direct(32861) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32876) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32854) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32881) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32863) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32873) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32880) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32867) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32854) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32868) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32876) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32877) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32854) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32872) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32867) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32882) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32854) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(5) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 57 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Direct(32883) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(18) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32872) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32871) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32875) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32866) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(18) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32859) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(18) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32879) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32877) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32871) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32875) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32869) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(18) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32855) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(18) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32873) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32867) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32875) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32869) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32879) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32870) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(18) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32859) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32857) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(5) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32885) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(5), size: 19 }), HeapArray(HeapArray { pointer: Relative(8), size: 29 }), MemoryAddress(Direct(32838))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 19 }, Array { value_types: [Simple(Integer(U8))], size: 29 }, Simple(Integer(U1))] }, Jump { location: 3885 }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 3869 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(4) }, Mov { destination: Relative(21), source: Direct(32839) }, Mov { destination: Relative(22), source: Direct(32849) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 7246 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(20) }, Mov { destination: Relative(7), source: Relative(21) }, JumpIf { condition: Relative(5), location: 3884 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Jump { location: 3885 }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 3891 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(4) }, Mov { destination: Relative(21), source: Direct(32839) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7475 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(20) }, Mov { destination: Relative(8), source: Relative(21) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3908 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U8), value: 45 }, Const { destination: Relative(11), bit_size: Integer(U8), value: 62 }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Direct(32883) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32872) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32867) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32882) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32854) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32854) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32883) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32863) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32873) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32880) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32867) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(11) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32872) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32871) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32866) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32868) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32871) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32873) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32866) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32885) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 3992 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 3996 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32846) }, JumpIf { condition: Relative(7), location: 5278 }, Jump { location: 3999 }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4005 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(8) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 4034 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 4038 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32846) }, JumpIf { condition: Relative(7), location: 5250 }, Jump { location: 4041 }, Load { destination: Relative(7), source_pointer: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 4049 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 80 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(11) }, Store { destination_pointer: Relative(13), source: Direct(32860) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32874) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32876) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32880) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32879) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32876) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32868) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32881) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32863) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32873) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32871) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32866) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32873) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32874) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32879) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32870) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32876) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32880) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32873) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32866) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32870) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32863) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32881) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32864) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32873) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32868) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32862) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32873) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32885) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32879) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32871) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32874) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32855) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32864) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32880) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32879) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32869) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32876) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32879) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32854) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32872) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32862) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32873) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32885) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, Load { destination: Relative(11), source_pointer: Relative(7) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 4220 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, JumpIf { condition: Relative(11), location: 4246 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 83 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, Mov { destination: Relative(16), source: Relative(15) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U64), value: 6693878053340631133 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 79 }, Mov { destination: Direct(32771), source: Relative(17) }, Mov { destination: Direct(32772), source: Relative(16) }, Mov { destination: Direct(32773), source: Relative(18) }, Call { location: 23 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 79 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(17) }, Store { destination_pointer: Relative(16), source: Direct(32843) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32839) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(15), size: Relative(14) } }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 4252 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(12) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 4260 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(9) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4268 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 4272 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32846) }, JumpIf { condition: Relative(6), location: 5247 }, Jump { location: 4275 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 4302 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 4306 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32846) }, JumpIf { condition: Relative(8), location: 5219 }, Jump { location: 4309 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32860) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32874) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32876) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32879) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32854) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32876) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32868) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32854) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32881) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32863) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32873) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32871) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32866) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32854) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32867) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32873) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32867) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32874) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32867) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32879) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32854) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32870) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32876) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32873) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32866) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32854) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32870) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32863) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32881) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32867) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32854) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32864) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32867) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32867) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32854) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32883) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32867) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32873) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32868) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32862) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32873) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32867) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32885) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32854) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32879) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32871) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32874) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32867) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32855) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32854) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32864) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32879) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32854) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32869) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32876) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32879) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32854) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32883) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32881) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32863) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32873) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32867) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32862) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32873) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32867) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32885) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32839) }, JumpIf { condition: Relative(7), location: 4501 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 85 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 85 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, Mov { destination: Relative(11), source: Relative(10) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U64), value: 9965974553718638037 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 81 }, Mov { destination: Direct(32771), source: Relative(12) }, Mov { destination: Direct(32772), source: Relative(11) }, Mov { destination: Direct(32773), source: Relative(13) }, Call { location: 23 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 81 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Store { destination_pointer: Relative(11), source: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32839) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(10), size: Relative(8) } }, Load { destination: Relative(5), source_pointer: Relative(9) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 4507 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 4511 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32846) }, JumpIf { condition: Relative(5), location: 5216 }, Jump { location: 4514 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4522 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4536 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 7475 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(15) }, Mov { destination: Relative(12), source: Relative(16) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 4603 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32846) }, JumpIf { condition: Relative(8), location: 5188 }, Jump { location: 4606 }, Load { destination: Relative(5), source_pointer: Relative(10) }, Load { destination: Relative(6), source_pointer: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 4616 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 7475 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 21 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(8) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32840) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32840) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32840) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32840) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32840) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32840) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32840) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32840) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32840) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32840) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 4683 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32846) }, JumpIf { condition: Relative(10), location: 5161 }, Jump { location: 4686 }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(5), bit_size: Field, value: 10944121435919637611123202872628637544274182200208017171849102093287904247809 }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 4693 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32846) }, JumpIf { condition: Relative(6), location: 5074 }, Jump { location: 4696 }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 4698 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32846) }, JumpIf { condition: Relative(5), location: 5004 }, Jump { location: 4701 }, Const { destination: Relative(1), bit_size: Integer(U64), value: 0 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32839) }, Const { destination: Relative(7), bit_size: Integer(U64), value: 2 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 7783 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(8), bit_size: Integer(U64), value: 4 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Direct(32845) }, Mov { destination: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7783 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(6) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Direct(32845) }, Mov { destination: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7783 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(6) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 7783 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4839 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4847 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 4852 }, Jump { location: 4867 }, Store { destination_pointer: Relative(5), source: Direct(32841) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4859 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 4863 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, JumpIf { condition: Relative(7), location: 4872 }, Jump { location: 4866 }, Jump { location: 4867 }, Load { destination: Relative(1), source_pointer: Relative(5) }, JumpIf { condition: Relative(1), location: 4871 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(13) }, Load { destination: Relative(9), source_pointer: Relative(5) }, Not { destination: Relative(12), source: Relative(7), bit_size: U1 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(12), rhs: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 4894 }, Jump { location: 4944 }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4900 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, Mov { destination: Relative(12), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(1) }, Load { destination: Relative(13), source_pointer: Relative(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 4914 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(13) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 7941 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(13), source: Relative(17) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(32839) }, Jump { location: 4930 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, JumpIf { condition: Relative(9), location: 4947 }, Jump { location: 4933 }, Load { destination: Relative(7), source_pointer: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(12) }, JumpIf { condition: Relative(7), location: 4939 }, Jump { location: 4937 }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Jump { location: 4944 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U64, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(7), location: 4944 }, Jump { location: 4942 }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Jump { location: 4944 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 4863 }, Load { destination: Relative(9), source_pointer: Relative(15) }, JumpIf { condition: Relative(9), location: 5001 }, Jump { location: 4950 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(7) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, JumpIf { condition: Relative(14), location: 4958 }, BinaryIntOp { destination: Relative(18), op: Div, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(7) }, JumpIf { condition: Relative(17), location: 4958 }, Call { location: 5315 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, JumpIf { condition: Relative(16), location: 4962 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(9), op: Div, bit_size: U32, lhs: Relative(14), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(14) }, JumpIf { condition: Relative(16), location: 4967 }, Call { location: 5357 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(17), op: Div, bit_size: U32, lhs: Relative(14), rhs: Relative(16) }, BinaryIntOp { destination: Relative(18), op: Mul, bit_size: U32, lhs: Relative(17), rhs: Relative(16) }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(14), rhs: Relative(18) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, JumpIf { condition: Relative(14), location: 4974 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(14), source_pointer: Relative(20) }, Not { destination: Relative(16), source: Relative(14), bit_size: U1 }, BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U1, lhs: Relative(16), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 4994 }, Jump { location: 5001 }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(17), rhs: Relative(10) }, JumpIf { condition: Relative(9), location: 4997 }, Jump { location: 5001 }, Store { destination_pointer: Relative(8), source: Direct(32841) }, Store { destination_pointer: Relative(12), source: Relative(18) }, Store { destination_pointer: Relative(15), source: Direct(32841) }, Jump { location: 5001 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Relative(7), source: Relative(9) }, Jump { location: 4930 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, Not { destination: Relative(5), source: Relative(12), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 5025 }, Jump { location: 5071 }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(9), rhs: Direct(32840) }, Not { destination: Relative(10), source: Relative(5), bit_size: U1 }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(11), rhs: Direct(32840) }, Not { destination: Relative(12), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(5), location: 5071 }, Jump { location: 5032 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(12), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 5038 }, Call { location: 5399 }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(6) }, Store { destination_pointer: Relative(14), source: Relative(7) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Store { destination_pointer: Relative(7), source: Relative(9) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Store { destination_pointer: Relative(9), source: Relative(11) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Store { destination_pointer: Relative(9), source: Direct(32841) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Jump { location: 5071 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4698 }, Load { destination: Relative(6), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(12) }, Mov { destination: Relative(16), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(15) }, Not { destination: Relative(18), source: Relative(15), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(18), rhs: Relative(10) }, JumpIf { condition: Relative(15), location: 5107 }, Jump { location: 5158 }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(14), rhs: Relative(5) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(6) }, Mov { destination: Relative(20), source: Relative(13) }, Mov { destination: Relative(21), source: Relative(16) }, Mov { destination: Relative(22), source: Relative(17) }, Mov { destination: Relative(23), source: Relative(12) }, Mov { destination: Relative(24), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 5363 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Load { destination: Relative(12), source_pointer: Relative(16) }, Load { destination: Relative(13), source_pointer: Relative(17) }, Load { destination: Relative(14), source_pointer: Relative(7) }, Load { destination: Relative(15), source_pointer: Relative(9) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(8) }, Store { destination_pointer: Relative(18), source: Relative(10) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(14), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Store { destination_pointer: Relative(14), source: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(9), source: Relative(15) }, Jump { location: 5158 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 4693 }, Load { destination: Relative(10), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 5165 }, Jump { location: 5185 }, Load { destination: Relative(10), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Load { destination: Relative(11), source_pointer: Relative(15) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(12), rhs: Direct(32844) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(8) }, Mov { destination: Relative(15), source: Relative(6) }, Mov { destination: Relative(16), source: Relative(10) }, Mov { destination: Relative(17), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 7058 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 5185 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(10) }, Jump { location: 4683 }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(11), location: 5192 }, Jump { location: 5213 }, Load { destination: Relative(8), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Load { destination: Relative(11), source_pointer: Relative(15) }, BinaryFieldOp { destination: Relative(8), op: Add, lhs: Relative(12), rhs: Relative(3) }, BinaryFieldOp { destination: Relative(12), op: Mul, lhs: Relative(11), rhs: Direct(32844) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(10) }, Mov { destination: Relative(15), source: Relative(6) }, Mov { destination: Relative(16), source: Relative(8) }, Mov { destination: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 7058 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 5213 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 4603 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4511 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Not { destination: Relative(11), source: Relative(8), bit_size: U1 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(8), location: 5235 }, Jump { location: 5244 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(6) }, Mov { destination: Relative(16), source: Relative(12) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 7977 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 5244 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(8) }, Jump { location: 4306 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 4272 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(7), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(7), bit_size: U1 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(10) }, JumpIf { condition: Relative(7), location: 5266 }, Jump { location: 5275 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(6) }, Mov { destination: Relative(17), source: Relative(13) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 7977 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 5275 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 4038 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, JumpIf { condition: Relative(7), location: 5281 }, Jump { location: 5312 }, JumpIf { condition: Relative(7), location: 5283 }, Call { location: 7997 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(7), source_pointer: Relative(14) }, Load { destination: Relative(11), source_pointer: Relative(12) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 5297 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(11) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 5305 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(11), size: 16 }), MemoryAddress(Direct(32843)), MemoryAddress(Relative(10)), MemoryAddress(Relative(7)), HeapArray(HeapArray { pointer: Relative(15), size: 16 }), HeapArray(HeapArray { pointer: Relative(16), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, Jump { location: 5312 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 3996 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 7233212735005103307 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16850003084350092401 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1481 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 5342 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Direct(32842) }, Mov { destination: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 8000 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(8) }, Cast { destination: Relative(6), source: Relative(3), bit_size: Integer(U32) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Field }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(3) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1481 }, Load { destination: Relative(7), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Direct(32841) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 5381 }, Jump { location: 5383 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 5398 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 5395 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 5388 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 5398 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 955212737754845985 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 15583592523844085222 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1481 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 5442 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 5446 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32850) }, JumpIf { condition: Relative(6), location: 5655 }, Jump { location: 5449 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 5457 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 80 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32868) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32863) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32863) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32864) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32868) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32862) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32855) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32864) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32869) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32862) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 5628 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 5654 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 83 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 6693878053340631133 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 79 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 79 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Not { destination: Relative(8), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 5671 }, Jump { location: 5680 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 8149 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 5680 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 5446 }, Call { location: 1481 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Direct(32843), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 5704 }, Call { location: 7997 }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 5706 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(2), location: 5711 }, Jump { location: 5709 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Return, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(2) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5717 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(2), source_pointer: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, JumpIf { condition: Relative(9), location: 5727 }, Call { location: 8169 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 5377 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(2) }, JumpIf { condition: Relative(7), location: 5738 }, Call { location: 5357 }, Store { destination_pointer: Relative(5), source: Relative(9) }, Store { destination_pointer: Relative(4), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(2) }, Jump { location: 5706 }, Call { location: 1481 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Const { destination: Relative(6), bit_size: Field, value: 31 }, Const { destination: Relative(7), bit_size: Field, value: 174 }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 5770 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(8), location: 5773 }, Jump { location: 6013 }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(9) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 5781 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, JumpIf { condition: Relative(9), location: 6012 }, Jump { location: 5786 }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(9) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 5794 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 8172 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(15), source: Direct(32774) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Load { destination: Relative(8), source_pointer: Relative(12) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 5811 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Store { destination_pointer: Relative(3), source: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 5819 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(10), location: 6010 }, Jump { location: 5823 }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(13) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Direct(32837) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Relative(6) }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(4), rhs: Direct(32884) }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(4), rhs: Direct(32886) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(4), rhs: Direct(32888) }, BinaryFieldOp { destination: Relative(18), op: Equals, lhs: Relative(4), rhs: Direct(32889) }, Mov { destination: Relative(9), source: Relative(13) }, Jump { location: 5834 }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(14) }, JumpIf { condition: Relative(19), location: 5919 }, Jump { location: 5837 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(12), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, JumpIf { condition: Relative(10), location: 5842 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Load { destination: Relative(10), source_pointer: Relative(16) }, JumpIf { condition: Relative(11), location: 5847 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, Load { destination: Relative(11), source_pointer: Relative(16) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 5377 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, Store { destination_pointer: Relative(17), source: Relative(11) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 5377 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Store { destination_pointer: Relative(16), source: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Load { destination: Relative(11), source_pointer: Relative(10) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 5873 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, JumpIf { condition: Relative(16), location: 5879 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 8209 }, Mov { destination: Relative(17), source: Direct(32773) }, Mov { destination: Relative(18), source: Direct(32774) }, Store { destination_pointer: Relative(18), source: Relative(11) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(14) }, Store { destination_pointer: Relative(2), source: Relative(16) }, Store { destination_pointer: Relative(3), source: Relative(17) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Direct(32839), rhs: Relative(12) }, JumpIf { condition: Relative(9), location: 5893 }, Jump { location: 5917 }, Load { destination: Relative(9), source_pointer: Relative(17) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 5899 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(12) }, JumpIf { condition: Relative(11), location: 5905 }, Call { location: 5399 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 8209 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(14), source: Direct(32774) }, Store { destination_pointer: Relative(14), source: Relative(13) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(12) }, Jump { location: 5917 }, Mov { destination: Relative(5), source: Relative(8) }, Jump { location: 5770 }, Load { destination: Relative(20), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Direct(32837) }, JumpIf { condition: Relative(21), location: 5923 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(9) }, Load { destination: Relative(21), source_pointer: Relative(23) }, JumpIf { condition: Relative(11), location: 5928 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(14) }, Load { destination: Relative(22), source_pointer: Relative(24) }, JumpIf { condition: Relative(12), location: 5966 }, Jump { location: 5933 }, BinaryFieldOp { destination: Relative(23), op: LessThan, lhs: Relative(21), rhs: Relative(22) }, JumpIf { condition: Relative(15), location: 5962 }, Jump { location: 5936 }, JumpIf { condition: Relative(16), location: 5958 }, Jump { location: 5938 }, JumpIf { condition: Relative(17), location: 5954 }, Jump { location: 5940 }, JumpIf { condition: Relative(18), location: 5950 }, Jump { location: 5942 }, BinaryFieldOp { destination: Relative(23), op: Equals, lhs: Relative(4), rhs: Relative(7) }, JumpIf { condition: Relative(23), location: 5946 }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(27) } }, BinaryFieldOp { destination: Relative(23), op: Mul, lhs: Relative(21), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(23), rhs: Direct(32858) }, Mov { destination: Relative(26), source: Relative(21) }, Jump { location: 5952 }, Mov { destination: Relative(26), source: Relative(23) }, Jump { location: 5952 }, Mov { destination: Relative(25), source: Relative(26) }, Jump { location: 5956 }, Mov { destination: Relative(25), source: Relative(23) }, Jump { location: 5956 }, Mov { destination: Relative(24), source: Relative(25) }, Jump { location: 5960 }, Mov { destination: Relative(24), source: Relative(23) }, Jump { location: 5960 }, Mov { destination: Relative(20), source: Relative(24) }, Jump { location: 5964 }, Mov { destination: Relative(20), source: Relative(23) }, Jump { location: 5964 }, Mov { destination: Relative(19), source: Relative(20) }, Jump { location: 5973 }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(21), rhs: Direct(32840) }, Not { destination: Relative(21), source: Relative(20), bit_size: U1 }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(22), rhs: Direct(32840) }, Not { destination: Relative(22), source: Relative(20), bit_size: U1 }, BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U1, lhs: Relative(21), rhs: Relative(22) }, Mov { destination: Relative(19), source: Relative(20) }, Jump { location: 5973 }, JumpIf { condition: Relative(19), location: 5975 }, Jump { location: 6007 }, Load { destination: Relative(19), source_pointer: Relative(1) }, Load { destination: Relative(20), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(21), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, JumpIf { condition: Relative(21), location: 5980 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(20) }, Load { destination: Relative(21), source_pointer: Relative(23) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(9) }, Load { destination: Relative(22), source_pointer: Relative(24) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 5377 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(20) }, Store { destination_pointer: Relative(25), source: Relative(22) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 5377 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(9) }, Store { destination_pointer: Relative(24), source: Relative(21) }, Store { destination_pointer: Relative(1), source: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(21), op: LessThanEquals, bit_size: U32, lhs: Relative(20), rhs: Relative(19) }, JumpIf { condition: Relative(21), location: 6005 }, Call { location: 5357 }, Store { destination_pointer: Relative(10), source: Relative(19) }, Jump { location: 6007 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Mov { destination: Relative(9), source: Relative(19) }, Jump { location: 5834 }, Mov { destination: Relative(5), source: Relative(8) }, Jump { location: 5770 }, Jump { location: 6013 }, Return, Call { location: 1481 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 6048 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 6052 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32850) }, JumpIf { condition: Relative(6), location: 6265 }, Jump { location: 6055 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 6063 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32868) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32863) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32863) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32864) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32868) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32862) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32855) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32864) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32869) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32863) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32862) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 6238 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 6264 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 85 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 85 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9965974553718638037 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 81 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 81 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Not { destination: Relative(8), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 6281 }, Jump { location: 6290 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 8149 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 6290 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 6052 }, Call { location: 1481 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 6343 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 6347 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32850) }, JumpIf { condition: Relative(6), location: 6562 }, Jump { location: 6350 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 6358 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32868) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32863) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32863) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32864) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32868) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32862) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32855) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32864) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32869) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32862) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 6535 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 6561 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, Not { destination: Relative(8), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 6582 }, Jump { location: 6610 }, Load { destination: Relative(6), source_pointer: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32850) }, JumpIf { condition: Relative(8), location: 6587 }, Call { location: 8169 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 5377 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 5377 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, Store { destination_pointer: Relative(12), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 6607 }, Call { location: 5357 }, Store { destination_pointer: Relative(5), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Jump { location: 6610 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 6347 }, Call { location: 1481 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Direct(32843), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 6640 }, Call { location: 7997 }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 6642 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(2), location: 6647 }, Jump { location: 6645 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Return, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(2) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 6653 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Load { destination: Relative(2), source_pointer: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Direct(32837) }, JumpIf { condition: Relative(10), location: 6668 }, Call { location: 8169 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 5377 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Store { destination_pointer: Relative(13), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 5377 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Store { destination_pointer: Relative(12), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(2) }, JumpIf { condition: Relative(7), location: 6688 }, Call { location: 5357 }, Store { destination_pointer: Relative(5), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(2) }, Jump { location: 6642 }, Call { location: 1481 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 6718 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 6721 }, Jump { location: 6974 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6729 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32839) }, JumpIf { condition: Relative(7), location: 6973 }, Jump { location: 6734 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6742 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 8172 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6759 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 6767 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(8), location: 6971 }, Jump { location: 6771 }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(11) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(12), rhs: Direct(32843) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Direct(32887) }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 6779 }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 6887 }, Jump { location: 6782 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(13), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32837) }, JumpIf { condition: Relative(8), location: 6787 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(13), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(8) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, JumpIf { condition: Relative(9), location: 6797 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Load { destination: Relative(9), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 5377 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(8) }, Store { destination_pointer: Relative(21), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 5377 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(15) }, Store { destination_pointer: Relative(9), source: Relative(18) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 5377 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 5377 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, Store { destination_pointer: Relative(10), source: Relative(16) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 6841 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 6847 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 8209 }, Mov { destination: Relative(15), source: Direct(32773) }, Mov { destination: Relative(16), source: Direct(32774) }, Store { destination_pointer: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Direct(32839), rhs: Relative(13) }, JumpIf { condition: Relative(7), location: 6861 }, Jump { location: 6885 }, Load { destination: Relative(7), source_pointer: Relative(15) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6867 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(13) }, JumpIf { condition: Relative(9), location: 6873 }, Call { location: 5399 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 8209 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(12), source: Direct(32774) }, Store { destination_pointer: Relative(12), source: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Jump { location: 6885 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 6718 }, Load { destination: Relative(15), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, JumpIf { condition: Relative(16), location: 6891 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(16), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, JumpIf { condition: Relative(9), location: 6897 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(10) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryFieldOp { destination: Relative(15), op: LessThan, lhs: Relative(17), rhs: Relative(18) }, JumpIf { condition: Relative(13), location: 6909 }, Jump { location: 6903 }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(4), rhs: Direct(32890) }, JumpIf { condition: Relative(17), location: 6907 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 6911 }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 6911 }, JumpIf { condition: Relative(14), location: 6913 }, Jump { location: 6968 }, Load { destination: Relative(14), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(17), op: LessThan, bit_size: U32, lhs: Relative(15), rhs: Direct(32837) }, JumpIf { condition: Relative(17), location: 6918 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(15), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(19) }, Load { destination: Relative(20), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(16) }, Load { destination: Relative(21), source_pointer: Relative(23) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(22) }, Load { destination: Relative(23), source_pointer: Relative(25) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 5377 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(17) }, Store { destination_pointer: Relative(26), source: Relative(21) }, Mov { destination: Direct(32771), source: Relative(24) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 5377 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(23) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 5377 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Store { destination_pointer: Relative(21), source: Relative(18) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 5377 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(22) }, Store { destination_pointer: Relative(18), source: Relative(20) }, Store { destination_pointer: Relative(1), source: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, JumpIf { condition: Relative(16), location: 6966 }, Call { location: 5357 }, Store { destination_pointer: Relative(8), source: Relative(14) }, Jump { location: 6968 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Relative(7), source: Relative(14) }, Jump { location: 6779 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 6718 }, Jump { location: 6974 }, Return, Call { location: 1481 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 6985 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 6989 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 6994 }, Jump { location: 6992 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 6989 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16291778408346427203 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 3078107792722303059 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1481 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 7023 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 7027 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 7032 }, Jump { location: 7030 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(7), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(9), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 7027 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 10951819287827820458 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1481 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7067 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 7074 }, Call { location: 5315 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 15 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 7078 }, Call { location: 5318 }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 7084 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 8265 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(13) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 7100 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32846) }, JumpIf { condition: Relative(7), location: 7104 }, Jump { location: 7103 }, Return, Load { destination: Relative(7), source_pointer: Relative(6) }, JumpIf { condition: Relative(7), location: 7243 }, Jump { location: 7107 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 7114 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 7124 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, JumpIf { condition: Relative(13), location: 7124 }, Call { location: 5315 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 7128 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(9), op: Div, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 7133 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(12), op: Div, bit_size: U32, lhs: Relative(11), rhs: Direct(32846) }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(12), rhs: Direct(32846) }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(13) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Direct(32846) }, JumpIf { condition: Relative(11), location: 7139 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(13) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(15) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(16) }, Mov { destination: Relative(18), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32838) }, Not { destination: Relative(19), source: Relative(9), bit_size: U1 }, BinaryIntOp { destination: Relative(9), op: Or, bit_size: U1, lhs: Relative(16), rhs: Relative(19) }, JumpIf { condition: Relative(9), location: 7179 }, Jump { location: 7174 }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(13), rhs: Relative(3) }, JumpIf { condition: Relative(9), location: 7177 }, Jump { location: 7189 }, Store { destination_pointer: Relative(18), source: Direct(32841) }, Jump { location: 7189 }, Store { destination_pointer: Relative(18), source: Direct(32841) }, Load { destination: Relative(9), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 7185 }, Call { location: 5357 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Jump { location: 7189 }, Load { destination: Relative(9), source_pointer: Relative(18) }, JumpIf { condition: Relative(9), location: 7192 }, Jump { location: 7243 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(7) }, Mov { destination: Relative(20), source: Relative(14) }, Mov { destination: Relative(21), source: Relative(17) }, Mov { destination: Relative(22), source: Relative(15) }, Mov { destination: Relative(23), source: Relative(3) }, Mov { destination: Relative(24), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 5363 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(17) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Store { destination_pointer: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Jump { location: 7243 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 7100 }, Call { location: 1481 }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7259 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 8265 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 7275 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32846) }, JumpIf { condition: Relative(8), location: 7281 }, Jump { location: 7278 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(6) }, Return, Load { destination: Relative(8), source_pointer: Relative(2) }, JumpIf { condition: Relative(8), location: 7342 }, Jump { location: 7284 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7290 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 7300 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 7300 }, Call { location: 5315 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 7304 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(8), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 7309 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32846) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32846) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32846) }, JumpIf { condition: Relative(10), location: 7315 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(10), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 7335 }, Jump { location: 7342 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(8), location: 7338 }, Jump { location: 7342 }, Store { destination_pointer: Relative(5), source: Direct(32841) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Store { destination_pointer: Relative(2), source: Direct(32841) }, Jump { location: 7342 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 7275 }, Call { location: 1481 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7354 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 8265 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Jump { location: 7370 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32846) }, JumpIf { condition: Relative(6), location: 7374 }, Jump { location: 7373 }, Return, Load { destination: Relative(6), source_pointer: Relative(5) }, JumpIf { condition: Relative(6), location: 7472 }, Jump { location: 7377 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7384 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 7394 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 7394 }, Call { location: 5315 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 7398 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(8), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 7403 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32846) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32846) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32846) }, JumpIf { condition: Relative(10), location: 7409 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Not { destination: Relative(6), source: Relative(15), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U1, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 7429 }, Jump { location: 7472 }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 7432 }, Jump { location: 7472 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(10) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(14) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 21 }, Call { location: 5377 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Store { destination_pointer: Relative(12), source: Direct(32841) }, BinaryIntOp { destination: Relative(6), op: Sub, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 7468 }, Call { location: 5399 }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(5), source: Direct(32841) }, Jump { location: 7472 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 7370 }, Call { location: 1481 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32839) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7513 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 7517 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32846) }, JumpIf { condition: Relative(6), location: 7732 }, Jump { location: 7520 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 7528 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32868) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32863) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32863) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32864) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32868) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32862) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32855) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32864) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32869) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32862) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32867) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7705 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 7731 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32843) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Return, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, Not { destination: Relative(8), source: Relative(6), bit_size: U1 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(6), location: 7752 }, Jump { location: 7780 }, Load { destination: Relative(6), source_pointer: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32846) }, JumpIf { condition: Relative(8), location: 7757 }, Call { location: 8169 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32843) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 11 }, Call { location: 5377 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 11 }, Call { location: 5377 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, Store { destination_pointer: Relative(12), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 7777 }, Call { location: 5357 }, Store { destination_pointer: Relative(5), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Jump { location: 7780 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 7517 }, Call { location: 1481 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7792 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 7799 }, Call { location: 5315 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 7803 }, Call { location: 5318 }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 7809 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 7941 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(13) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 7825 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(7), location: 7829 }, Jump { location: 7828 }, Return, Load { destination: Relative(7), source_pointer: Relative(6) }, JumpIf { condition: Relative(7), location: 7938 }, Jump { location: 7832 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 7839 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 7849 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, JumpIf { condition: Relative(13), location: 7849 }, Call { location: 5315 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 7853 }, Call { location: 5357 }, BinaryIntOp { destination: Relative(9), op: Div, bit_size: U32, lhs: Relative(11), rhs: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 7858 }, Call { location: 5357 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, JumpIf { condition: Relative(11), location: 7865 }, Call { location: 5360 }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Not { destination: Relative(14), source: Relative(9), bit_size: U1 }, BinaryIntOp { destination: Relative(9), op: Or, bit_size: U1, lhs: Relative(15), rhs: Relative(14) }, JumpIf { condition: Relative(9), location: 7889 }, Jump { location: 7884 }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(13), rhs: Relative(3) }, JumpIf { condition: Relative(9), location: 7887 }, Jump { location: 7899 }, Store { destination_pointer: Relative(7), source: Direct(32841) }, Jump { location: 7899 }, Store { destination_pointer: Relative(7), source: Direct(32841) }, Load { destination: Relative(9), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 7895 }, Call { location: 5357 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Jump { location: 7899 }, Load { destination: Relative(9), source_pointer: Relative(7) }, JumpIf { condition: Relative(9), location: 7902 }, Jump { location: 7938 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 5377 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Store { destination_pointer: Relative(14), source: Direct(32841) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 5377 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 5377 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Store { destination_pointer: Relative(13), source: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 17 }, Call { location: 5377 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Jump { location: 7938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 7825 }, Call { location: 1481 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 7962 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Direct(32842) }, Mov { destination: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 8000 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(8) }, Cast { destination: Relative(6), source: Relative(3), bit_size: Integer(U32) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Field }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(3) }, Return, Call { location: 1481 }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32846) }, JumpIf { condition: Relative(5), location: 7982 }, Call { location: 8169 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 6 }, Call { location: 5377 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Store { destination_pointer: Relative(8), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 7994 }, Call { location: 5357 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16954218183513903507 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1481 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 8007 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Cast { destination: Relative(4), source: Relative(1), bit_size: Field }, Const { destination: Relative(6), bit_size: Field, value: 18446744073709551616 }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(6) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 8054 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Mov { destination: Relative(3), source: Direct(32839) }, Jump { location: 8058 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 8085 }, Jump { location: 8061 }, Load { destination: Relative(1), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Direct(32838) }, JumpIf { condition: Relative(2), location: 8066 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Const { destination: Relative(1), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 8301 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Store { destination_pointer: Relative(6), source: Relative(3) }, Store { destination_pointer: Relative(8), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Load { destination: Relative(1), source_pointer: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 8087 }, Call { location: 5360 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Load { destination: Relative(9), source_pointer: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U1, lhs: Relative(10), rhs: Direct(32838) }, JumpIf { condition: Relative(11), location: 8097 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Direct(32837) }, JumpIf { condition: Relative(10), location: 8123 }, Jump { location: 8100 }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Load { destination: Relative(11), source_pointer: Relative(6) }, Load { destination: Relative(12), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Direct(32837) }, JumpIf { condition: Relative(13), location: 8107 }, Call { location: 5360 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 5377 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Store { destination_pointer: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, JumpIf { condition: Relative(9), location: 8118 }, Call { location: 5357 }, Store { destination_pointer: Relative(7), source: Relative(13) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(8), source: Relative(12) }, Jump { location: 8146 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 8301 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Load { destination: Relative(11), source_pointer: Relative(8) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 5377 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, Store { destination_pointer: Relative(13), source: Relative(5) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Direct(32842) }, Store { destination_pointer: Relative(8), source: Relative(11) }, Jump { location: 8146 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 8058 }, Call { location: 1481 }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32850) }, JumpIf { condition: Relative(5), location: 8154 }, Call { location: 8169 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 5377 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Store { destination_pointer: Relative(8), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 8166 }, Call { location: 5357 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5727012404371710682 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32775), source_pointer: Direct(32775) }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32775), rhs: Direct(32772) }, Load { destination: Direct(32777), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Const { destination: Direct(32780), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32780) }, JumpIf { condition: Direct(32778), location: 8181 }, Jump { location: 8185 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Jump { location: 8207 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32781) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32780) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Mov { destination: Direct(32783), source: Direct(32779) }, Mov { destination: Direct(32784), source: Direct(32780) }, BinaryIntOp { destination: Direct(32785), op: Equals, bit_size: U32, lhs: Direct(32783), rhs: Direct(32782) }, JumpIf { condition: Direct(32785), location: 8206 }, Load { destination: Direct(32781), source_pointer: Direct(32783) }, Store { destination_pointer: Direct(32784), source: Direct(32781) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, Jump { location: 8199 }, Jump { location: 8207 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Return, Load { destination: Direct(32775), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32776), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Load { destination: Direct(32777), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32780), op: LessThanEquals, bit_size: U32, lhs: Direct(32779), rhs: Direct(32777) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32775), rhs: Direct(2) }, JumpIf { condition: Direct(32780), location: 8220 }, Jump { location: 8237 }, JumpIf { condition: Direct(32781), location: 8222 }, Jump { location: 8226 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, Jump { location: 8236 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(32783) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32782) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32777) }, Jump { location: 8236 }, Jump { location: 8249 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32782), op: Mul, bit_size: U32, lhs: Direct(32779), rhs: Direct(32783) }, Const { destination: Direct(32784), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(32784) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32783) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32779) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32782) }, Jump { location: 8249 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, JumpIf { condition: Direct(32781), location: 8263 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(32776) }, Mov { destination: Direct(32784), source: Direct(32778) }, Mov { destination: Direct(32785), source: Direct(32780) }, BinaryIntOp { destination: Direct(32786), op: Equals, bit_size: U32, lhs: Direct(32784), rhs: Direct(32783) }, JumpIf { condition: Direct(32786), location: 8263 }, Load { destination: Direct(32782), source_pointer: Direct(32784) }, Store { destination_pointer: Direct(32785), source: Direct(32782) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32785), op: Add, bit_size: U32, lhs: Direct(32785), rhs: Direct(2) }, Jump { location: 8256 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(32776) }, Return, Call { location: 1481 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 8286 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Direct(32842) }, Mov { destination: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 8000 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(8) }, Cast { destination: Relative(6), source: Relative(3), bit_size: Integer(U32) }, Cast { destination: Relative(4), source: Relative(6), bit_size: Field }, Cast { destination: Relative(3), source: Relative(4), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(3) }, Return, Call { location: 1481 }, Mov { destination: Relative(5), source: Direct(32839) }, Jump { location: 8304 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, JumpIf { condition: Relative(6), location: 8332 }, Jump { location: 8307 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 8314 }, Call { location: 1487 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BlackBox(Poseidon2Permutation { message: HeapVector { pointer: Relative(8), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 4 }, len: Direct(32836) }), Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Return, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 8336 }, Jump { location: 8359 }, Load { destination: Relative(6), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryFieldOp { destination: Relative(10), op: Add, lhs: Relative(7), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 5377 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Jump { location: 8359 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 8304 }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", @@ -272,7 +272,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "22": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index ecda18b8e8a..f99a73e8c72 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -45,14 +45,14 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "pZTbjoMgEED/hWceGLnqrzRNQy1tSAgaqptsGv99h25pazaajX1hRDgHBxhv5OSO4+Xg47m7kmZ3I8fkQ/CXQ+haO/gu4tsbYbkBRZqKEtC/wZCGY6hJIyipcIaYJkoKdhiSc5l686C9t8nFgTRxDIGSLxvG+6Rrb+M9DjbhKKPExRNGFJ59cPlpoi+aLaOGVQ/YVOqJg57xsMwrIR68knwLb6DwxmziS/KaLa6/ln9JH5ApuIQZLpdxAMGfAvMyQD0zqBWD5CUDkHLRoJcNXImyh1wZscWgVcmCGwabDFJ/ahD1PwxsbSfLVQQtZ2e5x55tffpTpAYLMp8cFiQGvAo8hymvkbw9BpcnZtUY28Jhd/juy0gp/z51rTuNyeU13v4B2O4qQat6P+Xv+AE=", + "debug_symbols": "pZRRjoMgEEDvwjcfDAKCV2mahlrakBA0VDfZNN59h65sazaajfvDiPAejDA+yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxLcPwnIDijScEqi/gyZNhcGQRlDCcYaYJkoKdhqSc5l686C9t8nFgTRxDIGSDxvG56R7b+MzDjbhKKPExQtGFF59cPlpoi+araOa8RnWXP3gUC94WOeVEDOvZLWH11B4rXfxJfmara6/lX9JH5ApuIQFLtdxUFD2D0rK1wbMwqA2DMbo2cAZXzXU6wYBzMwGAZLvMfCqZCG4MrsMXP7XAPUfDBtHCbJcRajl4iyP2LOtT7+KFL885KPHgsSAV6HKYcprJG/PweWJWTXGtnDYHT77MlLKv09d6y5jcnmNt38AtgcuKDfHKe/jCw==", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "51": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_0.snap index ecda18b8e8a..f99a73e8c72 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_0.snap @@ -45,14 +45,14 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "pZTbjoMgEED/hWceGLnqrzRNQy1tSAgaqptsGv99h25pazaajX1hRDgHBxhv5OSO4+Xg47m7kmZ3I8fkQ/CXQ+haO/gu4tsbYbkBRZqKEtC/wZCGY6hJIyipcIaYJkoKdhiSc5l686C9t8nFgTRxDIGSLxvG+6Rrb+M9DjbhKKPExRNGFJ59cPlpoi+aLaOGVQ/YVOqJg57xsMwrIR68knwLb6DwxmziS/KaLa6/ln9JH5ApuIQZLpdxAMGfAvMyQD0zqBWD5CUDkHLRoJcNXImyh1wZscWgVcmCGwabDFJ/ahD1PwxsbSfLVQQtZ2e5x55tffpTpAYLMp8cFiQGvAo8hymvkbw9BpcnZtUY28Jhd/juy0gp/z51rTuNyeU13v4B2O4qQat6P+Xv+AE=", + "debug_symbols": "pZRRjoMgEEDvwjcfDAKCV2mahlrakBA0VDfZNN59h65sazaajfvDiPAejDA+yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxLcPwnIDijScEqi/gyZNhcGQRlDCcYaYJkoKdhqSc5l686C9t8nFgTRxDIGSDxvG56R7b+MzDjbhKKPExQtGFF59cPlpoi+araOa8RnWXP3gUC94WOeVEDOvZLWH11B4rXfxJfmara6/lX9JH5ApuIQFLtdxUFD2D0rK1wbMwqA2DMbo2cAZXzXU6wYBzMwGAZLvMfCqZCG4MrsMXP7XAPUfDBtHCbJcRajl4iyP2LOtT7+KFL885KPHgsSAV6HKYcprJG/PweWJWTXGtnDYHT77MlLKv09d6y5jcnmNt38AtgcuKDfHKe/jCw==", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "51": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index ecda18b8e8a..f99a73e8c72 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -45,14 +45,14 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "pZTbjoMgEED/hWceGLnqrzRNQy1tSAgaqptsGv99h25pazaajX1hRDgHBxhv5OSO4+Xg47m7kmZ3I8fkQ/CXQ+haO/gu4tsbYbkBRZqKEtC/wZCGY6hJIyipcIaYJkoKdhiSc5l686C9t8nFgTRxDIGSLxvG+6Rrb+M9DjbhKKPExRNGFJ59cPlpoi+aLaOGVQ/YVOqJg57xsMwrIR68knwLb6DwxmziS/KaLa6/ln9JH5ApuIQZLpdxAMGfAvMyQD0zqBWD5CUDkHLRoJcNXImyh1wZscWgVcmCGwabDFJ/ahD1PwxsbSfLVQQtZ2e5x55tffpTpAYLMp8cFiQGvAo8hymvkbw9BpcnZtUY28Jhd/juy0gp/z51rTuNyeU13v4B2O4qQat6P+Xv+AE=", + "debug_symbols": "pZRRjoMgEEDvwjcfDAKCV2mahlrakBA0VDfZNN59h65sazaajfvDiPAejDA+yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxLcPwnIDijScEqi/gyZNhcGQRlDCcYaYJkoKdhqSc5l686C9t8nFgTRxDIGSDxvG56R7b+MzDjbhKKPExQtGFF59cPlpoi+araOa8RnWXP3gUC94WOeVEDOvZLWH11B4rXfxJfmara6/lX9JH5ApuIQFLtdxUFD2D0rK1wbMwqA2DMbo2cAZXzXU6wYBzMwGAZLvMfCqZCG4MrsMXP7XAPUfDBtHCbJcRajl4iyP2LOtT7+KFL885KPHgsSAV6HKYcprJG/PweWJWTXGtnDYHT77MlLKv09d6y5jcnmNt38AtgcuKDfHKe/jCw==", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "51": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index ca49c429ac8..484a349f733 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -40,14 +40,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Call { location: 13 }, Call { location: 15 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 34 }, Cast { destination: Relative(4), source: Relative(1), bit_size: Integer(U128) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(4), op: Sub, lhs: Relative(1), rhs: Relative(3) }, Const { destination: Relative(5), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, BinaryFieldOp { destination: Relative(6), op: Mul, lhs: Relative(4), rhs: Relative(5) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Direct(32835), rhs: Relative(6) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(3), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 27 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, Const { destination: Relative(1), bit_size: Integer(U1), value: 0 }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(2), location: 33 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 39 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTNjoMgFEbfhbULrvzqqzRNYy1tSAgaqpNMGt99Li20dYGZtBuOiN/hCoQbOZnjfDlYfx6upN3dyDFY5+zl4Ia+m+zg8e2N0NiAJK2sCKgHNGkVoiGtrkhNHwDSNoiatECRDAlInigSZSKqoEbqxOZBRhMhMfrqZalIruowBWNiUW9lYvFjF4yfSOtn5yry07n5/tF17PydUxdwFCsz/oRE4dk6E5+W6pWm5aiuUxZAPdMCVnEoxwE4ewr0ywDNylBvGATL5YMQRQMrG5jkkAxMal4y8I1FoHkVdC1febXKi3Jecp7yUrBP8jr/gNT6o3xeQkWL82+toJJ5F5mm8MkeKKG+NfDmHwa6dZLyLoASq7O8x17X27C6A5ZoCrY7OpO659n3b6PT75hH8h0yhqE3pzmYaHq7SLDdMV6xZr/E2f4A", + "debug_symbols": "pZTBjoMgFEX/hbULHgKCvzJpGmtpQ0LQUJ1k0vjv86jQ1gVm0tlwRLyHJxDu5GxO8/Vo/WW4kfbrTk7BOmevRzf03WQHj2/vhMYGJGllRaBZoUjbIDRpVUUYXQGk1QhGWqDIGglInigSZSKqgCFVol5Z00RIjD62LBXJVR2nYEws6q1MLH7sgvETaf3sXEW+Ozc/PrqNnX9w6gKOYmXGn5EovFhn4tNSvdK0HFUsZQGaZ1rAJg7lOMj426tACvE0gN4Y2I5Ba5UMjLKioS4bOFCdDBwEKxn4ziLQvAqKyVe+2eRFOS85T3kp6k/yKi+iVOqjfD4BDS3Ov7eCrM4FcCb1J3vAmPivAZo/GHaOMoi8C9CIzVk+YK/rbdjcAUs0BdudnEndy+z7t9HpZ8wj+Q4Zw9Cb8xxMNL1dJNh+1byq9WGJs/0C", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "51": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_0.snap index ca49c429ac8..484a349f733 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_0.snap @@ -40,14 +40,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Call { location: 13 }, Call { location: 15 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 34 }, Cast { destination: Relative(4), source: Relative(1), bit_size: Integer(U128) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(4), op: Sub, lhs: Relative(1), rhs: Relative(3) }, Const { destination: Relative(5), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, BinaryFieldOp { destination: Relative(6), op: Mul, lhs: Relative(4), rhs: Relative(5) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Direct(32835), rhs: Relative(6) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(3), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 27 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, Const { destination: Relative(1), bit_size: Integer(U1), value: 0 }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(2), location: 33 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 39 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTNjoMgFEbfhbULrvzqqzRNYy1tSAgaqpNMGt99Li20dYGZtBuOiN/hCoQbOZnjfDlYfx6upN3dyDFY5+zl4Ia+m+zg8e2N0NiAJK2sCKgHNGkVoiGtrkhNHwDSNoiatECRDAlInigSZSKqoEbqxOZBRhMhMfrqZalIruowBWNiUW9lYvFjF4yfSOtn5yry07n5/tF17PydUxdwFCsz/oRE4dk6E5+W6pWm5aiuUxZAPdMCVnEoxwE4ewr0ywDNylBvGATL5YMQRQMrG5jkkAxMal4y8I1FoHkVdC1febXKi3Jecp7yUrBP8jr/gNT6o3xeQkWL82+toJJ5F5mm8MkeKKG+NfDmHwa6dZLyLoASq7O8x17X27C6A5ZoCrY7OpO659n3b6PT75hH8h0yhqE3pzmYaHq7SLDdMV6xZr/E2f4A", + "debug_symbols": "pZTBjoMgFEX/hbULHgKCvzJpGmtpQ0LQUJ1k0vjv86jQ1gVm0tlwRLyHJxDu5GxO8/Vo/WW4kfbrTk7BOmevRzf03WQHj2/vhMYGJGllRaBZoUjbIDRpVUUYXQGk1QhGWqDIGglInigSZSKqgCFVol5Z00RIjD62LBXJVR2nYEws6q1MLH7sgvETaf3sXEW+Ozc/PrqNnX9w6gKOYmXGn5EovFhn4tNSvdK0HFUsZQGaZ1rAJg7lOMj426tACvE0gN4Y2I5Ba5UMjLKioS4bOFCdDBwEKxn4ziLQvAqKyVe+2eRFOS85T3kp6k/yKi+iVOqjfD4BDS3Ov7eCrM4FcCb1J3vAmPivAZo/GHaOMoi8C9CIzVk+YK/rbdjcAUs0BdudnEndy+z7t9HpZ8wj+Q4Zw9Cb8xxMNL1dJNh+1byq9WGJs/0C", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "51": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index ca49c429ac8..484a349f733 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -40,14 +40,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Call { location: 13 }, Call { location: 15 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 34 }, Cast { destination: Relative(4), source: Relative(1), bit_size: Integer(U128) }, Cast { destination: Relative(3), source: Relative(4), bit_size: Field }, BinaryFieldOp { destination: Relative(4), op: Sub, lhs: Relative(1), rhs: Relative(3) }, Const { destination: Relative(5), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, BinaryFieldOp { destination: Relative(6), op: Mul, lhs: Relative(4), rhs: Relative(5) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Direct(32835), rhs: Relative(6) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(3), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 27 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, Const { destination: Relative(1), bit_size: Integer(U1), value: 0 }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(2), location: 33 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 39 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTNjoMgFEbfhbULrvzqqzRNYy1tSAgaqpNMGt99Li20dYGZtBuOiN/hCoQbOZnjfDlYfx6upN3dyDFY5+zl4Ia+m+zg8e2N0NiAJK2sCKgHNGkVoiGtrkhNHwDSNoiatECRDAlInigSZSKqoEbqxOZBRhMhMfrqZalIruowBWNiUW9lYvFjF4yfSOtn5yry07n5/tF17PydUxdwFCsz/oRE4dk6E5+W6pWm5aiuUxZAPdMCVnEoxwE4ewr0ywDNylBvGATL5YMQRQMrG5jkkAxMal4y8I1FoHkVdC1febXKi3Jecp7yUrBP8jr/gNT6o3xeQkWL82+toJJ5F5mm8MkeKKG+NfDmHwa6dZLyLoASq7O8x17X27C6A5ZoCrY7OpO659n3b6PT75hH8h0yhqE3pzmYaHq7SLDdMV6xZr/E2f4A", + "debug_symbols": "pZTBjoMgFEX/hbULHgKCvzJpGmtpQ0LQUJ1k0vjv86jQ1gVm0tlwRLyHJxDu5GxO8/Vo/WW4kfbrTk7BOmevRzf03WQHj2/vhMYGJGllRaBZoUjbIDRpVUUYXQGk1QhGWqDIGglInigSZSKqgCFVol5Z00RIjD62LBXJVR2nYEws6q1MLH7sgvETaf3sXEW+Ozc/PrqNnX9w6gKOYmXGn5EovFhn4tNSvdK0HFUsZQGaZ1rAJg7lOMj426tACvE0gN4Y2I5Ba5UMjLKioS4bOFCdDBwEKxn4ziLQvAqKyVe+2eRFOS85T3kp6k/yKi+iVOqjfD4BDS3Ov7eCrM4FcCb1J3vAmPivAZo/GHaOMoi8C9CIzVk+YK/rbdjcAUs0BdudnEndy+z7t9HpZ8wj+Q4Zw9Cb8xxMNL1dJNh+1byq9WGJs/0C", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "51": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 3d102a8c842..9c63ce85f2c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -119,7 +119,7 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(5), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(6), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(7), bit_size: Integer(U32), value: 3 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(7), offset_address: Direct(5) }, Cast { destination: Direct(1), source: Direct(1), bit_size: Integer(U32) }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(7), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(3), op: IntegerDiv, lhs: Direct(0), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Mul, lhs: Direct(3), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Sub, lhs: Direct(0), rhs: Direct(4) }, Store { destination_pointer: Direct(9), source: Direct(4) }, BinaryIntOp { destination: Direct(9), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(6) }, Mov { destination: Direct(0), source: Direct(3) }, BinaryIntOp { destination: Direct(8), op: LessThan, bit_size: U32, lhs: Direct(9), rhs: Direct(7) }, JumpIf { condition: Direct(8), location: 7 }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, Stop { return_data: HeapVector { pointer: Direct(9), size: Direct(1) } }]" ], - "debug_symbols": "pZbdbvIwDIbvJcc9aGznp9zKNKEC3VSpKqiDSZ8Q9/4ljVNAU6KoPYmJk/dp47jGd3HqDrfvfT9+nX/E7uMuDlM/DP33fjgf22t/Hp33Lmo/SC12UAlpgrFih840YkeVALeDHo9KRNn+OnWdV71wHP3STt14FbvxNgyV+G2H27zp59KOs722k1utK9GNJ2cd8KsfOv/rUT3VdVpqa2CxBb3IpXnTy7ReE7FeK1yjtzLqrV2lj4c3dfL5mfNL3bAe4Bk+9R4/ldbToierUnqdeT4sAZSg4XkCW/oGSscIKIMrTqDJxhvQayJg5HIDAGv0CmMG1km9zKSAtBDfQFr1kkTNOwLSCEClYxqgxSQC0wjUFDMZtaVVCKNjKNDWch1Cmc0IakoQuXDSEgsgtQ6hMRYm0KTWIUwMJxjA7QidQuTqy3IfmfqS0YOKuQ2NSekBN5aHHKCoPuQARQUiCyipEGA2VwiwmysENJsrRBZRViHyiKIKkUcUVYhsOMsqRBZR9nmXI9Z83rjkNuL75/npZu2xn/40hi76ch5hHnEeaR6Ve7TrBrRvYCphgrHBNGFN1mEqHcMntQT2I/uJrWKreZ1pvg2ddcwD5oFkC2yR15kHKujAN7WuYoLjoZ/7ttYFEZpgsQ5+lDx3PHT//ojsJ/Yrtpr9hueW9zfBT3XwE/MI2I88p7CfPM/fwG879e1h6Hy4/YXcxmOMvpte/13iSmzcL9P52J1uU+dv6qV7d+MHUAXN58Pf5n8=", + "debug_symbols": "pZZRjuMgDIbvwnMesA0EepXRqErbzChSlFaZdqRV1bsvBJO2WoVFyQsuJv9HMcbyXZzaw+173w1f5x+x+7iLw9j1ffe978/H5tqdB++9CxkGMGKHlYA6Git25I0TO1UJ9F+ox6MSSba/jm0bVC8cT780YztcxW649X0lfpv+Nn30c2mGyV6b0a/KSrTDyVsP/Or6Nvx6VE+1XJZaiSy2aGY51G96WNYbpVhvNK3RW0h6a1fp0+Frubh/5vxgHOsRn+HT7/HTy3o165XVS3qT2R/nAAIafJ7Alv4DbVIEdE0rTmCUTTdg1kSghvkGENfoNaUMlIt6yKQAok0nQHpNYveOwAzCYroFtBoWEZRJBJBzJoDGVQik9BgUGrcOgXozAuoSRC6cbo4FOliFIJAprQiA1iEUzAgH2xFqCZGrL7r+f33J6FHLOZL1kh5pY3nIAYrqQw5QVCCygJIKgfXmCoF2c4VAt7lCZBFlFSKPKKoQeURRhciGs6xC5BCFz7scseZ505zbRO/P89PPmmM3/tMY+tDBNOI00jSqadR+a59lJjQwlaijsdG4uAYyTsEz0O8NyH5iv2Kr2RpeZ1poQycd85B5CGyRLfE681BHHYam1ldM9DwK89DW+ueJLlqS0U/Ac88jn3BE7Ffs12wN+2ueW/7eRb+S0a+Yp5D9xHMVv1eBF27gtxm75tC3IdzhQm7DMUXfT69/LmklNe6X8XxsT7exDTf10r378cO/eXSfj3CbfwE=", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -130,7 +130,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_0.snap index 3d102a8c842..9c63ce85f2c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_0.snap @@ -119,7 +119,7 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(5), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(6), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(7), bit_size: Integer(U32), value: 3 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(7), offset_address: Direct(5) }, Cast { destination: Direct(1), source: Direct(1), bit_size: Integer(U32) }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(7), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(3), op: IntegerDiv, lhs: Direct(0), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Mul, lhs: Direct(3), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Sub, lhs: Direct(0), rhs: Direct(4) }, Store { destination_pointer: Direct(9), source: Direct(4) }, BinaryIntOp { destination: Direct(9), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(6) }, Mov { destination: Direct(0), source: Direct(3) }, BinaryIntOp { destination: Direct(8), op: LessThan, bit_size: U32, lhs: Direct(9), rhs: Direct(7) }, JumpIf { condition: Direct(8), location: 7 }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, Stop { return_data: HeapVector { pointer: Direct(9), size: Direct(1) } }]" ], - "debug_symbols": "pZbdbvIwDIbvJcc9aGznp9zKNKEC3VSpKqiDSZ8Q9/4ljVNAU6KoPYmJk/dp47jGd3HqDrfvfT9+nX/E7uMuDlM/DP33fjgf22t/Hp33Lmo/SC12UAlpgrFih840YkeVALeDHo9KRNn+OnWdV71wHP3STt14FbvxNgyV+G2H27zp59KOs722k1utK9GNJ2cd8KsfOv/rUT3VdVpqa2CxBb3IpXnTy7ReE7FeK1yjtzLqrV2lj4c3dfL5mfNL3bAe4Bk+9R4/ldbToierUnqdeT4sAZSg4XkCW/oGSscIKIMrTqDJxhvQayJg5HIDAGv0CmMG1km9zKSAtBDfQFr1kkTNOwLSCEClYxqgxSQC0wjUFDMZtaVVCKNjKNDWch1Cmc0IakoQuXDSEgsgtQ6hMRYm0KTWIUwMJxjA7QidQuTqy3IfmfqS0YOKuQ2NSekBN5aHHKCoPuQARQUiCyipEGA2VwiwmysENJsrRBZRViHyiKIKkUcUVYhsOMsqRBZR9nmXI9Z83rjkNuL75/npZu2xn/40hi76ch5hHnEeaR6Ve7TrBrRvYCphgrHBNGFN1mEqHcMntQT2I/uJrWKreZ1pvg2ddcwD5oFkC2yR15kHKujAN7WuYoLjoZ/7ttYFEZpgsQ5+lDx3PHT//ojsJ/Yrtpr9hueW9zfBT3XwE/MI2I88p7CfPM/fwG879e1h6Hy4/YXcxmOMvpte/13iSmzcL9P52J1uU+dv6qV7d+MHUAXN58Pf5n8=", + "debug_symbols": "pZZRjuMgDIbvwnMesA0EepXRqErbzChSlFaZdqRV1bsvBJO2WoVFyQsuJv9HMcbyXZzaw+173w1f5x+x+7iLw9j1ffe978/H5tqdB++9CxkGMGKHlYA6Git25I0TO1UJ9F+ox6MSSba/jm0bVC8cT780YztcxW649X0lfpv+Nn30c2mGyV6b0a/KSrTDyVsP/Or6Nvx6VE+1XJZaiSy2aGY51G96WNYbpVhvNK3RW0h6a1fp0+Frubh/5vxgHOsRn+HT7/HTy3o165XVS3qT2R/nAAIafJ7Alv4DbVIEdE0rTmCUTTdg1kSghvkGENfoNaUMlIt6yKQAok0nQHpNYveOwAzCYroFtBoWEZRJBJBzJoDGVQik9BgUGrcOgXozAuoSRC6cbo4FOliFIJAprQiA1iEUzAgH2xFqCZGrL7r+f33J6FHLOZL1kh5pY3nIAYrqQw5QVCCygJIKgfXmCoF2c4VAt7lCZBFlFSKPKKoQeURRhciGs6xC5BCFz7scseZ505zbRO/P89PPmmM3/tMY+tDBNOI00jSqadR+a59lJjQwlaijsdG4uAYyTsEz0O8NyH5iv2Kr2RpeZ1poQycd85B5CGyRLfE681BHHYam1ldM9DwK89DW+ueJLlqS0U/Ac88jn3BE7Ffs12wN+2ueW/7eRb+S0a+Yp5D9xHMVv1eBF27gtxm75tC3IdzhQm7DMUXfT69/LmklNe6X8XxsT7exDTf10r378cO/eXSfj3CbfwE=", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -130,7 +130,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 3d102a8c842..9c63ce85f2c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -119,7 +119,7 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(5), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(6), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(7), bit_size: Integer(U32), value: 3 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(7), offset_address: Direct(5) }, Cast { destination: Direct(1), source: Direct(1), bit_size: Integer(U32) }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(7), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(3), op: IntegerDiv, lhs: Direct(0), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Mul, lhs: Direct(3), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Sub, lhs: Direct(0), rhs: Direct(4) }, Store { destination_pointer: Direct(9), source: Direct(4) }, BinaryIntOp { destination: Direct(9), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(6) }, Mov { destination: Direct(0), source: Direct(3) }, BinaryIntOp { destination: Direct(8), op: LessThan, bit_size: U32, lhs: Direct(9), rhs: Direct(7) }, JumpIf { condition: Direct(8), location: 7 }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, Stop { return_data: HeapVector { pointer: Direct(9), size: Direct(1) } }]" ], - "debug_symbols": "pZbdbvIwDIbvJcc9aGznp9zKNKEC3VSpKqiDSZ8Q9/4ljVNAU6KoPYmJk/dp47jGd3HqDrfvfT9+nX/E7uMuDlM/DP33fjgf22t/Hp33Lmo/SC12UAlpgrFih840YkeVALeDHo9KRNn+OnWdV71wHP3STt14FbvxNgyV+G2H27zp59KOs722k1utK9GNJ2cd8KsfOv/rUT3VdVpqa2CxBb3IpXnTy7ReE7FeK1yjtzLqrV2lj4c3dfL5mfNL3bAe4Bk+9R4/ldbToierUnqdeT4sAZSg4XkCW/oGSscIKIMrTqDJxhvQayJg5HIDAGv0CmMG1km9zKSAtBDfQFr1kkTNOwLSCEClYxqgxSQC0wjUFDMZtaVVCKNjKNDWch1Cmc0IakoQuXDSEgsgtQ6hMRYm0KTWIUwMJxjA7QidQuTqy3IfmfqS0YOKuQ2NSekBN5aHHKCoPuQARQUiCyipEGA2VwiwmysENJsrRBZRViHyiKIKkUcUVYhsOMsqRBZR9nmXI9Z83rjkNuL75/npZu2xn/40hi76ch5hHnEeaR6Ve7TrBrRvYCphgrHBNGFN1mEqHcMntQT2I/uJrWKreZ1pvg2ddcwD5oFkC2yR15kHKujAN7WuYoLjoZ/7ttYFEZpgsQ5+lDx3PHT//ojsJ/Yrtpr9hueW9zfBT3XwE/MI2I88p7CfPM/fwG879e1h6Hy4/YXcxmOMvpte/13iSmzcL9P52J1uU+dv6qV7d+MHUAXN58Pf5n8=", + "debug_symbols": "pZZRjuMgDIbvwnMesA0EepXRqErbzChSlFaZdqRV1bsvBJO2WoVFyQsuJv9HMcbyXZzaw+173w1f5x+x+7iLw9j1ffe978/H5tqdB++9CxkGMGKHlYA6Git25I0TO1UJ9F+ox6MSSba/jm0bVC8cT780YztcxW649X0lfpv+Nn30c2mGyV6b0a/KSrTDyVsP/Or6Nvx6VE+1XJZaiSy2aGY51G96WNYbpVhvNK3RW0h6a1fp0+Frubh/5vxgHOsRn+HT7/HTy3o165XVS3qT2R/nAAIafJ7Alv4DbVIEdE0rTmCUTTdg1kSghvkGENfoNaUMlIt6yKQAok0nQHpNYveOwAzCYroFtBoWEZRJBJBzJoDGVQik9BgUGrcOgXozAuoSRC6cbo4FOliFIJAprQiA1iEUzAgH2xFqCZGrL7r+f33J6FHLOZL1kh5pY3nIAYrqQw5QVCCygJIKgfXmCoF2c4VAt7lCZBFlFSKPKKoQeURRhciGs6xC5BCFz7scseZ505zbRO/P89PPmmM3/tMY+tDBNOI00jSqadR+a59lJjQwlaijsdG4uAYyTsEz0O8NyH5iv2Kr2RpeZ1poQycd85B5CGyRLfE681BHHYam1ldM9DwK89DW+ueJLlqS0U/Ac88jn3BE7Ffs12wN+2ueW/7eRb+S0a+Yp5D9xHMVv1eBF27gtxm75tC3IdzhQm7DMUXfT69/LmklNe6X8XxsT7exDTf10r378cO/eXSfj3CbfwE=", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -130,7 +130,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 321fcd601a4..6d4b06578e1 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -76,7 +76,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32844 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(8) }, Call { location: 28 }, Mov { destination: Relative(3), source: Relative(7) }, Mov { destination: Relative(4), source: Direct(32841) }, Mov { destination: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(32843) }, Call { location: 39 }, Call { location: 41 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32844 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 38 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 31 }, Return, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 77 }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 48 }, Call { location: 83 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 86 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, BinaryFieldOp { destination: Relative(2), op: Equals, lhs: Relative(1), rhs: Relative(7) }, JumpIf { condition: Relative(2), location: 63 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(2), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(5) }, Mov { destination: Relative(11), source: Relative(6) }, Mov { destination: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 86 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(10) }, BinaryFieldOp { destination: Relative(2), op: Equals, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(2), location: 76 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 82 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 77 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BlackBox(ToRadix { input: Relative(2), radix: Relative(6), output_pointer: Relative(8), num_limbs: Relative(9), output_bits: Relative(7) }), Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(10) }, Call { location: 346 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Field, value: 0 }, Const { destination: Relative(8), bit_size: Integer(U1), value: 1 }, Const { destination: Relative(9), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(10), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(11), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(12), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(13), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(15), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(17), bit_size: Field, value: 2 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(20), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(22), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(4), source: Relative(1) }, Jump { location: 125 }, BinaryIntOp { destination: Relative(25), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, JumpIf { condition: Relative(25), location: 130 }, Jump { location: 128 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Return, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(4) }, Load { destination: Relative(27), source_pointer: Relative(29) }, JumpIf { condition: Relative(27), location: 142 }, Jump { location: 135 }, Load { destination: Relative(27), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(4) }, Load { destination: Relative(28), source_pointer: Relative(30) }, Mov { destination: Relative(25), source: Relative(27) }, Mov { destination: Relative(26), source: Relative(28) }, Jump { location: 149 }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(4) }, Load { destination: Relative(27), source_pointer: Relative(29) }, Load { destination: Relative(28), source_pointer: Relative(2) }, Mov { destination: Relative(25), source: Relative(27) }, Mov { destination: Relative(26), source: Relative(28) }, Jump { location: 149 }, Mov { destination: Relative(28), source: Direct(1) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(29) }, IndirectConst { destination_pointer: Relative(28), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Direct(2) }, Mov { destination: Relative(30), source: Relative(29) }, Store { destination_pointer: Relative(30), source: Relative(25) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(26) }, Mov { destination: Relative(25), source: Direct(1) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(26) }, IndirectConst { destination_pointer: Relative(25), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Mov { destination: Relative(29), source: Relative(26) }, Store { destination_pointer: Relative(29), source: Relative(7) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(29), source: Relative(7) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(29), source: Relative(7) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(29), source: Relative(7) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(29), source: Relative(7) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(29), source: Relative(7) }, Mov { destination: Relative(26), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(26), source: Relative(25) }, Mov { destination: Relative(25), source: Direct(1) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(29) }, IndirectConst { destination_pointer: Relative(25), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Mov { destination: Relative(30), source: Relative(29) }, Store { destination_pointer: Relative(30), source: Relative(7) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(7) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(8) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(7) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(7) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(8) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(7) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(7) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(8) }, Mov { destination: Relative(29), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(29), source: Relative(25) }, Mov { destination: Relative(25), source: Direct(1) }, Const { destination: Relative(30), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(30) }, IndirectConst { destination_pointer: Relative(25), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Mov { destination: Relative(31), source: Relative(30) }, Store { destination_pointer: Relative(31), source: Relative(10) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(11) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(9) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(12) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(13) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(9) }, Mov { destination: Relative(27), source: Relative(1) }, Jump { location: 223 }, BinaryIntOp { destination: Relative(30), op: LessThan, bit_size: U32, lhs: Relative(27), rhs: Relative(14) }, JumpIf { condition: Relative(30), location: 276 }, Jump { location: 226 }, Load { destination: Relative(25), source_pointer: Relative(26) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 365 }, Mov { destination: Relative(27), source: Direct(32773) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(18) }, Store { destination_pointer: Relative(28), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(27) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 365 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(19) }, Store { destination_pointer: Relative(28), source: Relative(7) }, Store { destination_pointer: Relative(26), source: Relative(25) }, Load { destination: Relative(26), source_pointer: Relative(29) }, Mov { destination: Direct(32771), source: Relative(26) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 365 }, Mov { destination: Relative(27), source: Direct(32773) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(21) }, Store { destination_pointer: Relative(28), source: Relative(20) }, Mov { destination: Direct(32771), source: Relative(27) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 365 }, Mov { destination: Relative(26), source: Direct(32773) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(23) }, Store { destination_pointer: Relative(28), source: Relative(22) }, Mov { destination: Direct(32771), source: Relative(26) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 365 }, Mov { destination: Relative(27), source: Direct(32773) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(24) }, Store { destination_pointer: Relative(28), source: Relative(9) }, Store { destination_pointer: Relative(29), source: Relative(27) }, Mov { destination: Relative(26), source: Direct(1) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(28) }, IndirectConst { destination_pointer: Relative(26), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Direct(2) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(28), size: Relative(29) }, scalars: HeapVector { pointer: Relative(30), size: Relative(31) }, outputs: HeapArray { pointer: Relative(32), size: 3 } }), BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(16) }, Load { destination: Relative(25), source_pointer: Relative(27) }, Store { destination_pointer: Relative(2), source: Relative(25) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(16) }, Mov { destination: Relative(4), source: Relative(25) }, Jump { location: 125 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(28), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(27) }, Load { destination: Relative(30), source_pointer: Relative(32) }, Cast { destination: Relative(32), source: Relative(30), bit_size: Integer(U128) }, Cast { destination: Relative(31), source: Relative(32), bit_size: Field }, BinaryFieldOp { destination: Relative(32), op: Sub, lhs: Relative(30), rhs: Relative(31) }, BinaryFieldOp { destination: Relative(33), op: Mul, lhs: Relative(32), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(32), op: Mul, lhs: Direct(32835), rhs: Relative(33) }, BinaryFieldOp { destination: Relative(34), op: Add, lhs: Relative(31), rhs: Relative(32) }, BinaryFieldOp { destination: Relative(32), op: Equals, lhs: Relative(30), rhs: Relative(34) }, JumpIf { condition: Relative(32), location: 289 }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(35) } }, Load { destination: Relative(30), source_pointer: Relative(26) }, BinaryIntOp { destination: Relative(32), op: Mul, bit_size: U32, lhs: Relative(27), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(30) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 365 }, Mov { destination: Relative(34), source: Direct(32773) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(35), rhs: Relative(32) }, Store { destination_pointer: Relative(36), source: Relative(31) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(16) }, Mov { destination: Direct(32771), source: Relative(34) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 365 }, Mov { destination: Relative(31), source: Direct(32773) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(30) }, Store { destination_pointer: Relative(35), source: Relative(33) }, Store { destination_pointer: Relative(26), source: Relative(31) }, BinaryIntOp { destination: Relative(30), op: Mul, bit_size: U32, lhs: Relative(27), rhs: Relative(6) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(30) }, Load { destination: Relative(31), source_pointer: Relative(33) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(30), rhs: Relative(16) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(32) }, Load { destination: Relative(33), source_pointer: Relative(35) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(30), rhs: Relative(14) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Relative(34) }, Load { destination: Relative(35), source_pointer: Relative(37) }, Load { destination: Relative(34), source_pointer: Relative(29) }, Mov { destination: Direct(32771), source: Relative(34) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 365 }, Mov { destination: Relative(36), source: Direct(32773) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(37), rhs: Relative(30) }, Store { destination_pointer: Relative(38), source: Relative(31) }, Mov { destination: Direct(32771), source: Relative(36) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 365 }, Mov { destination: Relative(30), source: Direct(32773) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(32) }, Store { destination_pointer: Relative(34), source: Relative(33) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(16) }, Mov { destination: Direct(32771), source: Relative(30) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 365 }, Mov { destination: Relative(32), source: Direct(32773) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(33), rhs: Relative(31) }, Store { destination_pointer: Relative(34), source: Relative(35) }, Store { destination_pointer: Relative(29), source: Relative(32) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(16) }, Mov { destination: Relative(27), source: Relative(30) }, Jump { location: 223 }, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 364 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 350 }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 369 }, Jump { location: 371 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 386 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 383 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 376 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 386 }, Return]" ], - "debug_symbols": "pZjdTiM5EEbfJde5aLtc/uFVEEIBwihSFFCGrLRCefd1tX06sFIixnOT7zTpOv1jl7vJ5+pl+3T69bg7vL79Xt3df66ejrv9fvfrcf/2vPnYvR3qXz9Xk31o/XTrlboWvoW0CC20RWyRWuQWZXXn16s4tXAtfItqkRqhhbaILVKL3KLMkaYWrkW1hBrSIrTQOXItjzVyizJHmVq4Fr6FtAgttEVs0SylWUqzuKlq1NL19C19rU2WdfdcU+p+xdL19D3tdk0GdsOcQQJyh+D7PkGAAFAeSt95HqIZHOABAQKgAEdXjj4PmRiUDjZsDRzgAQECoEAEEoA5Yk6YE+aEOWFOmBPmhDlhTmYOBqVDngAHeECAACgQgQRgzpgL5oK5YC6YC+aCuWAumAvm0s1+mgAHeEAAM0cDBSKQgAyUDm4CHOABATA7zA6zw+wwO8weszdPMrCqbGBVxSADpYM1RQMHeECAACgQAcyCWTAHW2ImA1tknIEHBAiAAhFIQAZKB+uvBpgVs2JWzIpZMStmxayY52XRGzjAAwIEQIEIJCADpYP1lxcDB/h5WfLWXnOaxSaW9VKDDJjF9rFeamAWu8vWS2J32XpJ7Bqsl8QOab0kdiTrpQYJyICZ62LprZfEjmW91MADAgRAgQgkIAOlgUwT4AAPCBAABSJgZjXIQOlgvdTAAR4QIAAKRACzw+wwWy9JNHCABwQIgAIRSEAGSgfBLJgFs2AWzIJZMAtmwSyYA+aAOWAOs/l8Xq94n3j8OG639jrx5QWjvna8b47bw8fq7nDa79erfzb707zT7/fNYc6PzbF+W6fb9vBSswpfd/ut0Xl9qZ6ul9YHTi+u69VSrj+v1/RX9XXtoL6kgXpx1NehGKgPy/WHrNfq9cb11yWzC1xdmxaDyz89A7W+nwUqYeAKklKfJz9Qr5E7qEkG6mPIvT7GkRmQlhFM/ur55xsjkD2C+raSLyNQvhmcvzEJJ126YPpyEX+icLZONUV9LxtS1IcuirpwXlXcmI11laYdqyEOnYXYQ6ufhfghRSgRhU5jZxHCchZB3ZDiMjHrC0EaU9hzuyuCjikS7VlfMOTvFYODmsIyqHlsUEXjRXH1Qvyt2RmXQZWYr/aIj9cVdYljsft6J9J3Qbq1WnEjosqQIHMNMecxwbLeTdfP4NZtTJH5IHlyQyORlsf2uCKUHyhuT6mwTGzRsd4I07JyB1/GzqIsZxH+t1o91K3N8+747Wefs7mOu83Tfts3X0+H5y/ffvz7zjf8bPR+fHvevpyOWzNdfjuqH/cSdS05PtR/d20rxHXtk7pVXxHv678Wku0b2zGldfa2YftlWWd9ONsp/gc=", + "debug_symbols": "pZjdbuJMDIbvJcccjO3x/PRWqqqiLV0hIVqx8EmfKu597ThvaFcCddMT3icQP/mZ8RD4GF42T6dfj9v969vv4e7+Y3g6bHe77a/H3dvz+rh929u7H0PyF7VXWg1KERwhETlCI0pEjWgRfbjj1VBSBEVwhFnEIkdoRImoES2ij1FTBEWYJVtIRI7QMZqVF4sW0cfoKYIiOEIicoRGlIiw9LD0sFAyjXrSlBzJVls9bfdmKbZf96QpeUq/XcnBbxg5VECbIPO0TxZABqA892nncYhGIAADBJABCsDRFUcfh0wc+gQ+bAEEYIAAMkABBVABMBeYK8wV5gpzhbnCXGGuMFeYq5uzQ5+gJQABGCCADFBAAVQAzA3mDnOHucPcYe4wd5g7zB3mDnOfzJwSgAAMEICbi4MCCqACGqBPQAlAAAYIAGaCmWAmmAlmgplhZvdUB69qDl7VHRqgT+BNEUAABgggAxRQADALzAJz9iUmOfgiQw4MEEAGKKAAKqAB+gTeXwEwK8wKs8KsMCvMCrPCrDCPyyI7EIABAsgABRRABTRAn8D7i8WBADwuS+ztNaZbfGJ5LwU0gFt8H++lALf4XfZeEr/L3kvi1+C9JH5I7yXxI3kvBVRAA7jZFkv2XhI/lvdSAAMEkAEKKIAKaIAeICkBCMAAAWSAAgrAzerQAH0C76UAAjBAABmggAKAmWAmmL2XpDgQgAECyAAFFEAFNECfQGAWmAVmgVlgFpgFZoFZYBaYM8wZ5gxzHs3n82rA88Tj8bDZ+OPEpwcMe+x4Xx82++Nwtz/tdqvhv/XuNO70+329H/O4PtinNt02+xdLE75udxun8+pSna6X2hfOVGzr1Vyu36/X+qN6WztQ3+uCeiHU21AsqM/z9eem1+r1xvXbkjkJyNam2UDtu2eg3vejQCUvuIKqqG+JF9RrwR3UKgvqS25TfSlLZkCdR7Dy1fNvN2aQLZ6YQtbxlxHoXwzEtyYhz7NYuS1SlIRhsC8kXqSoNCtqS1cVN2ajqK+W0Q7a87Kz6POK0FJapOglX5p62Vn0NJ9Ft7oFCvsSKrgX9pNimSLNqwuRLFNkmhWdfq5Ydjtb5nlQddmgNs4XxdUL4RuzM9M8qNl+gV1VlOsKW+Kw2H1u9fpVUG+tVriKorJI0DAYpbVlgnm9S9fP4NZtZMEpZHueXTQSzPpjBdVvKG5PKaJ5SjEtU9R55W6fHiD+SVEuZ/HXavVgW+vn7eHL3z5ndx2266fdZtp8Pe2fP316/P8dn+Bvo/fD2/Pm5XTYuOny35G93EvRlbTyYD93fSuXlZRsW/aIeG8/LaT5J76jXWlj3/D9mqyaPpz9FP8A", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -87,7 +87,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_0.snap index 105357617af..3f2aaa54a21 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_0.snap @@ -76,7 +76,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32844 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(8) }, Call { location: 28 }, Mov { destination: Relative(3), source: Relative(7) }, Mov { destination: Relative(4), source: Direct(32841) }, Mov { destination: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(32843) }, Call { location: 39 }, Call { location: 41 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32844 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 38 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 31 }, Return, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 77 }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 48 }, Call { location: 83 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 86 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(11) }, BinaryFieldOp { destination: Relative(2), op: Equals, lhs: Relative(1), rhs: Relative(7) }, JumpIf { condition: Relative(2), location: 63 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(2), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(5) }, Mov { destination: Relative(11), source: Relative(6) }, Mov { destination: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 86 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(10) }, BinaryFieldOp { destination: Relative(2), op: Equals, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(2), location: 76 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 82 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 77 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BlackBox(ToRadix { input: Relative(2), radix: Relative(6), output_pointer: Relative(8), num_limbs: Relative(9), output_bits: Relative(7) }), Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(10) }, Call { location: 362 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(1) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(1) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(1) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(1) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(1) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(7), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(9), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(10), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(11), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(12), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(13), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(10) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(11) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(12) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(12), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(15), bit_size: Field, value: 2 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(18), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(20), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 182 }, BinaryIntOp { destination: Relative(23), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(9) }, JumpIf { condition: Relative(23), location: 187 }, Jump { location: 185 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Return, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(4) }, Load { destination: Relative(25), source_pointer: Relative(27) }, JumpIf { condition: Relative(25), location: 199 }, Jump { location: 192 }, Load { destination: Relative(25), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(4) }, Load { destination: Relative(26), source_pointer: Relative(28) }, Mov { destination: Relative(23), source: Relative(25) }, Mov { destination: Relative(24), source: Relative(26) }, Jump { location: 206 }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(4) }, Load { destination: Relative(25), source_pointer: Relative(27) }, Load { destination: Relative(26), source_pointer: Relative(2) }, Mov { destination: Relative(23), source: Relative(25) }, Mov { destination: Relative(24), source: Relative(26) }, Jump { location: 206 }, Mov { destination: Relative(26), source: Direct(1) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(27) }, IndirectConst { destination_pointer: Relative(26), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, Mov { destination: Relative(28), source: Relative(27) }, Store { destination_pointer: Relative(28), source: Relative(23) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(28), rhs: Direct(2) }, Store { destination_pointer: Relative(28), source: Relative(24) }, Load { destination: Relative(23), source_pointer: Relative(6) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(24), rhs: Relative(23) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 221 }, Call { location: 83 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(23) }, Mov { destination: Relative(23), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(23), source: Relative(6) }, Load { destination: Relative(27), source_pointer: Relative(8) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(29), op: Equals, bit_size: U32, lhs: Relative(28), rhs: Relative(27) }, Not { destination: Relative(29), source: Relative(29), bit_size: U1 }, JumpIf { condition: Relative(29), location: 232 }, Call { location: 83 }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(27), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(27) }, Mov { destination: Relative(27), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(27), source: Relative(8) }, Mov { destination: Relative(25), source: Relative(7) }, Jump { location: 239 }, BinaryIntOp { destination: Relative(24), op: LessThan, bit_size: U32, lhs: Relative(25), rhs: Relative(11) }, JumpIf { condition: Relative(24), location: 292 }, Jump { location: 242 }, Load { destination: Relative(24), source_pointer: Relative(23) }, Mov { destination: Direct(32771), source: Relative(24) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 381 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(16) }, Store { destination_pointer: Relative(26), source: Relative(15) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 381 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(17) }, Store { destination_pointer: Relative(26), source: Relative(1) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Load { destination: Relative(23), source_pointer: Relative(27) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 381 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(19) }, Store { destination_pointer: Relative(26), source: Relative(18) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 381 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Store { destination_pointer: Relative(26), source: Relative(20) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 381 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(22) }, Store { destination_pointer: Relative(26), source: Relative(10) }, Store { destination_pointer: Relative(27), source: Relative(25) }, Mov { destination: Relative(23), source: Direct(1) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(26) }, IndirectConst { destination_pointer: Relative(23), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(26), size: Relative(27) }, scalars: HeapVector { pointer: Relative(28), size: Relative(29) }, outputs: HeapArray { pointer: Relative(30), size: 3 } }), BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(14) }, Load { destination: Relative(24), source_pointer: Relative(25) }, Store { destination_pointer: Relative(2), source: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(14) }, Mov { destination: Relative(4), source: Relative(23) }, Jump { location: 182 }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(25) }, Load { destination: Relative(24), source_pointer: Relative(29) }, Cast { destination: Relative(29), source: Relative(24), bit_size: Integer(U128) }, Cast { destination: Relative(28), source: Relative(29), bit_size: Field }, BinaryFieldOp { destination: Relative(29), op: Sub, lhs: Relative(24), rhs: Relative(28) }, BinaryFieldOp { destination: Relative(30), op: Mul, lhs: Relative(29), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(29), op: Mul, lhs: Direct(32835), rhs: Relative(30) }, BinaryFieldOp { destination: Relative(31), op: Add, lhs: Relative(28), rhs: Relative(29) }, BinaryFieldOp { destination: Relative(29), op: Equals, lhs: Relative(24), rhs: Relative(31) }, JumpIf { condition: Relative(29), location: 305 }, Const { destination: Relative(32), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(32) } }, Load { destination: Relative(24), source_pointer: Relative(23) }, BinaryIntOp { destination: Relative(29), op: Mul, bit_size: U32, lhs: Relative(25), rhs: Relative(11) }, Mov { destination: Direct(32771), source: Relative(24) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 381 }, Mov { destination: Relative(31), source: Direct(32773) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(29) }, Store { destination_pointer: Relative(33), source: Relative(28) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(31) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 381 }, Mov { destination: Relative(28), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(24) }, Store { destination_pointer: Relative(32), source: Relative(30) }, Store { destination_pointer: Relative(23), source: Relative(28) }, BinaryIntOp { destination: Relative(24), op: Mul, bit_size: U32, lhs: Relative(25), rhs: Relative(9) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(24) }, Load { destination: Relative(28), source_pointer: Relative(30) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(14) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(29) }, Load { destination: Relative(30), source_pointer: Relative(32) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(11) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(33), rhs: Relative(31) }, Load { destination: Relative(32), source_pointer: Relative(34) }, Load { destination: Relative(31), source_pointer: Relative(27) }, Mov { destination: Direct(32771), source: Relative(31) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 381 }, Mov { destination: Relative(33), source: Direct(32773) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(24) }, Store { destination_pointer: Relative(35), source: Relative(28) }, Mov { destination: Direct(32771), source: Relative(33) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 381 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(29) }, Store { destination_pointer: Relative(31), source: Relative(30) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(24) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 381 }, Mov { destination: Relative(29), source: Direct(32773) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Relative(28) }, Store { destination_pointer: Relative(31), source: Relative(32) }, Store { destination_pointer: Relative(27), source: Relative(29) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(14) }, Mov { destination: Relative(25), source: Relative(24) }, Jump { location: 239 }, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 380 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 366 }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 385 }, Jump { location: 387 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 402 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 399 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 392 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 402 }, Return]" ], - "debug_symbols": "pZjbTuNKEEX/Jc95cNelL/wKQihAGEWKAsqQIx2h/Pt0uWo7MJIt5HlhrxD3wnHvbpt8bl72T5dfj4fT69vvzd395+bpfDgeD78ej2/Pu4/D26n/9nMz2A/tP9N2o8mDPNhDPNQjexSP6tE2d7Td5MEjeZBHt3AP8VCP7FE8qkcbowweyaNbpAd7iIeOUfvw3KN6tDHa4JE8yIM9xEM9sodbmluaW9LQNWqZIimym5qlRGpkjiyRNbJ5piEyRVJk+FL4UvhS+FL4UvhS+Ch8ZFM2GBCAAQJQQAYUQAW0AB4AMDPMDDPDzDAzzAwzw8wwC8wCs8AsMAvMYmYyyIACqIAWMNZ3hAQgAAMEALPCrDArzApzhjnDnGHOMGeYM8wZ5moHs0F/q1janxKDCmgBVtVkFbOyJuug1dVBAc2PIaunQwIQIPvBZFV0qIAWYG10SAACMEAAXkmKSlJUkqKSFJWkqCRRiqRIjpTI8KGNhDYS2khoI6GNhDYS2khoI6GNhDYS2khj9/p1p7Fp1cBG2V8fmzaCAjKgACqgBYxNGyEBCACzwqwwW9PIzseaRsmgAlrAuHmOkAAEYIAAFJABMGeYM8wF5gJzgbnAXGAuMBczk0EBVEALqAMgAQjAAAEowMxsUAB1XB1ka8HSlgKJAQMEYBabSNu9HcxiV9l2cLarbKuE+2dgWyVMBnYzYQMCMEAAZlYDuzmJQQFUQAuwBeSQAARggAAUAHOCOcGcYCaYCWaC2RYS2xnaSnJQQAYUQAW0AFtLDglAAJgZZobZ1hJngwKogBZgO7tDAhCAAQJQAMwCs8AsMCvMCrPCrDArzAqzwqwwK8w6mq/X7QZPQY8f5/3eHoK+PBb1h6X33Xl/+tjcnS7H43bz3+54GQ/6/b47jfmxO/d3e932p5eeXfh6OO6Nrtvb6GF+aMotBvedcxquPx+v5Z/G970M41tZMZ4TxvdqrBgv0+eXqnPjdeHz9y08BP3BhiZDqj89g6IcgjrQ3BmUhTOohEvQb/D1dgbtm6EuzMGgUwmGPKwxJFulbkhF1hj6HRCGvovNGVJaqMKQ0cVuyHOKhalQxlQoy4oyacZMaOEV47PUGJ/zmsVUpsVQaLZKS5PAdsOKSWBaM43SMgw65FUGmc5BNK0x3C5jfzIpqwx2vw6D6CpDQZX6cw7/s2HVleQi02zWVbPZ72E3w+ynoIX9kfM0nZzr7M5AeV7Rt0VskF+vQ/kuKEvLCtchK68SVHyGXOs6wbQwh/kzWLqMJaMNXIe0aibKdKter5D2A8Vio2RqNeuqdSHDdLMSaqvOoU3nIH/tUQ/91e75cP727dTVXOfD7um4j5evl9Pzl3c//n/HO/h26/389rx/uZz3Zrp9xdV/3HNvkwz00P+TtleZtv1i9lf9SfK+/y/B1d6xA0vZ1vEwO67yturD1U7xDw==", + "debug_symbols": "pZjbTuNKEEX/Jc95cFV19YVfQQgFCKNIUUCZ5EhHKP8+Xa7aDowUizEv7BXiXtju3R2Hj9XL9un863F3eH37vbq7/1g9HXf7/e7X4/7teXPavR36bz9Wg/3Q/pPWKyUP9hCP5KEe2aN4VI+2uuP1Kg8e5MEe3SI9kod6ZI/iUT3aGGXwII9uST3EI3noGLUPzz2qRxujDR7kwR7ikTzUI3u4pbmluYWGrlFLiuTIbmqWKVIjc2SJrJHNk4ZIiuTI8FH4KHwUPgofhY/Cx+Fjm7LBgAECSAAFZEABVEALkAEAs8AsMAvMArPALDALzAJzgjnBnGBOMCeYk5nZIAMKoAJawFjfEQjAAAEkAMwKs8KsMCvMGeYMc4Y5w5xhzjBnmKsdLAb9rWJpfyoZVEALsKqSVczKStZBq6uDApofw1ZPBwIwIPvBbFV0qIAWYG10IAADBJAAXkmOSnJUkqOSHJXkqCQzRXKkRKbI8KGNjDYy2shoI6ONjDYy2shoI6ONjDYy2shj9/p957Fp1cBG2V8fmzaCAjKgACqgBYxNG4EADIBZYVaYrWls52NNYzKogBYwbp4jEIABAkgABWQAzBnmDHOBucBcYC4wF5gLzMXMbFAAFdAC6gAgAAMEkAAKMLMYFEAdVwfbWrC0pcDJQAAJYBabSNu9Hcxid9l2cLG7bKtE+jWIrRJhA/swEQMGCCABzKwG9uGUDAqgAlqALSAHAjBAAAmgAJgJZoKZYGaYGWaG2RaS2BnaSnJQQAYUQAW0AFtLDgRgAMwCs8Bsa0myQQFUQAuwnd2BAAwQQAIoAOYEc4I5wawwK8wKs8KsMCvMCrPCrDDraL5c1is8BT2ejtutPQR9eizqD0vvm+P2cFrdHc77/Xr132Z/Hg/6/b45jHnaHPu7vW7bw0vPLnzd7bdGl/V19HB7KOUWg/vOOQ3X74/X8qPxfS/D+FYWjBfC+F6NBePTdP2p6q3xOnP9fQsPQX+w4clA9btnUFRCUAe+dQZl5g72jQu3sK/A6xm0L4Y6Nwc8TaJyXWLIAy6ifzzwEkOhyVDqcMtANFMFta3Cu6At3VLMTIUKzkElLSiTZpRRiywYnxNmMucli6lMi6HwzSrNTkKbdoM6DEumseV0Xc9pkWGYzqH1Yf9u6J+GGT3o3w0WGYZpV+nfjRYZEk2GRj82LLqTNfE0m7poNiunq+HmVfDM/phoms7Uvw/dVOTbir4tYoP8vL2Vr4Iyt6xwFVllkaBiKnKtywTTwhxun8HcbWTBKaT+TL1oJpj1xwoq31DMNopoahTTIkOZPqzqp0eGfzHk6zn8tUc99Feb593xy3+nLuY67jZP+228fD0fnj+9e/r/He/gv1vvx7fn7cv5uDXT9V9c/ce99DalgR/6N2l7lXktdeiv+pPkff8uIdXesQP7hdbxMDuuyrrqw8VO8Q8=", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -87,7 +87,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index cafc0d2c65f..b96116cbdc9 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -76,7 +76,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32844 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(3) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(8) }, Call { location: 28 }, Mov { destination: Relative(3), source: Relative(7) }, Mov { destination: Relative(4), source: Direct(32841) }, Mov { destination: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(32843) }, Call { location: 39 }, Call { location: 41 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32844 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 38 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 31 }, Return, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 533 }, Load { destination: Relative(8), source_pointer: Relative(3) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 48 }, Call { location: 539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(11), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BlackBox(ToRadix { input: Relative(6), radix: Relative(10), output_pointer: Relative(12), num_limbs: Relative(13), output_bits: Relative(11) }), Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(12) }, Mov { destination: Direct(32772), source: Relative(14) }, Call { location: 542 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, Const { destination: Relative(2), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(2) }, Const { destination: Relative(11), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Const { destination: Relative(11), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(13), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(14), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(15), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(16), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(17), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Mov { destination: Relative(19), source: Relative(18) }, Store { destination_pointer: Relative(19), source: Relative(11) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(13) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(14) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(15) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(16) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(14) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(16), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(19), bit_size: Field, value: 2 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(22), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(24), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(25), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(26), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 145 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, JumpIf { condition: Relative(9), location: 358 }, Jump { location: 148 }, Load { destination: Relative(9), source_pointer: Relative(6) }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(1), rhs: Relative(9) }, JumpIf { condition: Relative(6), location: 153 }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(27) } }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 162 }, Call { location: 539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 170 }, Call { location: 539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(5) }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 174 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, JumpIf { condition: Relative(5), location: 183 }, Jump { location: 177 }, Load { destination: Relative(2), source_pointer: Relative(1) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(1), location: 182 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Return, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(28) }, JumpIf { condition: Relative(9), location: 195 }, Jump { location: 188 }, Load { destination: Relative(9), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(7) }, Load { destination: Relative(27), source_pointer: Relative(29) }, Mov { destination: Relative(5), source: Relative(9) }, Mov { destination: Relative(6), source: Relative(27) }, Jump { location: 202 }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(28) }, Load { destination: Relative(27), source_pointer: Relative(1) }, Mov { destination: Relative(5), source: Relative(9) }, Mov { destination: Relative(6), source: Relative(27) }, Jump { location: 202 }, Mov { destination: Relative(27), source: Direct(1) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(28) }, IndirectConst { destination_pointer: Relative(27), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Direct(2) }, Mov { destination: Relative(29), source: Relative(28) }, Store { destination_pointer: Relative(29), source: Relative(5) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(29), source: Relative(6) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(28), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(28), source: Relative(28), bit_size: U1 }, JumpIf { condition: Relative(28), location: 217 }, Call { location: 539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Load { destination: Relative(28), source_pointer: Relative(12) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(30), op: Equals, bit_size: U32, lhs: Relative(29), rhs: Relative(28) }, Not { destination: Relative(30), source: Relative(30), bit_size: U1 }, JumpIf { condition: Relative(30), location: 228 }, Call { location: 539 }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(28), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(28) }, Mov { destination: Relative(28), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(28), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(11) }, Jump { location: 235 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(15) }, JumpIf { condition: Relative(6), location: 288 }, Jump { location: 238 }, Load { destination: Relative(6), source_pointer: Relative(5) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 561 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(20) }, Store { destination_pointer: Relative(27), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 561 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(21) }, Store { destination_pointer: Relative(27), source: Relative(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Load { destination: Relative(5), source_pointer: Relative(28) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(23) }, Store { destination_pointer: Relative(27), source: Relative(22) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(25) }, Store { destination_pointer: Relative(27), source: Relative(24) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(26) }, Store { destination_pointer: Relative(27), source: Relative(14) }, Store { destination_pointer: Relative(28), source: Relative(9) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(27) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(30), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(27), size: Relative(28) }, scalars: HeapVector { pointer: Relative(29), size: Relative(30) }, outputs: HeapArray { pointer: Relative(31), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(18) }, Load { destination: Relative(6), source_pointer: Relative(9) }, Store { destination_pointer: Relative(1), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(18) }, Mov { destination: Relative(7), source: Relative(5) }, Jump { location: 174 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(27), rhs: Direct(2) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(9) }, Load { destination: Relative(6), source_pointer: Relative(30) }, Cast { destination: Relative(30), source: Relative(6), bit_size: Integer(U128) }, Cast { destination: Relative(29), source: Relative(30), bit_size: Field }, BinaryFieldOp { destination: Relative(30), op: Sub, lhs: Relative(6), rhs: Relative(29) }, BinaryFieldOp { destination: Relative(31), op: Mul, lhs: Relative(30), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(30), op: Mul, lhs: Direct(32835), rhs: Relative(31) }, BinaryFieldOp { destination: Relative(32), op: Add, lhs: Relative(29), rhs: Relative(30) }, BinaryFieldOp { destination: Relative(30), op: Equals, lhs: Relative(6), rhs: Relative(32) }, JumpIf { condition: Relative(30), location: 301 }, Const { destination: Relative(33), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(33) } }, Load { destination: Relative(6), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(30), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(15) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 561 }, Mov { destination: Relative(32), source: Direct(32773) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(33), rhs: Relative(30) }, Store { destination_pointer: Relative(34), source: Relative(29) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(30), rhs: Relative(18) }, Mov { destination: Direct(32771), source: Relative(32) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 561 }, Mov { destination: Relative(29), source: Direct(32773) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(30), rhs: Relative(6) }, Store { destination_pointer: Relative(33), source: Relative(31) }, Store { destination_pointer: Relative(5), source: Relative(29) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(13) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Relative(6) }, Load { destination: Relative(29), source_pointer: Relative(31) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(18) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(30) }, Load { destination: Relative(31), source_pointer: Relative(33) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(15) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(32) }, Load { destination: Relative(33), source_pointer: Relative(35) }, Load { destination: Relative(32), source_pointer: Relative(28) }, Mov { destination: Direct(32771), source: Relative(32) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(34), source: Direct(32773) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(35), rhs: Relative(6) }, Store { destination_pointer: Relative(36), source: Relative(29) }, Mov { destination: Direct(32771), source: Relative(34) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(30) }, Store { destination_pointer: Relative(32), source: Relative(31) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(30), rhs: Relative(18) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(30), source: Direct(32773) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(29) }, Store { destination_pointer: Relative(32), source: Relative(33) }, Store { destination_pointer: Relative(28), source: Relative(30) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(18) }, Mov { destination: Relative(9), source: Relative(6) }, Jump { location: 235 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(7) }, Load { destination: Relative(28), source_pointer: Relative(30) }, JumpIf { condition: Relative(28), location: 370 }, Jump { location: 363 }, Load { destination: Relative(28), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Relative(7) }, Load { destination: Relative(29), source_pointer: Relative(31) }, Mov { destination: Relative(9), source: Relative(28) }, Mov { destination: Relative(27), source: Relative(29) }, Jump { location: 377 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(7) }, Load { destination: Relative(28), source_pointer: Relative(30) }, Load { destination: Relative(29), source_pointer: Relative(6) }, Mov { destination: Relative(9), source: Relative(28) }, Mov { destination: Relative(27), source: Relative(29) }, Jump { location: 377 }, Mov { destination: Relative(29), source: Direct(1) }, Const { destination: Relative(30), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(30) }, IndirectConst { destination_pointer: Relative(29), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Mov { destination: Relative(31), source: Relative(30) }, Store { destination_pointer: Relative(31), source: Relative(9) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(27) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(30), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(9) }, Not { destination: Relative(30), source: Relative(30), bit_size: U1 }, JumpIf { condition: Relative(30), location: 392 }, Call { location: 539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(10) }, Load { destination: Relative(30), source_pointer: Relative(12) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(32), op: Equals, bit_size: U32, lhs: Relative(31), rhs: Relative(30) }, Not { destination: Relative(32), source: Relative(32), bit_size: U1 }, JumpIf { condition: Relative(32), location: 403 }, Call { location: 539 }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(30) }, Mov { destination: Relative(30), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(12) }, Mov { destination: Relative(28), source: Relative(11) }, Jump { location: 410 }, BinaryIntOp { destination: Relative(27), op: LessThan, bit_size: U32, lhs: Relative(28), rhs: Relative(15) }, JumpIf { condition: Relative(27), location: 463 }, Jump { location: 413 }, Load { destination: Relative(27), source_pointer: Relative(9) }, Mov { destination: Direct(32771), source: Relative(27) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 561 }, Mov { destination: Relative(28), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(20) }, Store { destination_pointer: Relative(29), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(28) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 561 }, Mov { destination: Relative(27), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(21) }, Store { destination_pointer: Relative(29), source: Relative(2) }, Store { destination_pointer: Relative(9), source: Relative(27) }, Load { destination: Relative(9), source_pointer: Relative(30) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(28), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(23) }, Store { destination_pointer: Relative(29), source: Relative(22) }, Mov { destination: Direct(32771), source: Relative(28) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(25) }, Store { destination_pointer: Relative(29), source: Relative(24) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(28), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(26) }, Store { destination_pointer: Relative(29), source: Relative(14) }, Store { destination_pointer: Relative(30), source: Relative(28) }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(29) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Direct(2) }, Const { destination: Relative(30), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(27), rhs: Direct(2) }, Const { destination: Relative(32), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(29), size: Relative(30) }, scalars: HeapVector { pointer: Relative(31), size: Relative(32) }, outputs: HeapArray { pointer: Relative(33), size: 3 } }), BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(18) }, Load { destination: Relative(27), source_pointer: Relative(28) }, Store { destination_pointer: Relative(6), source: Relative(27) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(18) }, Mov { destination: Relative(7), source: Relative(9) }, Jump { location: 145 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(28) }, Load { destination: Relative(27), source_pointer: Relative(32) }, Cast { destination: Relative(32), source: Relative(27), bit_size: Integer(U128) }, Cast { destination: Relative(31), source: Relative(32), bit_size: Field }, BinaryFieldOp { destination: Relative(32), op: Sub, lhs: Relative(27), rhs: Relative(31) }, BinaryFieldOp { destination: Relative(33), op: Mul, lhs: Relative(32), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(32), op: Mul, lhs: Direct(32835), rhs: Relative(33) }, BinaryFieldOp { destination: Relative(34), op: Add, lhs: Relative(31), rhs: Relative(32) }, BinaryFieldOp { destination: Relative(32), op: Equals, lhs: Relative(27), rhs: Relative(34) }, JumpIf { condition: Relative(32), location: 476 }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(35) } }, Load { destination: Relative(27), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(32), op: Mul, bit_size: U32, lhs: Relative(28), rhs: Relative(15) }, Mov { destination: Direct(32771), source: Relative(27) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 561 }, Mov { destination: Relative(34), source: Direct(32773) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(35), rhs: Relative(32) }, Store { destination_pointer: Relative(36), source: Relative(31) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(18) }, Mov { destination: Direct(32771), source: Relative(34) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 561 }, Mov { destination: Relative(31), source: Direct(32773) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(27) }, Store { destination_pointer: Relative(35), source: Relative(33) }, Store { destination_pointer: Relative(9), source: Relative(31) }, BinaryIntOp { destination: Relative(27), op: Mul, bit_size: U32, lhs: Relative(28), rhs: Relative(13) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(27) }, Load { destination: Relative(31), source_pointer: Relative(33) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(18) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(32) }, Load { destination: Relative(33), source_pointer: Relative(35) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(15) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Relative(34) }, Load { destination: Relative(35), source_pointer: Relative(37) }, Load { destination: Relative(34), source_pointer: Relative(30) }, Mov { destination: Direct(32771), source: Relative(34) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(36), source: Direct(32773) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(37), rhs: Relative(27) }, Store { destination_pointer: Relative(38), source: Relative(31) }, Mov { destination: Direct(32771), source: Relative(36) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(27), source: Direct(32773) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(27), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(32) }, Store { destination_pointer: Relative(34), source: Relative(33) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(18) }, Mov { destination: Direct(32771), source: Relative(27) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 561 }, Mov { destination: Relative(32), source: Direct(32773) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(33), rhs: Relative(31) }, Store { destination_pointer: Relative(34), source: Relative(35) }, Store { destination_pointer: Relative(30), source: Relative(32) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(18) }, Mov { destination: Relative(28), source: Relative(27) }, Jump { location: 410 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 538 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 560 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 546 }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 565 }, Jump { location: 567 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 582 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 579 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 572 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 582 }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", @@ -87,7 +87,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__expanded.snap index 25a51e46093..e6f667e000b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__expanded.snap @@ -31,13 +31,13 @@ fn main(mut x: [Foo; 4], y: pub Field) { assert(x[3].a == 50); if y == 2 { { - let i_3771: Field = y - 1; - x[i_3771].b = [50, 51, 52]; + let i_3774: Field = y - 1; + x[i_3774].b = [50, 51, 52]; } } else { { - let i_3772: Field = y - 1; - x[i_3772].b = [100, 101, 102]; + let i_3775: Field = y - 1; + x[i_3775].b = [100, 101, 102]; } }; assert(x[2].b == [100, 101, 102]); @@ -56,39 +56,39 @@ fn main(mut x: [Foo; 4], y: pub Field) { assert(foo_parents[1].foos[1].b == [5, 6, 21]); if y == 2 { { - let i_3776: Field = y - 2; - let i_3777: Field = y - 2; - foo_parents[i_3776].foos[i_3777].b = [10, 9, 8]; + let i_3779: Field = y - 2; + let i_3780: Field = y - 2; + foo_parents[i_3779].foos[i_3780].b = [10, 9, 8]; } } else { { - let i_3778: Field = y - 2; - let i_3779: Field = y - 2; - foo_parents[i_3778].foos[i_3779].b = [20, 19, 18]; + let i_3781: Field = y - 2; + let i_3782: Field = y - 2; + foo_parents[i_3781].foos[i_3782].b = [20, 19, 18]; } }; assert(foo_parents[1].foos[1].b == [20, 19, 18]); assert(foo_parents[1].foos[1].b[2] == 18); if y == 3 { - { - let i_3780: Field = y - 2; - let i_3781: Field = y - 2; - let i_3782: Field = y - 1; - foo_parents[i_3780].foos[i_3781].b[i_3782] = 5000; - } - } else { { let i_3783: Field = y - 2; let i_3784: Field = y - 2; let i_3785: Field = y - 1; - foo_parents[i_3783].foos[i_3784].b[i_3785] = 1000; + foo_parents[i_3783].foos[i_3784].b[i_3785] = 5000; + } + } else { + { + let i_3786: Field = y - 2; + let i_3787: Field = y - 2; + let i_3788: Field = y - 1; + foo_parents[i_3786].foos[i_3787].b[i_3788] = 1000; } }; assert(foo_parents[1].foos[1].b[2] == 5000); { - let i_3786: Field = y - 2; - let i_3787: Field = y - 3; - foo_parents[i_3786].foos[i_3787].b = foo_parents[y - 2].foos[y - 2].b; + let i_3789: Field = y - 2; + let i_3790: Field = y - 3; + foo_parents[i_3789].foos[i_3790].b = foo_parents[y - 2].foos[y - 2].b; }; assert(foo_parents[1].foos[0].b == [20, 19, 5000]); } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__expanded.snap index 4e162c86da5..e07ccc57b38 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__expanded.snap @@ -32,25 +32,25 @@ fn main(y: Field) { assert(x[y].bar.inner == [109, 110, 111]); if y != 2 { { - let i_3775: Field = y - 2; - x[i_3775].a = 50; + let i_3778: Field = y - 2; + x[i_3778].a = 50; } } else { { - let i_3776: Field = y - 2; - x[i_3776].a = 100; + let i_3779: Field = y - 2; + x[i_3779].a = 100; } }; assert(x[y - 2].a == 50); if y == 2 { { - let i_3777: Field = y - 1; - x[i_3777].b = [50, 51, 52]; + let i_3780: Field = y - 1; + x[i_3780].b = [50, 51, 52]; } } else { { - let i_3778: Field = y - 1; - x[i_3778].b = [100, 101, 102]; + let i_3781: Field = y - 1; + x[i_3781].b = [100, 101, 102]; } }; assert(x[2].b == [100, 101, 102]); diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index dec23e2a2f6..23a410d6429 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -84,7 +84,7 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "pVftjqsgEH0XfvuDgeFDX2WzaWzrbkyMbVy9yU3ju9+hW6jmBkLwj5TqOcyMZzj4YNfuvHyf+vHr9sOajwc7T/0w9N+n4XZp5/420r8Pxt0FNGtExcD8DpY1koaaNVgxQU/gulbMw07z1HUOteEh9ns7dePMmnEZhor9aYfl+dDPvR2f49xOdJdXrBuvNBLhVz907tdavdE8DrVcvMBW6AAHs8NDHK8RX3itZAnegsdbW4T3yRseXT+RP4T8Ad/lU/v6qQQeUHoCsOYdQb1j0AkGJX0KoFSUwcQZpEZfRKktljAY7bOQlkMRgzJHGbDOYEhWEmyopCh7F1Z7hp2e9wwgE2lwHQoB25bKD0KrOgRRq2gQCVWiqn1bot7oGnQhhYxR8KSwQxom1lopfNgaYFOFfLwIahDaxvAiRYChrwSqqCKTFFqKEASqMgrj6yiMkMcpoppMMVgvBslFwbuQEJpCYgEeRRCjlMfwWKJFDC2JpiR/tB6vRFSLkh/2GQmHjcYJ9qDTJCnyrCZNkeU1aYoss0mXM8tt0hRZdiPtYbtJRpHnN8gP+00+RYnfqKBNZetdj33SrL3003+HdCosuIaiA/lzIn8n6JatmHIeVDHtSlExd4wn5dIxXpBt1m5XJTR/jeB2NhqF6wwaicmFA+h2rNUFPfXteejcyi62Zbz4QGg6/737O/574j7dLt11mToX9Oajgq4ftJmJ+nN1if0D", + "debug_symbols": "pVdRjqMwDL1LvvmI7SQkvcpoVNGWGSEhWjGw0qri7ut0SNpqlQiFH9wU3ovt2H5wF5f2NH8fu+Hr+iMOH3dxGru+776P/fXcTN114H/vQvoLGHHASkD9a6w4EBsnDqoSyE+oZalEgB2nsW096oWH2W/N2A6TOAxz31fiT9PPj4d+bs3wsFMz8l1ZiXa4sGXCr65v/a+leqJlGmolrmCLJsKhfsNDGm+UWvFGUwneQsBbW4QPwdcyuX8mfojxg3qmT7/nT2fwBkIAYLR+euDeGEyGwTm7MqDEJEOdZlAg3cqgQGMJA1KIQqFxRQyo9zJAvYEhm0lrwlk4V3IWKHUoZwSEFANQmoI0hUSQdqrECcA6OmEo6USmKhXvHHJpXuoaTCEFpShyraUpdkadaq0cPo4GeDnM7XiE2FfGpvCYI3Cxr9BBsiJzFAQyzCcCoDIKBZHCwX6KZE3mUmFDMZDEgrOg2NtEqgCvMBYj0T68KqlF7oaAr0viVzbgNSZrkeRunSHYLTSEu5UmS7FNavIUm7QmT7FJbPLp3KQ2OYqNckN2t9xkvdimN0ru1pvtFCV6o+OQ09a99dgnr5pzN/73ks6JBd6CcfhY0O9C+W0rob0GVcL4VFTCv8azoPFrvK8+51WF0XK14CcbW+YhvybfIWyVn1iLd3rsmlPf+p29b/NwDo7wcvp7C3fC98RtvJ7byzy23umXjwq+fvAwQ/e5+MD+AQ==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -95,7 +95,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_0.snap index dec23e2a2f6..23a410d6429 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_0.snap @@ -84,7 +84,7 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "pVftjqsgEH0XfvuDgeFDX2WzaWzrbkyMbVy9yU3ju9+hW6jmBkLwj5TqOcyMZzj4YNfuvHyf+vHr9sOajwc7T/0w9N+n4XZp5/420r8Pxt0FNGtExcD8DpY1koaaNVgxQU/gulbMw07z1HUOteEh9ns7dePMmnEZhor9aYfl+dDPvR2f49xOdJdXrBuvNBLhVz907tdavdE8DrVcvMBW6AAHs8NDHK8RX3itZAnegsdbW4T3yRseXT+RP4T8Ad/lU/v6qQQeUHoCsOYdQb1j0AkGJX0KoFSUwcQZpEZfRKktljAY7bOQlkMRgzJHGbDOYEhWEmyopCh7F1Z7hp2e9wwgE2lwHQoB25bKD0KrOgRRq2gQCVWiqn1bot7oGnQhhYxR8KSwQxom1lopfNgaYFOFfLwIahDaxvAiRYChrwSqqCKTFFqKEASqMgrj6yiMkMcpoppMMVgvBslFwbuQEJpCYgEeRRCjlMfwWKJFDC2JpiR/tB6vRFSLkh/2GQmHjcYJ9qDTJCnyrCZNkeU1aYoss0mXM8tt0hRZdiPtYbtJRpHnN8gP+00+RYnfqKBNZetdj33SrL3003+HdCosuIaiA/lzIn8n6JatmHIeVDHtSlExd4wn5dIxXpBt1m5XJTR/jeB2NhqF6wwaicmFA+h2rNUFPfXteejcyi62Zbz4QGg6/737O/574j7dLt11mToX9Oajgq4ftJmJ+nN1if0D", + "debug_symbols": "pVdRjqMwDL1LvvmI7SQkvcpoVNGWGSEhWjGw0qri7ut0SNpqlQiFH9wU3ovt2H5wF5f2NH8fu+Hr+iMOH3dxGru+776P/fXcTN114H/vQvoLGHHASkD9a6w4EBsnDqoSyE+oZalEgB2nsW096oWH2W/N2A6TOAxz31fiT9PPj4d+bs3wsFMz8l1ZiXa4sGXCr65v/a+leqJlGmolrmCLJsKhfsNDGm+UWvFGUwneQsBbW4QPwdcyuX8mfojxg3qmT7/nT2fwBkIAYLR+euDeGEyGwTm7MqDEJEOdZlAg3cqgQGMJA1KIQqFxRQyo9zJAvYEhm0lrwlk4V3IWKHUoZwSEFANQmoI0hUSQdqrECcA6OmEo6USmKhXvHHJpXuoaTCEFpShyraUpdkadaq0cPo4GeDnM7XiE2FfGpvCYI3Cxr9BBsiJzFAQyzCcCoDIKBZHCwX6KZE3mUmFDMZDEgrOg2NtEqgCvMBYj0T68KqlF7oaAr0viVzbgNSZrkeRunSHYLTSEu5UmS7FNavIUm7QmT7FJbPLp3KQ2OYqNckN2t9xkvdimN0ru1pvtFCV6o+OQ09a99dgnr5pzN/73ks6JBd6CcfhY0O9C+W0rob0GVcL4VFTCv8azoPFrvK8+51WF0XK14CcbW+YhvybfIWyVn1iLd3rsmlPf+p29b/NwDo7wcvp7C3fC98RtvJ7byzy23umXjwq+fvAwQ/e5+MD+AQ==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -95,7 +95,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index dec23e2a2f6..23a410d6429 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -84,7 +84,7 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(21), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(20), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(21), offset_address: Direct(20) }, Const { destination: Direct(2), bit_size: Field, value: 0 }, BinaryFieldOp { destination: Direct(3), op: Equals, lhs: Direct(0), rhs: Direct(2) }, JumpIf { condition: Direct(3), location: 8 }, Const { destination: Direct(1), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Direct(0), op: Div, lhs: Direct(1), rhs: Direct(0) }, Stop { return_data: HeapVector { pointer: Direct(20), size: Direct(21) } }]" ], - "debug_symbols": "pVftjqsgEH0XfvuDgeFDX2WzaWzrbkyMbVy9yU3ju9+hW6jmBkLwj5TqOcyMZzj4YNfuvHyf+vHr9sOajwc7T/0w9N+n4XZp5/420r8Pxt0FNGtExcD8DpY1koaaNVgxQU/gulbMw07z1HUOteEh9ns7dePMmnEZhor9aYfl+dDPvR2f49xOdJdXrBuvNBLhVz907tdavdE8DrVcvMBW6AAHs8NDHK8RX3itZAnegsdbW4T3yRseXT+RP4T8Ad/lU/v6qQQeUHoCsOYdQb1j0AkGJX0KoFSUwcQZpEZfRKktljAY7bOQlkMRgzJHGbDOYEhWEmyopCh7F1Z7hp2e9wwgE2lwHQoB25bKD0KrOgRRq2gQCVWiqn1bot7oGnQhhYxR8KSwQxom1lopfNgaYFOFfLwIahDaxvAiRYChrwSqqCKTFFqKEASqMgrj6yiMkMcpoppMMVgvBslFwbuQEJpCYgEeRRCjlMfwWKJFDC2JpiR/tB6vRFSLkh/2GQmHjcYJ9qDTJCnyrCZNkeU1aYoss0mXM8tt0hRZdiPtYbtJRpHnN8gP+00+RYnfqKBNZetdj33SrL3003+HdCosuIaiA/lzIn8n6JatmHIeVDHtSlExd4wn5dIxXpBt1m5XJTR/jeB2NhqF6wwaicmFA+h2rNUFPfXteejcyi62Zbz4QGg6/737O/574j7dLt11mToX9Oajgq4ftJmJ+nN1if0D", + "debug_symbols": "pVdRjqMwDL1LvvmI7SQkvcpoVNGWGSEhWjGw0qri7ut0SNpqlQiFH9wU3ovt2H5wF5f2NH8fu+Hr+iMOH3dxGru+776P/fXcTN114H/vQvoLGHHASkD9a6w4EBsnDqoSyE+oZalEgB2nsW096oWH2W/N2A6TOAxz31fiT9PPj4d+bs3wsFMz8l1ZiXa4sGXCr65v/a+leqJlGmolrmCLJsKhfsNDGm+UWvFGUwneQsBbW4QPwdcyuX8mfojxg3qmT7/nT2fwBkIAYLR+euDeGEyGwTm7MqDEJEOdZlAg3cqgQGMJA1KIQqFxRQyo9zJAvYEhm0lrwlk4V3IWKHUoZwSEFANQmoI0hUSQdqrECcA6OmEo6USmKhXvHHJpXuoaTCEFpShyraUpdkadaq0cPo4GeDnM7XiE2FfGpvCYI3Cxr9BBsiJzFAQyzCcCoDIKBZHCwX6KZE3mUmFDMZDEgrOg2NtEqgCvMBYj0T68KqlF7oaAr0viVzbgNSZrkeRunSHYLTSEu5UmS7FNavIUm7QmT7FJbPLp3KQ2OYqNckN2t9xkvdimN0ru1pvtFCV6o+OQ09a99dgnr5pzN/73ks6JBd6CcfhY0O9C+W0rob0GVcL4VFTCv8azoPFrvK8+51WF0XK14CcbW+YhvybfIWyVn1iLd3rsmlPf+p29b/NwDo7wcvp7C3fC98RtvJ7byzy23umXjwq+fvAwQ/e5+MD+AQ==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -95,7 +95,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 50fa947e174..539f28919d8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -72,7 +72,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(32841) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 388 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(13), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 354 }, Jump { location: 55 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(18), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(18) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(19), size: Relative(21) }, scalars: HeapVector { pointer: Relative(22), size: Relative(23) }, outputs: HeapArray { pointer: Relative(24), size: 3 } }), BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Load { destination: Relative(18), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(18), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 96 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(19), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 100 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 153 }, Call { location: 394 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(10), location: 284 }, Jump { location: 161 }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(8), bit_size: Field, value: 2 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Const { destination: Relative(7), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(11), source: Relative(17) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(7), size: Relative(10) }, scalars: HeapVector { pointer: Relative(11), size: Relative(12) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(7), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 219 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Relative(17) }, JumpIf { condition: Relative(4), location: 224 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Field, value: 8 }, BinaryFieldOp { destination: Relative(5), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(5), rhs: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(2), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Direct(32835), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(1), rhs: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 238 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(3) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(15) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(17) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(4), size: Relative(5) }, scalars: HeapVector { pointer: Relative(6), size: Relative(7) }, outputs: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(14) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 276 }, Call { location: 394 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(1), bit_size: Field, value: 849707701676507062560416368841861616551813265068666159965855698002224802634 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 283 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Return, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(21) }, Cast { destination: Relative(21), source: Relative(10), bit_size: Integer(U128) }, Cast { destination: Relative(19), source: Relative(21), bit_size: Field }, BinaryFieldOp { destination: Relative(21), op: Sub, lhs: Relative(10), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(21), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Direct(32835), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(19), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(10), rhs: Relative(23) }, JumpIf { condition: Relative(21), location: 297 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(21), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Store { destination_pointer: Relative(25), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(11), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(18) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Load { destination: Relative(19), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(5) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(10) }, Store { destination_pointer: Relative(27), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(5), source: Relative(21) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(17), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(16), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(17), op: Sub, lhs: Relative(15), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(17), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Direct(32835), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(19), op: Add, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(15), rhs: Relative(19) }, JumpIf { condition: Relative(17), location: 367 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, Load { destination: Relative(15), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Store { destination_pointer: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(15) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 393 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 401 }, Jump { location: 403 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 418 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 415 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 408 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 418 }, Return]" ], - "debug_symbols": "pZnBbts6EEX/xessNOSQQ/ZXHooiTd0igOEEbvKAhyL//uZqdJVkIUGVNpmjOjyRKV5yXP85/Th/f/317fH68+n36cs/f07fb4+Xy+Ovb5enh/uXx6er/+uf04AfqZ++5LtTHqJIlBQlR9EoJUqNYlFalLBoWDQsGhYNi4ZFw1L8NfXiV9VLjWJRWpQ+ljpEkSgpSo6iUcJSw1LDUsNSw2JhsbBYWCwsFhYLi4XF3FK8uKV56WNpQxSJkqLkKBqlRKlRLIpbupc+lj5EkShukcFrnqpOtUzVTSJebaptqj2qDK6TDBBCImSCEgqhEozQCH0CoVloFpqFZqFZaBaahWahWWhOMCtACImQCUoohEowQiP0CTLNmeZMc6Y505xpzjRnmjPNmWalWWlWmpVmpVlpVpoV5gpohD5BGQhCSIRMUAKGmwMSIQ2AX+6ATFBCIVSCERqhT4CMBAiBZqPZaDaajWajGZlJA8DNCUsUuQkQQiJkghIKoRKM0Ag0d5o7zZ3mTnOnudPcae40d5r7ZE7DQBBCIsCcAEoohEowQiP0CRCrACEkAswZoASYFVAJRmgEmH2zSohVgBASIRNgroBCgNkAMDcAdnWYx9MBMJ4PGD6eEBg1nhEYNZ4SGDWeEx1QCJVgBDfrAOgTIFYBQkiETFBCIVSCmxVTh1gF9AkQqwAhJEImKKEQKoFmJE4xCTiRRsCZFCCERMgEJRRCJRgBZswqMjgCMqiYKGQwIBEyQQmFUAlGcHPB/CCDIyCDAUJIBBcWLGxEL6AScAzixhC9AAixABC9ggWA6BUsAESv4K8jehVmRC+gECoBZkwvolfxtxA9QEb0AoSQCJmghEKoBCM0As1Cs9AsNAvNQjOiVxOgEozQCH0CRC9ACImQCUqgOdGcaEb06tiC9QkQvQAhJEImKKEQKsEINGealWalWWlWmpVmpVlpVpqVZqW50FxoRtCqAgqhEuBpgEaAp6PXdI8NAPcYHgqCZpgoBM3GflQJhVAJMBeAmw1/C0EbAUELEEIiZIISCqESjECz0dxobjQ3mhvNjeY2mt/e7k5szb+93M5ndOYfenXv4J/vb+fry+nL9fVyuTv9e395HX/p9/P9dawv9zd/1afqfP3h1YU/Hy9n0Nvd++hheah3jdNg73Tm4eXzeFkZ710QBX5izwbpnwxpxZCb0ZBb22NQeX8TkvcYSqs01LJoKMsG34f4LnxzqXvuoWITne6hlyWDLRu0dJ0MWj88Tan7DHnJsLaeyrwcqi2tp7XxTTj+wxxsH5/QG4/j/ZhdXM8rj8GbOj4Gb+uGpcewqhD0TKHw1nmXIums8PW0qDi+Ilfvwg+f+S5y2qXQzmR5Z7bvLlTnu9AiuxRV35dFtX2KnGaFln0KYzi8v8vHFYvTuRaQxoR7e7UjYFnmVZV1x3hN8w6T87HxumeD0TneanvevzaOL2lxg0n98ImZ1zdZHvlSyrJi5dz2/omh8jZpcY/KK2uxza1D+7gS7bMgLwuq8lF+OnP/QjAfFvVj4/A3As6jDct3sDaNVvkwvQOUXU/Cih1WaN+iWF1S88Hp/w21c1VuaqJUDp9Zq3exrY3SfLiP2q7Y00iVOZ/FFvc5rYf3GbXjT7QdfqLbJqL1XR1dNp27mLavi8mlviuWPx+kwxtuyQc33KIHN9xVwZYNd12wYcNdncZtG+66YtOGu67YtOGuL6k5nr669jWDOswfVTT1fXfR57vQYdfH1qLvB0fZZ9jUzdRyOFy1HgxXtYPhWhVsCde6YEO4VqdxW7jWFZvCta7YFK60r5n56lf3D4+3T1+Kv8F1e7z/fjlPlz9frw8fXn3575mv8Ev159vTw/nH6+0M0/s36/7jn9ztTqV9xbequGztznOGSxlfVb+sX99wM/8D", + "debug_symbols": "pZnRbts4EEX/xc950JDDIdlfKYrCSZzCgOEEbrLAIsi/L69GV0kWkCBQL5mjOjxWKF5yXL8fHk/3b39+n69Pz38PP36+H+5v58vl/Of35fnh+Hp+vrZ/fT8M+BHq4Ue8O8TBi3gJXqIX9ZK8mJfspXhxi7pF3aJuUbeoW9Qtqb2mrbQra8W8ZC/FSx2LDV7ES/ASvagXt5hbzC3mFnNLdkt2S3ZLdkt2S3ZLdktultRKs5RW6ljK4EW8BC/Ri3pJXsxL9tIstZU6ljp4ES/NIkOrcao61TTVZhJpNU+1TLV6laHpJAKEEAiRoIREMEImFEKdQGgWmoVmoVloFpqFZqFZaBaaA8wKEEIgRIISEsEImVAIdYJIc6Q50hxpjjRHmiPNkeZIc6RZaVaalWalWWlWmpVmhdkAhVAnSANBCIEQCUrA8NwAiZACwC9XQCQoIRGMkAmFUCdARhyEQHOmOdOcac40Z5qRmTAAmjlgiSI3DkIIhEhQQiIYIRMKgeZKc6W50lxprjRXmivNleZKc53MYRgIQggEmANACYlghEwohDoBYuUghECAOQKUALMCjJAJhQBz26wCYuUghECIBJgNkAgwZwDMBYBdHebxdACM5wOGjycERo1nBEaNpwRGjedEBSSCETKhmXUA1AkQKwchBEIkKCERjNDMiqlDrBzqBIiVgxACIRKUkAhGoBmJU0wCTqQRcCY5CCEQIkEJiWCETIAZs4oMjoAMKiYKGXQIhEhQQiIYIROaOWF+kMERkEEHIQRCEyYsbETPwQg4BnFjiJ4DhFgAiF7CAkD0EhYAopfw7oiewYzoOSSCEWDG9CJ6hvdC9AAR0XMQQiBEghISwQiZUAg0C81Cs9AsNAvNiJ4FgBEyoRDqBIiegxACIRKUQHOgOdCM6NnYgtUJED0HIQRCJCghEYyQCTRHmpVmpVlpVpqVZqVZaVaalWalOdGcaEbQTAGJYAR4CqAQ4KnoNZsnD4DmyXgoCFrGRCFoeexHlZAIRoA5AZo5470QtBEQNAchBEIkKCERjJAJNGeaC82F5kJzobnQXEbzx8fdga3579fb6YTO/Euv3jr4l+PtdH09/Li+XS53h3+Ol7fxl/6+HK9jfT3e2qttqk7Xx1ab8Ol8OYE+7j5HD8tDW9c4DW6dzjw8fR8vK+MN3agLLKXZIPWbIawYCjYYN5RkXYYyzIYiHYZ2kutkaKfyoiEtG2KK/CvaOtaeexCcxtM9WFwy5GWDtjeeDGpfnqZYnyEuGdbWU4rzcshL62ltfJmXU00d4wN6Y59EK4vree0xpM/HkEJZegyrChvifBMauhRZZkUuw6Ji/4pcv4taeRdlGLoU1eZk1dx3F3WY76K2cR2KdvAb56J9/OtTDMOskNinUJkVVfYrFqdzLSCFz6O1Vx0Bi8J4tPajY7yGeYeJcd947dlgNHExae75+7Vw/Nfd4X/jQ919Ysa1TbLWeZcbwrJi5dxWmUOl7f8dFhUra7HMrUMJX47t/F0QlwWmfJSWYpdgPiyslD4BM52H5TtYm8YQeQvaPs51PYkQ0m7FHMpVxeqSKjYfvLVrVW5solR2n1mrd7GtjdK4u4/aruhppNK80ae8uM+p7d5nNO9/omX3E902EaV2dXRFw9zFpL4upsynTlMsfz4IuzfcFHduuHhiuzbcVcGWDXddsGHDXZ3GbRvuumLThruu2LThri+pOZ5tdUmfIs9bXam5T2Gfd5G7PrYOc2vdepEew8ZuxtLucJntDJflneFaFWwJ17pgQ7hWp3FbuNYVm8K1rtgUrtDXzPxqV8eH8+3bl+IfcN3Ox/vLabp8ers+fHn19d8XvsIv1V9uzw+nx7fbCabPb9bbj5+x5juV8gvfquKylLtYIy5lfFXbpf36wM38Bw==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -83,7 +83,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_0.snap index 50fa947e174..539f28919d8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_0.snap @@ -72,7 +72,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(32841) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 388 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(13), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 354 }, Jump { location: 55 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(18), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(18) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(19), size: Relative(21) }, scalars: HeapVector { pointer: Relative(22), size: Relative(23) }, outputs: HeapArray { pointer: Relative(24), size: 3 } }), BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Load { destination: Relative(18), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(18), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 96 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(19), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 100 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 153 }, Call { location: 394 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(10), location: 284 }, Jump { location: 161 }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(8), bit_size: Field, value: 2 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Const { destination: Relative(7), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(11), source: Relative(17) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(7), size: Relative(10) }, scalars: HeapVector { pointer: Relative(11), size: Relative(12) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(7), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 219 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Relative(17) }, JumpIf { condition: Relative(4), location: 224 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Field, value: 8 }, BinaryFieldOp { destination: Relative(5), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(5), rhs: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(2), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Direct(32835), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(1), rhs: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 238 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(3) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(15) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(17) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(4), size: Relative(5) }, scalars: HeapVector { pointer: Relative(6), size: Relative(7) }, outputs: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(14) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 276 }, Call { location: 394 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(1), bit_size: Field, value: 849707701676507062560416368841861616551813265068666159965855698002224802634 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 283 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Return, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(21) }, Cast { destination: Relative(21), source: Relative(10), bit_size: Integer(U128) }, Cast { destination: Relative(19), source: Relative(21), bit_size: Field }, BinaryFieldOp { destination: Relative(21), op: Sub, lhs: Relative(10), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(21), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Direct(32835), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(19), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(10), rhs: Relative(23) }, JumpIf { condition: Relative(21), location: 297 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(21), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Store { destination_pointer: Relative(25), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(11), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(18) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Load { destination: Relative(19), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(5) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(10) }, Store { destination_pointer: Relative(27), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(5), source: Relative(21) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(17), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(16), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(17), op: Sub, lhs: Relative(15), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(17), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Direct(32835), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(19), op: Add, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(15), rhs: Relative(19) }, JumpIf { condition: Relative(17), location: 367 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, Load { destination: Relative(15), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Store { destination_pointer: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(15) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 393 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 401 }, Jump { location: 403 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 418 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 415 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 408 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 418 }, Return]" ], - "debug_symbols": "pZnBbts6EEX/xessNOSQQ/ZXHooiTd0igOEEbvKAhyL//uZqdJVkIUGVNpmjOjyRKV5yXP85/Th/f/317fH68+n36cs/f07fb4+Xy+Ovb5enh/uXx6er/+uf04AfqZ++5LtTHqJIlBQlR9EoJUqNYlFalLBoWDQsGhYNi4ZFw1L8NfXiV9VLjWJRWpQ+ljpEkSgpSo6iUcJSw1LDUsNSw2JhsbBYWCwsFhYLi4XF3FK8uKV56WNpQxSJkqLkKBqlRKlRLIpbupc+lj5EkShukcFrnqpOtUzVTSJebaptqj2qDK6TDBBCImSCEgqhEozQCH0CoVloFpqFZqFZaBaahWahWWhOMCtACImQCUoohEowQiP0CTLNmeZMc6Y505xpzjRnmjPNmWalWWlWmpVmpVlpVpoV5gpohD5BGQhCSIRMUAKGmwMSIQ2AX+6ATFBCIVSCERqhT4CMBAiBZqPZaDaajWajGZlJA8DNCUsUuQkQQiJkghIKoRKM0Ag0d5o7zZ3mTnOnudPcae40d5r7ZE7DQBBCIsCcAEoohEowQiP0CRCrACEkAswZoASYFVAJRmgEmH2zSohVgBASIRNgroBCgNkAMDcAdnWYx9MBMJ4PGD6eEBg1nhEYNZ4SGDWeEx1QCJVgBDfrAOgTIFYBQkiETFBCIVSCmxVTh1gF9AkQqwAhJEImKKEQKoFmJE4xCTiRRsCZFCCERMgEJRRCJRgBZswqMjgCMqiYKGQwIBEyQQmFUAlGcHPB/CCDIyCDAUJIBBcWLGxEL6AScAzixhC9AAixABC9ggWA6BUsAESv4K8jehVmRC+gECoBZkwvolfxtxA9QEb0AoSQCJmghEKoBCM0As1Cs9AsNAvNQjOiVxOgEozQCH0CRC9ACImQCUqgOdGcaEb06tiC9QkQvQAhJEImKKEQKsEINGealWalWWlWmpVmpVlpVpqVZqW50FxoRtCqAgqhEuBpgEaAp6PXdI8NAPcYHgqCZpgoBM3GflQJhVAJMBeAmw1/C0EbAUELEEIiZIISCqESjECz0dxobjQ3mhvNjeY2mt/e7k5szb+93M5ndOYfenXv4J/vb+fry+nL9fVyuTv9e395HX/p9/P9dawv9zd/1afqfP3h1YU/Hy9n0Nvd++hheah3jdNg73Tm4eXzeFkZ710QBX5izwbpnwxpxZCb0ZBb22NQeX8TkvcYSqs01LJoKMsG34f4LnxzqXvuoWITne6hlyWDLRu0dJ0MWj88Tan7DHnJsLaeyrwcqi2tp7XxTTj+wxxsH5/QG4/j/ZhdXM8rj8GbOj4Gb+uGpcewqhD0TKHw1nmXIums8PW0qDi+Ilfvwg+f+S5y2qXQzmR5Z7bvLlTnu9AiuxRV35dFtX2KnGaFln0KYzi8v8vHFYvTuRaQxoR7e7UjYFnmVZV1x3hN8w6T87HxumeD0TneanvevzaOL2lxg0n98ImZ1zdZHvlSyrJi5dz2/omh8jZpcY/KK2uxza1D+7gS7bMgLwuq8lF+OnP/QjAfFvVj4/A3As6jDct3sDaNVvkwvQOUXU/Cih1WaN+iWF1S88Hp/w21c1VuaqJUDp9Zq3exrY3SfLiP2q7Y00iVOZ/FFvc5rYf3GbXjT7QdfqLbJqL1XR1dNp27mLavi8mlviuWPx+kwxtuyQc33KIHN9xVwZYNd12wYcNdncZtG+66YtOGu67YtOGuL6k5nr669jWDOswfVTT1fXfR57vQYdfH1qLvB0fZZ9jUzdRyOFy1HgxXtYPhWhVsCde6YEO4VqdxW7jWFZvCta7YFK60r5n56lf3D4+3T1+Kv8F1e7z/fjlPlz9frw8fXn3575mv8Ev159vTw/nH6+0M0/s36/7jn9ztTqV9xbequGztznOGSxlfVb+sX99wM/8D", + "debug_symbols": "pZnRbts4EEX/xc950JDDIdlfKYrCSZzCgOEEbrLAIsi/L69GV0kWkCBQL5mjOjxWKF5yXL8fHk/3b39+n69Pz38PP36+H+5v58vl/Of35fnh+Hp+vrZ/fT8M+BHq4Ue8O8TBi3gJXqIX9ZK8mJfspXhxi7pF3aJuUbeoW9Qtqb2mrbQra8W8ZC/FSx2LDV7ES/ASvagXt5hbzC3mFnNLdkt2S3ZLdkt2S3ZLdktultRKs5RW6ljK4EW8BC/Ri3pJXsxL9tIstZU6ljp4ES/NIkOrcao61TTVZhJpNU+1TLV6laHpJAKEEAiRoIREMEImFEKdQGgWmoVmoVloFpqFZqFZaBaaA8wKEEIgRIISEsEImVAIdYJIc6Q50hxpjjRHmiPNkeZIc6RZaVaalWalWWlWmpVmhdkAhVAnSANBCIEQCUrA8NwAiZACwC9XQCQoIRGMkAmFUCdARhyEQHOmOdOcac40Z5qRmTAAmjlgiSI3DkIIhEhQQiIYIRMKgeZKc6W50lxprjRXmivNleZKc53MYRgIQggEmANACYlghEwohDoBYuUghECAOQKUALMCjJAJhQBz26wCYuUghECIBJgNkAgwZwDMBYBdHebxdACM5wOGjycERo1nBEaNpwRGjedEBSSCETKhmXUA1AkQKwchBEIkKCERjNDMiqlDrBzqBIiVgxACIRKUkAhGoBmJU0wCTqQRcCY5CCEQIkEJiWCETIAZs4oMjoAMKiYKGXQIhEhQQiIYIROaOWF+kMERkEEHIQRCEyYsbETPwQg4BnFjiJ4DhFgAiF7CAkD0EhYAopfw7oiewYzoOSSCEWDG9CJ6hvdC9AAR0XMQQiBEghISwQiZUAg0C81Cs9AsNAvNiJ4FgBEyoRDqBIiegxACIRKUQHOgOdCM6NnYgtUJED0HIQRCJCghEYyQCTRHmpVmpVlpVpqVZqVZaVaalWalOdGcaEbQTAGJYAR4CqAQ4KnoNZsnD4DmyXgoCFrGRCFoeexHlZAIRoA5AZo5470QtBEQNAchBEIkKCERjJAJNGeaC82F5kJzobnQXEbzx8fdga3579fb6YTO/Euv3jr4l+PtdH09/Li+XS53h3+Ol7fxl/6+HK9jfT3e2qttqk7Xx1ab8Ol8OYE+7j5HD8tDW9c4DW6dzjw8fR8vK+MN3agLLKXZIPWbIawYCjYYN5RkXYYyzIYiHYZ2kutkaKfyoiEtG2KK/CvaOtaeexCcxtM9WFwy5GWDtjeeDGpfnqZYnyEuGdbWU4rzcshL62ltfJmXU00d4wN6Y59EK4vree0xpM/HkEJZegyrChvifBMauhRZZkUuw6Ji/4pcv4taeRdlGLoU1eZk1dx3F3WY76K2cR2KdvAb56J9/OtTDMOskNinUJkVVfYrFqdzLSCFz6O1Vx0Bi8J4tPajY7yGeYeJcd947dlgNHExae75+7Vw/Nfd4X/jQ919Ysa1TbLWeZcbwrJi5dxWmUOl7f8dFhUra7HMrUMJX47t/F0QlwWmfJSWYpdgPiyslD4BM52H5TtYm8YQeQvaPs51PYkQ0m7FHMpVxeqSKjYfvLVrVW5solR2n1mrd7GtjdK4u4/aruhppNK80ae8uM+p7d5nNO9/omX3E902EaV2dXRFw9zFpL4upsynTlMsfz4IuzfcFHduuHhiuzbcVcGWDXddsGHDXZ3GbRvuumLThruu2LThri+pOZ5tdUmfIs9bXam5T2Gfd5G7PrYOc2vdepEew8ZuxtLucJntDJflneFaFWwJ17pgQ7hWp3FbuNYVm8K1rtgUrtDXzPxqV8eH8+3bl+IfcN3Ox/vLabp8ers+fHn19d8XvsIv1V9uzw+nx7fbCabPb9bbj5+x5juV8gvfquKylLtYIy5lfFXbpf36wM38Bw==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -83,7 +83,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 50fa947e174..539f28919d8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -72,7 +72,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(32841) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 388 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(13), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 354 }, Jump { location: 55 }, Const { destination: Relative(15), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(18), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(19), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(20), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(20), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(16) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(18) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(19) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(19), size: Relative(21) }, scalars: HeapVector { pointer: Relative(22), size: Relative(23) }, outputs: HeapArray { pointer: Relative(24), size: 3 } }), BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Load { destination: Relative(18), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(18), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 96 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(19), rhs: Relative(5) }, JumpIf { condition: Relative(11), location: 100 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(11) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(9) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 153 }, Call { location: 394 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(10), location: 284 }, Jump { location: 161 }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(8), bit_size: Field, value: 2 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Const { destination: Relative(7), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(11), source: Relative(17) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(7), size: Relative(10) }, scalars: HeapVector { pointer: Relative(11), size: Relative(12) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(7), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 219 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Relative(17) }, JumpIf { condition: Relative(4), location: 224 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Field, value: 8 }, BinaryFieldOp { destination: Relative(5), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(5), rhs: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Cast { destination: Relative(3), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(1), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(2), rhs: Relative(1) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Direct(32835), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(5), op: Add, lhs: Relative(1), rhs: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(3), location: 238 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(3) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(15) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(17) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(4), size: Relative(5) }, scalars: HeapVector { pointer: Relative(6), size: Relative(7) }, outputs: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(14) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 276 }, Call { location: 394 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Const { destination: Relative(1), bit_size: Field, value: 849707701676507062560416368841861616551813265068666159965855698002224802634 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(3), location: 283 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, Return, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(21) }, Cast { destination: Relative(21), source: Relative(10), bit_size: Integer(U128) }, Cast { destination: Relative(19), source: Relative(21), bit_size: Field }, BinaryFieldOp { destination: Relative(21), op: Sub, lhs: Relative(10), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(21), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Direct(32835), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(19), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(10), rhs: Relative(23) }, JumpIf { condition: Relative(21), location: 297 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(21), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Store { destination_pointer: Relative(25), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(11), source: Relative(19) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(18) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(10) }, Load { destination: Relative(19), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(5) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(10) }, Store { destination_pointer: Relative(27), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 397 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(19) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(5), source: Relative(21) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(17), source: Relative(15), bit_size: Integer(U128) }, Cast { destination: Relative(16), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(17), op: Sub, lhs: Relative(15), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(17), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Direct(32835), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(19), op: Add, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(15), rhs: Relative(19) }, JumpIf { condition: Relative(17), location: 367 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, Load { destination: Relative(15), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Store { destination_pointer: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 397 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Store { destination_pointer: Relative(20), source: Relative(18) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(14) }, Mov { destination: Relative(7), source: Relative(15) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 393 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 401 }, Jump { location: 403 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 418 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 415 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 408 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 418 }, Return]" ], - "debug_symbols": "pZnBbts6EEX/xessNOSQQ/ZXHooiTd0igOEEbvKAhyL//uZqdJVkIUGVNpmjOjyRKV5yXP85/Th/f/317fH68+n36cs/f07fb4+Xy+Ovb5enh/uXx6er/+uf04AfqZ++5LtTHqJIlBQlR9EoJUqNYlFalLBoWDQsGhYNi4ZFw1L8NfXiV9VLjWJRWpQ+ljpEkSgpSo6iUcJSw1LDUsNSw2JhsbBYWCwsFhYLi4XF3FK8uKV56WNpQxSJkqLkKBqlRKlRLIpbupc+lj5EkShukcFrnqpOtUzVTSJebaptqj2qDK6TDBBCImSCEgqhEozQCH0CoVloFpqFZqFZaBaahWahWWhOMCtACImQCUoohEowQiP0CTLNmeZMc6Y505xpzjRnmjPNmWalWWlWmpVmpVlpVpoV5gpohD5BGQhCSIRMUAKGmwMSIQ2AX+6ATFBCIVSCERqhT4CMBAiBZqPZaDaajWajGZlJA8DNCUsUuQkQQiJkghIKoRKM0Ag0d5o7zZ3mTnOnudPcae40d5r7ZE7DQBBCIsCcAEoohEowQiP0CRCrACEkAswZoASYFVAJRmgEmH2zSohVgBASIRNgroBCgNkAMDcAdnWYx9MBMJ4PGD6eEBg1nhEYNZ4SGDWeEx1QCJVgBDfrAOgTIFYBQkiETFBCIVSCmxVTh1gF9AkQqwAhJEImKKEQKoFmJE4xCTiRRsCZFCCERMgEJRRCJRgBZswqMjgCMqiYKGQwIBEyQQmFUAlGcHPB/CCDIyCDAUJIBBcWLGxEL6AScAzixhC9AAixABC9ggWA6BUsAESv4K8jehVmRC+gECoBZkwvolfxtxA9QEb0AoSQCJmghEKoBCM0As1Cs9AsNAvNQjOiVxOgEozQCH0CRC9ACImQCUqgOdGcaEb06tiC9QkQvQAhJEImKKEQKsEINGealWalWWlWmpVmpVlpVpqVZqW50FxoRtCqAgqhEuBpgEaAp6PXdI8NAPcYHgqCZpgoBM3GflQJhVAJMBeAmw1/C0EbAUELEEIiZIISCqESjECz0dxobjQ3mhvNjeY2mt/e7k5szb+93M5ndOYfenXv4J/vb+fry+nL9fVyuTv9e395HX/p9/P9dawv9zd/1afqfP3h1YU/Hy9n0Nvd++hheah3jdNg73Tm4eXzeFkZ710QBX5izwbpnwxpxZCb0ZBb22NQeX8TkvcYSqs01LJoKMsG34f4LnxzqXvuoWITne6hlyWDLRu0dJ0MWj88Tan7DHnJsLaeyrwcqi2tp7XxTTj+wxxsH5/QG4/j/ZhdXM8rj8GbOj4Gb+uGpcewqhD0TKHw1nmXIums8PW0qDi+Ilfvwg+f+S5y2qXQzmR5Z7bvLlTnu9AiuxRV35dFtX2KnGaFln0KYzi8v8vHFYvTuRaQxoR7e7UjYFnmVZV1x3hN8w6T87HxumeD0TneanvevzaOL2lxg0n98ImZ1zdZHvlSyrJi5dz2/omh8jZpcY/KK2uxza1D+7gS7bMgLwuq8lF+OnP/QjAfFvVj4/A3As6jDct3sDaNVvkwvQOUXU/Cih1WaN+iWF1S88Hp/w21c1VuaqJUDp9Zq3exrY3SfLiP2q7Y00iVOZ/FFvc5rYf3GbXjT7QdfqLbJqL1XR1dNp27mLavi8mlviuWPx+kwxtuyQc33KIHN9xVwZYNd12wYcNdncZtG+66YtOGu67YtOGuL6k5nr669jWDOswfVTT1fXfR57vQYdfH1qLvB0fZZ9jUzdRyOFy1HgxXtYPhWhVsCde6YEO4VqdxW7jWFZvCta7YFK60r5n56lf3D4+3T1+Kv8F1e7z/fjlPlz9frw8fXn3575mv8Ev159vTw/nH6+0M0/s36/7jn9ztTqV9xbequGztznOGSxlfVb+sX99wM/8D", + "debug_symbols": "pZnRbts4EEX/xc950JDDIdlfKYrCSZzCgOEEbrLAIsi/L69GV0kWkCBQL5mjOjxWKF5yXL8fHk/3b39+n69Pz38PP36+H+5v58vl/Of35fnh+Hp+vrZ/fT8M+BHq4Ue8O8TBi3gJXqIX9ZK8mJfspXhxi7pF3aJuUbeoW9Qtqb2mrbQra8W8ZC/FSx2LDV7ES/ASvagXt5hbzC3mFnNLdkt2S3ZLdkt2S3ZLdktultRKs5RW6ljK4EW8BC/Ri3pJXsxL9tIstZU6ljp4ES/NIkOrcao61TTVZhJpNU+1TLV6laHpJAKEEAiRoIREMEImFEKdQGgWmoVmoVloFpqFZqFZaBaaA8wKEEIgRIISEsEImVAIdYJIc6Q50hxpjjRHmiPNkeZIc6RZaVaalWalWWlWmpVmhdkAhVAnSANBCIEQCUrA8NwAiZACwC9XQCQoIRGMkAmFUCdARhyEQHOmOdOcac40Z5qRmTAAmjlgiSI3DkIIhEhQQiIYIRMKgeZKc6W50lxprjRXmivNleZKc53MYRgIQggEmANACYlghEwohDoBYuUghECAOQKUALMCjJAJhQBz26wCYuUghECIBJgNkAgwZwDMBYBdHebxdACM5wOGjycERo1nBEaNpwRGjedEBSSCETKhmXUA1AkQKwchBEIkKCERjNDMiqlDrBzqBIiVgxACIRKUkAhGoBmJU0wCTqQRcCY5CCEQIkEJiWCETIAZs4oMjoAMKiYKGXQIhEhQQiIYIROaOWF+kMERkEEHIQRCEyYsbETPwQg4BnFjiJ4DhFgAiF7CAkD0EhYAopfw7oiewYzoOSSCEWDG9CJ6hvdC9AAR0XMQQiBEghISwQiZUAg0C81Cs9AsNAvNiJ4FgBEyoRDqBIiegxACIRKUQHOgOdCM6NnYgtUJED0HIQRCJCghEYyQCTRHmpVmpVlpVpqVZqVZaVaalWalOdGcaEbQTAGJYAR4CqAQ4KnoNZsnD4DmyXgoCFrGRCFoeexHlZAIRoA5AZo5470QtBEQNAchBEIkKCERjJAJNGeaC82F5kJzobnQXEbzx8fdga3579fb6YTO/Euv3jr4l+PtdH09/Li+XS53h3+Ol7fxl/6+HK9jfT3e2qttqk7Xx1ab8Ol8OYE+7j5HD8tDW9c4DW6dzjw8fR8vK+MN3agLLKXZIPWbIawYCjYYN5RkXYYyzIYiHYZ2kutkaKfyoiEtG2KK/CvaOtaeexCcxtM9WFwy5GWDtjeeDGpfnqZYnyEuGdbWU4rzcshL62ltfJmXU00d4wN6Y59EK4vree0xpM/HkEJZegyrChvifBMauhRZZkUuw6Ji/4pcv4taeRdlGLoU1eZk1dx3F3WY76K2cR2KdvAb56J9/OtTDMOskNinUJkVVfYrFqdzLSCFz6O1Vx0Bi8J4tPajY7yGeYeJcd947dlgNHExae75+7Vw/Nfd4X/jQ919Ysa1TbLWeZcbwrJi5dxWmUOl7f8dFhUra7HMrUMJX47t/F0QlwWmfJSWYpdgPiyslD4BM52H5TtYm8YQeQvaPs51PYkQ0m7FHMpVxeqSKjYfvLVrVW5solR2n1mrd7GtjdK4u4/aruhppNK80ae8uM+p7d5nNO9/omX3E902EaV2dXRFw9zFpL4upsynTlMsfz4IuzfcFHduuHhiuzbcVcGWDXddsGHDXZ3GbRvuumLThruu2LThri+pOZ5tdUmfIs9bXam5T2Gfd5G7PrYOc2vdepEew8ZuxtLucJntDJflneFaFWwJ17pgQ7hWp3FbuNYVm8K1rtgUrtDXzPxqV8eH8+3bl+IfcN3Ox/vLabp8ers+fHn19d8XvsIv1V9uzw+nx7fbCabPb9bbj5+x5juV8gvfquKylLtYIy5lfFXbpf36wM38Bw==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -83,7 +83,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index e1dbe75f74f..af33924725b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -75,7 +75,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 14 }, Call { location: 15 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(3), size: Relative(4) } }, Return, Call { location: 24 }, Cast { destination: Relative(3), source: Relative(1), bit_size: Integer(U128) }, Cast { destination: Relative(2), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(1), rhs: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(4) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 29 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTLroIwEIbfZdZddHovr2KMQa2GpAFS4SQnhnc/LVqEBcRwNpSh/b+50JknXN25v5+q+tY8oDg84Rwq76v7yTeXsquaOn59Ak0PVFAwAqhfi4GCx8VCIQiweEIMA4EsO3XBuaSacSK9LYOrOyjq3nsCP6Xvx0OPtqzHtStD3KUEXH2NawTeKu/S20A+arouNZS9xYapSY56ocd1vRLirVeS79EbzHpjdulz8pqu+t/IH2X2j8ZOermsn9zQo+AZgEZ/IrALgtqKgOcUUMpVgl4ncCVyElwZsYegVc6CG4q7CFL/lyDsF4TNSqKZKsn2/QujMmFxn5cE5BtpUDUVAuct9X0QStopCCtXg9i4lULa3JZCic9YQLUTwdcQG63FqHwD2CwE+fVoYtONYpYt9MdolZcqLIcuxhkWJ2tqRAJ8NMTLkClsAio1OQE9ljL5DVV59i6JE76vL5kVze63zTt5xLehubhrH1zyO5vz8XlggjB7HFJsfw==", + "debug_symbols": "pZTLroMgEIbfhTULZrgIvkrTNLaljQlRQ/UkJ43vfsCKrQtM49k4jvB/cwHnSa72PNxPdXNrH6Q8PMnZ187V95NrL1Vft034+iQsPkCREimB4mU0KXkwhpSCEgw7xDhSkmSn3lsbVR+cQO8qb5uelM3gHCU/lRumTY+uaibbVz6sMkpscw02AG+1s/FtpG81y0s1w1msUS1yKFZ6yOuVELNeSb5HryHptd6lT8UXLBt/o36QKT5os+jlun9yQ69gASgp3xmYFUFtEIzRMwEZZglFniCAmZkgQOIeAvJUhUBldhFQ/pcAxReEzU5qlc7CmD1ngUym64yAkCMAzyO45KkRXBqxJwnAYklC8WwSG7dShMipl0q8xwKonQieQ7DNZqYyPlKQX48mlEsbDK70x+BVl9qvhy6EGRYma0gx3GU+OeLlyJg2JSr+5JQUUytjXF9XZ2ejOOKH5pJYwe1/u7SSRnzn24u9Dt7GuB9zPjwPKCia4xhz+wM=", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -86,7 +86,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_0.snap index e1dbe75f74f..af33924725b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_0.snap @@ -75,7 +75,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 14 }, Call { location: 15 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(3), size: Relative(4) } }, Return, Call { location: 24 }, Cast { destination: Relative(3), source: Relative(1), bit_size: Integer(U128) }, Cast { destination: Relative(2), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(1), rhs: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(4) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 29 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTLroIwEIbfZdZddHovr2KMQa2GpAFS4SQnhnc/LVqEBcRwNpSh/b+50JknXN25v5+q+tY8oDg84Rwq76v7yTeXsquaOn59Ak0PVFAwAqhfi4GCx8VCIQiweEIMA4EsO3XBuaSacSK9LYOrOyjq3nsCP6Xvx0OPtqzHtStD3KUEXH2NawTeKu/S20A+arouNZS9xYapSY56ocd1vRLirVeS79EbzHpjdulz8pqu+t/IH2X2j8ZOermsn9zQo+AZgEZ/IrALgtqKgOcUUMpVgl4ncCVyElwZsYegVc6CG4q7CFL/lyDsF4TNSqKZKsn2/QujMmFxn5cE5BtpUDUVAuct9X0QStopCCtXg9i4lULa3JZCic9YQLUTwdcQG63FqHwD2CwE+fVoYtONYpYt9MdolZcqLIcuxhkWJ2tqRAJ8NMTLkClsAio1OQE9ljL5DVV59i6JE76vL5kVze63zTt5xLehubhrH1zyO5vz8XlggjB7HFJsfw==", + "debug_symbols": "pZTLroMgEIbfhTULZrgIvkrTNLaljQlRQ/UkJ43vfsCKrQtM49k4jvB/cwHnSa72PNxPdXNrH6Q8PMnZ187V95NrL1Vft034+iQsPkCREimB4mU0KXkwhpSCEgw7xDhSkmSn3lsbVR+cQO8qb5uelM3gHCU/lRumTY+uaibbVz6sMkpscw02AG+1s/FtpG81y0s1w1msUS1yKFZ6yOuVELNeSb5HryHptd6lT8UXLBt/o36QKT5os+jlun9yQ69gASgp3xmYFUFtEIzRMwEZZglFniCAmZkgQOIeAvJUhUBldhFQ/pcAxReEzU5qlc7CmD1ngUym64yAkCMAzyO45KkRXBqxJwnAYklC8WwSG7dShMipl0q8xwKonQieQ7DNZqYyPlKQX48mlEsbDK70x+BVl9qvhy6EGRYma0gx3GU+OeLlyJg2JSr+5JQUUytjXF9XZ2ejOOKH5pJYwe1/u7SSRnzn24u9Dt7GuB9zPjwPKCia4xhz+wM=", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -86,7 +86,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index e1dbe75f74f..af33924725b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -75,7 +75,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 14 }, Call { location: 15 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(3), size: Relative(4) } }, Return, Call { location: 24 }, Cast { destination: Relative(3), source: Relative(1), bit_size: Integer(U128) }, Cast { destination: Relative(2), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(1), rhs: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(4) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 29 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTLroIwEIbfZdZddHovr2KMQa2GpAFS4SQnhnc/LVqEBcRwNpSh/b+50JknXN25v5+q+tY8oDg84Rwq76v7yTeXsquaOn59Ak0PVFAwAqhfi4GCx8VCIQiweEIMA4EsO3XBuaSacSK9LYOrOyjq3nsCP6Xvx0OPtqzHtStD3KUEXH2NawTeKu/S20A+arouNZS9xYapSY56ocd1vRLirVeS79EbzHpjdulz8pqu+t/IH2X2j8ZOermsn9zQo+AZgEZ/IrALgtqKgOcUUMpVgl4ncCVyElwZsYegVc6CG4q7CFL/lyDsF4TNSqKZKsn2/QujMmFxn5cE5BtpUDUVAuct9X0QStopCCtXg9i4lULa3JZCic9YQLUTwdcQG63FqHwD2CwE+fVoYtONYpYt9MdolZcqLIcuxhkWJ2tqRAJ8NMTLkClsAio1OQE9ljL5DVV59i6JE76vL5kVze63zTt5xLehubhrH1zyO5vz8XlggjB7HFJsfw==", + "debug_symbols": "pZTLroMgEIbfhTULZrgIvkrTNLaljQlRQ/UkJ43vfsCKrQtM49k4jvB/cwHnSa72PNxPdXNrH6Q8PMnZ187V95NrL1Vft034+iQsPkCREimB4mU0KXkwhpSCEgw7xDhSkmSn3lsbVR+cQO8qb5uelM3gHCU/lRumTY+uaibbVz6sMkpscw02AG+1s/FtpG81y0s1w1msUS1yKFZ6yOuVELNeSb5HryHptd6lT8UXLBt/o36QKT5os+jlun9yQ69gASgp3xmYFUFtEIzRMwEZZglFniCAmZkgQOIeAvJUhUBldhFQ/pcAxReEzU5qlc7CmD1ngUym64yAkCMAzyO45KkRXBqxJwnAYklC8WwSG7dShMipl0q8xwKonQieQ7DNZqYyPlKQX48mlEsbDK70x+BVl9qvhy6EGRYma0gx3GU+OeLlyJg2JSr+5JQUUytjXF9XZ2ejOOKH5pJYwe1/u7SSRnzn24u9Dt7GuB9zPjwPKCia4xhz+wM=", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -86,7 +86,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 69bbf376113..e973a1ece7c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -68,7 +68,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32841 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(6), offset_address: Relative(7) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 135 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(6), source: Relative(2) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(2), location: 101 }, Jump { location: 55 }, Const { destination: Relative(2), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(5), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(7), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(9), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(7) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(5), size: Relative(6) }, scalars: HeapVector { pointer: Relative(7), size: Relative(9) }, outputs: HeapArray { pointer: Relative(12), size: 3 } }), BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(2), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(5), source_pointer: Relative(6) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 96 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(1), location: 100 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(5), source: Relative(11), bit_size: Field }, BinaryFieldOp { destination: Relative(11), op: Sub, lhs: Relative(2), rhs: Relative(5) }, BinaryFieldOp { destination: Relative(12), op: Mul, lhs: Relative(11), rhs: Relative(9) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Direct(32835), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(13), op: Add, lhs: Relative(5), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(2), rhs: Relative(13) }, JumpIf { condition: Relative(11), location: 114 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Load { destination: Relative(2), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 141 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Store { destination_pointer: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 141 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Store { destination_pointer: Relative(1), source: Relative(5) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(10) }, Mov { destination: Relative(6), source: Relative(2) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 140 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 145 }, Jump { location: 147 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 162 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 159 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 152 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 162 }, Return]" ], - "debug_symbols": "nZbNjqpAEIXfhbWLrq7qv3mViTGoOCEhaBi9yY3x3aeaolQWTWbY+B3E/miaA3Kvjs3+9rVr+9P5u/r4vFf7oe269mvXnQ/1tT33/O29MvnDpuoDNxUaAQisAAUkcAIvCIIoEAuJhcRCYiGxkFhILI73EYO3PMMLgiAK0ghvBCCwAhSQQCxeLF4sXixeLEEsQSxBLEEsQSxBLEEsgS2OwZbISCOiEYDAClBAAifwgiBgS2KkEckIQMAWMEycSBPdRDYBMMPEODEJwbAHbA5WA2rILp+D05BtIYesizlkX8qBhZYPCMDzs9kMoMFqQA3ZjDmw2eZjgdcQNEQNaQrWaAANVgNqIA1qtmq2arZqtmpGNaOacTQ/HptKS7+7Dk2TO/92F/C9camHpr9WH/2t6zbVv7q7jT/6vtT9yGs98F5emKY/Mll4arsmp8fmNdqUh4KDaTDE9Bzu5uNhYTwQqgBieBogzQx2wYAxqAFjXGOgXCgxEOAag4teDd4VDa5sQOP1LJBLsWYO3qXnHJIrGULZQC7RZCBPrzKAX2fAkmGhT9a4SWDfZuB+3UfrdBltsqXxi1eSoq6ic6uug0PzMhQbnR8wxTJ40rsKfaSigsqKaLTS8b1NYS5YKKQnvZKzQv9BEPUc/Ptd+ReBrmMw5RksLWPw+mzBaGDVlQjPPq1XUPqFYrFR8OqknTdqy1v1oR1mbz+P7Braet810+bp1h/e9l7/X3SPvj1dhvOhOd6GJpter1D88ckPxQ14u83/o3kT3QbIbB/56D8=", + "debug_symbols": "pZbLjuIwEEX/JWsWrvK7f6XVQgFCK1IUUBpGGiH+fcrcVIBFolZmw7kh+Nixyya36tDsrt/btj+efqqPz1u1G9qua7+33WlfX9pTL9/eKlM+OFcfdlNZAxDAgAUc4IEARCABsDhYHCwOFgeLg8XB4uWeE8hVEAQgAgnIDwQDEMCABRwAS4AlwBJgCbBEWCIsEZYIS4QlwhJhiWLxArEkQX4gGYAABizgAA8EIAJiyYL8QDYAAWIhI7Qj3Ug/UkxEwjgyjcwgGfEQl8AarIbiCiV4DcUWSyi6VELx5RJEyNIhkYyPi5lIA2uwGorZliBmLn1R0BA1JA15DGw0kAbWYDU4DWpmNbOaWc2sZqtmq2b7MN/vm0qLfnsZmqbU/MsukL1xroemv1Qf/bXrNtWfurs+fvRzrvsHL/Ugd2Vimv4gFOGx7ZqS7ptnazPflDyNjSnlqbl/b08L7QNNguD9ZKD8ZuAFQ/J+GoIPqwzJTIZEKwxsvBsNLOs/Z/DzBuutPoX12a0Zg5TQNIZg5wxx3uCk49HggnsWA4V1BjtnMIszqQ/xMgL/63pkP01C5rn2iytZjhIIDK9ZB8o5PQ2zFV0OmNlplPNKp5E8zyrcvCIZHg2JX/ZEfBcsFGRwupLB21WCpBs7pLROoLsymvkRLE0jWx2C45BXrQSz/28FxV8oFisqaU1Kcb1X1Jdc1ft2eHv7uRfX0Na7rhkvj9d+/3L38vesd/Tt6Tyc9s3hOjTF9HyFko9PcrShwF/lf7RcyklFznzdS+//AA==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -79,7 +79,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_0.snap index 69bbf376113..e973a1ece7c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_0.snap @@ -68,7 +68,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32841 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(6), offset_address: Relative(7) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 135 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(6), source: Relative(2) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(2), location: 101 }, Jump { location: 55 }, Const { destination: Relative(2), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(5), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(7), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(9), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(7) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(5), size: Relative(6) }, scalars: HeapVector { pointer: Relative(7), size: Relative(9) }, outputs: HeapArray { pointer: Relative(12), size: 3 } }), BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(2), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(5), source_pointer: Relative(6) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 96 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(1), location: 100 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(5), source: Relative(11), bit_size: Field }, BinaryFieldOp { destination: Relative(11), op: Sub, lhs: Relative(2), rhs: Relative(5) }, BinaryFieldOp { destination: Relative(12), op: Mul, lhs: Relative(11), rhs: Relative(9) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Direct(32835), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(13), op: Add, lhs: Relative(5), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(2), rhs: Relative(13) }, JumpIf { condition: Relative(11), location: 114 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Load { destination: Relative(2), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 141 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Store { destination_pointer: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 141 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Store { destination_pointer: Relative(1), source: Relative(5) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(10) }, Mov { destination: Relative(6), source: Relative(2) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 140 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 145 }, Jump { location: 147 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 162 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 159 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 152 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 162 }, Return]" ], - "debug_symbols": "nZbNjqpAEIXfhbWLrq7qv3mViTGoOCEhaBi9yY3x3aeaolQWTWbY+B3E/miaA3Kvjs3+9rVr+9P5u/r4vFf7oe269mvXnQ/1tT33/O29MvnDpuoDNxUaAQisAAUkcAIvCIIoEAuJhcRCYiGxkFhILI73EYO3PMMLgiAK0ghvBCCwAhSQQCxeLF4sXixeLEEsQSxBLEEsQSxBLEEsgS2OwZbISCOiEYDAClBAAifwgiBgS2KkEckIQMAWMEycSBPdRDYBMMPEODEJwbAHbA5WA2rILp+D05BtIYesizlkX8qBhZYPCMDzs9kMoMFqQA3ZjDmw2eZjgdcQNEQNaQrWaAANVgNqIA1qtmq2arZqtmpGNaOacTQ/HptKS7+7Dk2TO/92F/C9camHpr9WH/2t6zbVv7q7jT/6vtT9yGs98F5emKY/Mll4arsmp8fmNdqUh4KDaTDE9Bzu5uNhYTwQqgBieBogzQx2wYAxqAFjXGOgXCgxEOAag4teDd4VDa5sQOP1LJBLsWYO3qXnHJIrGULZQC7RZCBPrzKAX2fAkmGhT9a4SWDfZuB+3UfrdBltsqXxi1eSoq6ic6uug0PzMhQbnR8wxTJ40rsKfaSigsqKaLTS8b1NYS5YKKQnvZKzQv9BEPUc/Ptd+ReBrmMw5RksLWPw+mzBaGDVlQjPPq1XUPqFYrFR8OqknTdqy1v1oR1mbz+P7Braet810+bp1h/e9l7/X3SPvj1dhvOhOd6GJpter1D88ckPxQ14u83/o3kT3QbIbB/56D8=", + "debug_symbols": "pZbLjuIwEEX/JWsWrvK7f6XVQgFCK1IUUBpGGiH+fcrcVIBFolZmw7kh+Nixyya36tDsrt/btj+efqqPz1u1G9qua7+33WlfX9pTL9/eKlM+OFcfdlNZAxDAgAUc4IEARCABsDhYHCwOFgeLg8XB4uWeE8hVEAQgAgnIDwQDEMCABRwAS4AlwBJgCbBEWCIsEZYIS4QlwhJhiWLxArEkQX4gGYAABizgAA8EIAJiyYL8QDYAAWIhI7Qj3Ug/UkxEwjgyjcwgGfEQl8AarIbiCiV4DcUWSyi6VELx5RJEyNIhkYyPi5lIA2uwGorZliBmLn1R0BA1JA15DGw0kAbWYDU4DWpmNbOaWc2sZqtmq2b7MN/vm0qLfnsZmqbU/MsukL1xroemv1Qf/bXrNtWfurs+fvRzrvsHL/Ugd2Vimv4gFOGx7ZqS7ptnazPflDyNjSnlqbl/b08L7QNNguD9ZKD8ZuAFQ/J+GoIPqwzJTIZEKwxsvBsNLOs/Z/DzBuutPoX12a0Zg5TQNIZg5wxx3uCk49HggnsWA4V1BjtnMIszqQ/xMgL/63pkP01C5rn2iytZjhIIDK9ZB8o5PQ2zFV0OmNlplPNKp5E8zyrcvCIZHg2JX/ZEfBcsFGRwupLB21WCpBs7pLROoLsymvkRLE0jWx2C45BXrQSz/28FxV8oFisqaU1Kcb1X1Jdc1ft2eHv7uRfX0Na7rhkvj9d+/3L38vesd/Tt6Tyc9s3hOjTF9HyFko9PcrShwF/lf7RcyklFznzdS+//AA==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -79,7 +79,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 69bbf376113..e973a1ece7c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -68,7 +68,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32841 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(6), offset_address: Relative(7) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Mov { destination: Relative(4), source: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32840) }, Call { location: 17 }, Call { location: 19 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32841 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 135 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(6), source: Relative(2) }, Jump { location: 52 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(2), location: 101 }, Jump { location: 55 }, Const { destination: Relative(2), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(5), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(7), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(9), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(5) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(7) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(5), size: Relative(6) }, scalars: HeapVector { pointer: Relative(7), size: Relative(9) }, outputs: HeapArray { pointer: Relative(12), size: 3 } }), BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(10) }, Load { destination: Relative(2), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(5), source_pointer: Relative(6) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 96 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(1), location: 100 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(11) }, Cast { destination: Relative(11), source: Relative(2), bit_size: Integer(U128) }, Cast { destination: Relative(5), source: Relative(11), bit_size: Field }, BinaryFieldOp { destination: Relative(11), op: Sub, lhs: Relative(2), rhs: Relative(5) }, BinaryFieldOp { destination: Relative(12), op: Mul, lhs: Relative(11), rhs: Relative(9) }, BinaryFieldOp { destination: Relative(11), op: Mul, lhs: Direct(32835), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(13), op: Add, lhs: Relative(5), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(2), rhs: Relative(13) }, JumpIf { condition: Relative(11), location: 114 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Load { destination: Relative(2), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 141 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Store { destination_pointer: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 141 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Store { destination_pointer: Relative(1), source: Relative(5) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(10) }, Mov { destination: Relative(6), source: Relative(2) }, Jump { location: 52 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 140 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 145 }, Jump { location: 147 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 162 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 159 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 152 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 162 }, Return]" ], - "debug_symbols": "nZbNjqpAEIXfhbWLrq7qv3mViTGoOCEhaBi9yY3x3aeaolQWTWbY+B3E/miaA3Kvjs3+9rVr+9P5u/r4vFf7oe269mvXnQ/1tT33/O29MvnDpuoDNxUaAQisAAUkcAIvCIIoEAuJhcRCYiGxkFhILI73EYO3PMMLgiAK0ghvBCCwAhSQQCxeLF4sXixeLEEsQSxBLEEsQSxBLEEsgS2OwZbISCOiEYDAClBAAifwgiBgS2KkEckIQMAWMEycSBPdRDYBMMPEODEJwbAHbA5WA2rILp+D05BtIYesizlkX8qBhZYPCMDzs9kMoMFqQA3ZjDmw2eZjgdcQNEQNaQrWaAANVgNqIA1qtmq2arZqtmpGNaOacTQ/HptKS7+7Dk2TO/92F/C9camHpr9WH/2t6zbVv7q7jT/6vtT9yGs98F5emKY/Mll4arsmp8fmNdqUh4KDaTDE9Bzu5uNhYTwQqgBieBogzQx2wYAxqAFjXGOgXCgxEOAag4teDd4VDa5sQOP1LJBLsWYO3qXnHJIrGULZQC7RZCBPrzKAX2fAkmGhT9a4SWDfZuB+3UfrdBltsqXxi1eSoq6ic6uug0PzMhQbnR8wxTJ40rsKfaSigsqKaLTS8b1NYS5YKKQnvZKzQv9BEPUc/Ptd+ReBrmMw5RksLWPw+mzBaGDVlQjPPq1XUPqFYrFR8OqknTdqy1v1oR1mbz+P7Braet810+bp1h/e9l7/X3SPvj1dhvOhOd6GJpter1D88ckPxQ14u83/o3kT3QbIbB/56D8=", + "debug_symbols": "pZbLjuIwEEX/JWsWrvK7f6XVQgFCK1IUUBpGGiH+fcrcVIBFolZmw7kh+Nixyya36tDsrt/btj+efqqPz1u1G9qua7+33WlfX9pTL9/eKlM+OFcfdlNZAxDAgAUc4IEARCABsDhYHCwOFgeLg8XB4uWeE8hVEAQgAgnIDwQDEMCABRwAS4AlwBJgCbBEWCIsEZYIS4QlwhJhiWLxArEkQX4gGYAABizgAA8EIAJiyYL8QDYAAWIhI7Qj3Ug/UkxEwjgyjcwgGfEQl8AarIbiCiV4DcUWSyi6VELx5RJEyNIhkYyPi5lIA2uwGorZliBmLn1R0BA1JA15DGw0kAbWYDU4DWpmNbOaWc2sZqtmq2b7MN/vm0qLfnsZmqbU/MsukL1xroemv1Qf/bXrNtWfurs+fvRzrvsHL/Ugd2Vimv4gFOGx7ZqS7ptnazPflDyNjSnlqbl/b08L7QNNguD9ZKD8ZuAFQ/J+GoIPqwzJTIZEKwxsvBsNLOs/Z/DzBuutPoX12a0Zg5TQNIZg5wxx3uCk49HggnsWA4V1BjtnMIszqQ/xMgL/63pkP01C5rn2iytZjhIIDK9ZB8o5PQ2zFV0OmNlplPNKp5E8zyrcvCIZHg2JX/ZEfBcsFGRwupLB21WCpBs7pLROoLsymvkRLE0jWx2C45BXrQSz/28FxV8oFisqaU1Kcb1X1Jdc1ft2eHv7uRfX0Na7rhkvj9d+/3L38vesd/Tt6Tyc9s3hOjTF9HyFko9PcrShwF/lf7RcyklFznzdS+//AA==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -79,7 +79,7 @@ expression: artifact "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 144668df1ad..a0f5fcaaae1 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -52,14 +52,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 14 }, Call { location: 15 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(3), size: Relative(4) } }, Return, Call { location: 24 }, Cast { destination: Relative(3), source: Relative(1), bit_size: Integer(U128) }, Cast { destination: Relative(2), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(1), rhs: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(4) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 29 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTbjoMgEED/ZZ55kOGqv9I0jbW0ISFoqG6yafz3hVa6NRuajX0BRzhnZIJzg5M5TpeD9ef+Cs3uBsdgnbOXg+u7drS9j29vUKWBSmiQAFWPSUPD4lRDwwlg3MHnmUDGDmMwJlEvnmgf2mD8CI2fnCPw1brpvuk6tP4+j22IqxUB409xjsKzdSY9zeSXrsqornCBNconTtWKp2Vecr7wUrAtvKaZ13oTnw+vqmL+N+evxYJTVE9crMsnyjjVmPNTLV4OUK8MsmxAJuRiQKZZyaDKBiZ5riGTmm8xKMmyQVd0k0GoTw28/ofhXSX5sw7IxSaDZPlvQMnFJoPKlUSF7GODLBneXGnKs4BKXN3pfYzazoY/zUrHxhS3x/LhPWCPgCcZAZFMc0oYbHt0JlHJO/kuS2I4fg95JffEIfSdOU3BpIQvjTGOO+QE6/2cPuoH", + "debug_symbols": "pZRRjoMgEEDvwrcfzgAKXqVpGmppQ0LQUN1k03j3hVbcmg1mY3/AEd4bGSc8yEWfx9vJuGt3J83hQc7eWGtuJ9u1ajCdC28fpIwDVKTBgkD9mgRpaJgkaVhBMOxg01SQhJ0Gr3Wk3jzB3iuv3UAaN1pbkC9lx+eme6/ccx6UD6tlQbS7hDkIr8bq+DQVv3SZR0WJMyywWnCoVzzk+Yqxma843cMLSLwQu/h0+LrM5t84v+QzDlgvOF+Xj+dxRCFmAdL3AsqVodowCEwVRMEhZ6jzBgalnA0MOO4xIE1/gWEldxmQf2qA+h+GrUrKpQ4oYY+BQpm6iQLQXQYGi0HCxwaWM2y0NDCaerrCVU8fQ6Ra4/9cVqGHIWwPifEZ0FfAoqwgPJqmmNAbdbY6UtE7ujZJQjh892kl3Ym971p9Gb2OCd8uxjAeQtejPE7xo34A", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_0.snap index 144668df1ad..a0f5fcaaae1 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_0.snap @@ -52,14 +52,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 14 }, Call { location: 15 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(3), size: Relative(4) } }, Return, Call { location: 24 }, Cast { destination: Relative(3), source: Relative(1), bit_size: Integer(U128) }, Cast { destination: Relative(2), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(1), rhs: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(4) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 29 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTbjoMgEED/ZZ55kOGqv9I0jbW0ISFoqG6yafz3hVa6NRuajX0BRzhnZIJzg5M5TpeD9ef+Cs3uBsdgnbOXg+u7drS9j29vUKWBSmiQAFWPSUPD4lRDwwlg3MHnmUDGDmMwJlEvnmgf2mD8CI2fnCPw1brpvuk6tP4+j22IqxUB409xjsKzdSY9zeSXrsqornCBNconTtWKp2Vecr7wUrAtvKaZ13oTnw+vqmL+N+evxYJTVE9crMsnyjjVmPNTLV4OUK8MsmxAJuRiQKZZyaDKBiZ5riGTmm8xKMmyQVd0k0GoTw28/ofhXSX5sw7IxSaDZPlvQMnFJoPKlUSF7GODLBneXGnKs4BKXN3pfYzazoY/zUrHxhS3x/LhPWCPgCcZAZFMc0oYbHt0JlHJO/kuS2I4fg95JffEIfSdOU3BpIQvjTGOO+QE6/2cPuoH", + "debug_symbols": "pZRRjoMgEEDvwrcfzgAKXqVpGmppQ0LQUN1k03j3hVbcmg1mY3/AEd4bGSc8yEWfx9vJuGt3J83hQc7eWGtuJ9u1ajCdC28fpIwDVKTBgkD9mgRpaJgkaVhBMOxg01SQhJ0Gr3Wk3jzB3iuv3UAaN1pbkC9lx+eme6/ccx6UD6tlQbS7hDkIr8bq+DQVv3SZR0WJMyywWnCoVzzk+Yqxma843cMLSLwQu/h0+LrM5t84v+QzDlgvOF+Xj+dxRCFmAdL3AsqVodowCEwVRMEhZ6jzBgalnA0MOO4xIE1/gWEldxmQf2qA+h+GrUrKpQ4oYY+BQpm6iQLQXQYGi0HCxwaWM2y0NDCaerrCVU8fQ6Ra4/9cVqGHIWwPifEZ0FfAoqwgPJqmmNAbdbY6UtE7ujZJQjh892kl3Ym971p9Gb2OCd8uxjAeQtejPE7xo34A", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 144668df1ad..a0f5fcaaae1 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -52,14 +52,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 14 }, Call { location: 15 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(3), size: Relative(4) } }, Return, Call { location: 24 }, Cast { destination: Relative(3), source: Relative(1), bit_size: Integer(U128) }, Cast { destination: Relative(2), source: Relative(3), bit_size: Field }, BinaryFieldOp { destination: Relative(3), op: Sub, lhs: Relative(1), rhs: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(3), rhs: Relative(1) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(4) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 29 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTbjoMgEED/ZZ55kOGqv9I0jbW0ISFoqG6yafz3hVa6NRuajX0BRzhnZIJzg5M5TpeD9ef+Cs3uBsdgnbOXg+u7drS9j29vUKWBSmiQAFWPSUPD4lRDwwlg3MHnmUDGDmMwJlEvnmgf2mD8CI2fnCPw1brpvuk6tP4+j22IqxUB409xjsKzdSY9zeSXrsqornCBNconTtWKp2Vecr7wUrAtvKaZ13oTnw+vqmL+N+evxYJTVE9crMsnyjjVmPNTLV4OUK8MsmxAJuRiQKZZyaDKBiZ5riGTmm8xKMmyQVd0k0GoTw28/ofhXSX5sw7IxSaDZPlvQMnFJoPKlUSF7GODLBneXGnKs4BKXN3pfYzazoY/zUrHxhS3x/LhPWCPgCcZAZFMc0oYbHt0JlHJO/kuS2I4fg95JffEIfSdOU3BpIQvjTGOO+QE6/2cPuoH", + "debug_symbols": "pZRRjoMgEEDvwrcfzgAKXqVpGmppQ0LQUN1k03j3hVbcmg1mY3/AEd4bGSc8yEWfx9vJuGt3J83hQc7eWGtuJ9u1ajCdC28fpIwDVKTBgkD9mgRpaJgkaVhBMOxg01SQhJ0Gr3Wk3jzB3iuv3UAaN1pbkC9lx+eme6/ccx6UD6tlQbS7hDkIr8bq+DQVv3SZR0WJMyywWnCoVzzk+Yqxma843cMLSLwQu/h0+LrM5t84v+QzDlgvOF+Xj+dxRCFmAdL3AsqVodowCEwVRMEhZ6jzBgalnA0MOO4xIE1/gWEldxmQf2qA+h+GrUrKpQ4oYY+BQpm6iQLQXQYGi0HCxwaWM2y0NDCaerrCVU8fQ6Ra4/9cVqGHIWwPifEZ0FfAoqwgPJqmmNAbdbY6UtE7ujZJQjh892kl3Ym971p9Gb2OCd8uxjAeQtejPE7xo34A", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 9e1b0eae1a1..7cc19848156 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -47,14 +47,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(4), offset_address: Relative(5) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Call { location: 14 }, Call { location: 16 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 235 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(8), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(9), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(10), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(11), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(10), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 103 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(9) }, JumpIf { condition: Relative(8), location: 165 }, Jump { location: 106 }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(5), bit_size: Field, value: 2 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Store { destination_pointer: Relative(8), source: Relative(1) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Store { destination_pointer: Relative(9), source: Relative(4) }, Const { destination: Relative(1), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Store { destination_pointer: Relative(9), source: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(2), size: Relative(6) }, scalars: HeapVector { pointer: Relative(7), size: Relative(8) }, outputs: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 164 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Return, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(4) }, Load { destination: Relative(8), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(8), bit_size: Integer(U128) }, Cast { destination: Relative(14), source: Relative(15), bit_size: Field }, BinaryFieldOp { destination: Relative(15), op: Sub, lhs: Relative(8), rhs: Relative(14) }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(15), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Direct(32835), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(17), op: Add, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(8), rhs: Relative(17) }, JumpIf { condition: Relative(15), location: 178 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(8), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(9) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Store { destination_pointer: Relative(19), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(8) }, Store { destination_pointer: Relative(18), source: Relative(16) }, Store { destination_pointer: Relative(6), source: Relative(14) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(13) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(8) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Load { destination: Relative(17), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(8) }, Store { destination_pointer: Relative(21), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(15) }, Store { destination_pointer: Relative(17), source: Relative(16) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Store { destination_pointer: Relative(17), source: Relative(18) }, Store { destination_pointer: Relative(2), source: Relative(15) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(11) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 103 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 240 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 245 }, Jump { location: 247 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 262 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 259 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 252 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 262 }, Return]" ], - "debug_symbols": "pdfRTuM8EAXgd+k1F/HMeGzzKiuECpRVpaqgLv2lX6jvvp4enwArBa2yN5xTSr6kyTih75un3cP55/3++Pzya3P7433zcNofDvuf94eXx+3b/uXYf/u+meKH+OZWbzZSEBXRrqETIiEEoQhDZAQUhaJQFIpBMSgGxaAYFINiUKwr1qMi2jXyhEgIQSjCEBnhCCgZSobiUByKQ3EoDsWhOBSH4lAcSoFSoBQoBUrpivfICEcUREW0a9QJkRCCUASUCqVCqVAqlAqlQWlQGpQGpUFpUNLUf1siO1cju9ci68iGTNPINFJG6kgbmUf6yOGl4aXhyfBkeDI86V6aonQwpSiZxVkKS2Vpo8R0oiQWYVEWykpZKStlpayUjbJRNspG2SgbZaNslGOCk0Rpo8QUoyQWYVEWY8kszlJYQtYobZSY7GRREouwKEuAOYqzFJYA46LEiF9LDLnE1Ykxl/g4MegSe49Rl9hpDLuEHOOO4iyFJeQYvxh7iX3F4KMkFmFRFmPJLM5SWCoL5Ua5UW6UG+VGuVFuIccRtsJSWRqKTBNLYhEWZTGWzOIshaWyhNxXo8RqQ0kswqIsxpJZnKWwVBbKQlkoC2WhLJSFslAWykJZKCtlpaxX+XK52fARc/922u3iCfPpmdOfRK/b0+74trk9ng+Hm81/28P5+ke/XrfHa75tT/3dPne741PPDj7vD7tol5uPraflTVse2/Z7x7x1/rp5Wt68zyJ33mevzkJqXwRZFvrlb0PoAzCtEfrtikJfY2sEsVnQJEtCXhZ08jKEDviaY1BN8zGorBGsOYU8rToGs/kYLKc1glul4F5WCSqzYHmVUJRCEf1nYfFMfrOs+pOPy8JlaV19Ow3F5mmoq6ZBs38Ii2chnjWLQ+3zOKjXxYWVyjJRJ17M+vk8lq9AXQbceB486yqg8jN4resA3uHKtHwE353G4hwGrVNadSVKLv9MWPsL4tuJmoe6D9eqdWXTfK83aauOoc3HYH/c4+76q+3j/vTla9slrNN++3DYjZfP5+Pjp3ff/n/lO/za93p6edw9nU+7kD6++/UfP6SvCHG5i///42V/8vTjuLvE3n8D", + "debug_symbols": "pdfdTuNIEAXgd8k1F93V1T/Fq4wQCmBGkaKAMslKK5R3366cPgZWcjTjuck5SfDnv7JNPjYv09P55+Pu8Pr2a3P/42PzdNzt97ufj/u35+1p93bon35sgr9I2dynu41UREPYNVJARIQgEkIRGQElQUlQEhSFolAUikJRKApFoWhXtEdD2DVyQESEIBJCERlREFAylAylQClQCpQCpUApUAqUAqVAKVAqlAqlQqlQaldKj4woiIpoCLtGC4iIEERCQGlQGpQGpUFpUAyKQTEoBsWgGJQY+qfVs3PNs3vm2UYaMoaRcaSMTCN1ZB5ZRg4vDi8OT4Ynw5PhSfdi8NLBGL1klsJSWRqLjeLTiRJZhCWxUE6UE+VEOVFOlJWyUlbKSlkpK2WlrJR9gqN4sVF8ilEii7AkFmXJLIWlsricvNgoPtlRvUQWYUksDmYvhaWyOOgnxUf8WnzIxc+Oj7n47vigi6/dR118pT7s4rKPO0phqSwu+/j52IuvywcfJbIIS2JRlsxSWCpLY6FslI2yUTbKRtkom8u+hVZZGouhSAgskUVYEouyZJbCUlkai8v9ahS/2lAii7AkFmXJLIWlsjQWykJZKAtloSyUhbJQFspCWSgnyolyusqXy92Gj5jH03Ga/Anz5ZnTn0Tv2+N0OG3uD+f9/m7zz3Z/vv7Rr/ft4Zqn7bF/2+duOrz07ODrbj95u9x9Lh2WF7U8lu33jnnp/H3xuLx439s2gL5TZRaifRPkhpD9iEDI0tYIJSQKRWWNUOMs1BaWhLwspJx4IFM2XbUNZtyGFsIawYpSsLpqGyzM22B9sT8XUvSbF45Df4qsEkKYhZhWCRpnweJfC4tH8sZl1Z98vK6KLF1Xt85EU5mnIa+ahib6KSweBT9dS4TGeRy0P3kXibpMtMDdaF/vDvU70JaBotyLktMqoPFUltbWAZzHGpa34NZh7Pd9HkYptupMiOS/JmL9DeLmRMU4T5TEVUKd7/XN6iqhfG7D/+5xD/3d9nl3/Paz7eLWcbd92k/j7ev58Pzl29O/7/yGP/vej2/P08v5OLn0+duvv/yQfmOQIg/+/7+/7Xd90fBw8bX/Bw==", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_0.snap index 78a287828da..597193b8bf6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_0.snap @@ -47,14 +47,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(4), offset_address: Relative(5) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Call { location: 14 }, Call { location: 16 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 235 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Const { destination: Relative(7), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(8), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(9), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(10), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(11), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(10), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 103 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(7), location: 165 }, Jump { location: 106 }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(5), bit_size: Field, value: 2 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Const { destination: Relative(1), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Store { destination_pointer: Relative(8), source: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(2), size: Relative(6) }, scalars: HeapVector { pointer: Relative(7), size: Relative(8) }, outputs: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 164 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Return, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(7), bit_size: Integer(U128) }, Cast { destination: Relative(14), source: Relative(15), bit_size: Field }, BinaryFieldOp { destination: Relative(15), op: Sub, lhs: Relative(7), rhs: Relative(14) }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(15), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Direct(32835), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(17), op: Add, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(7), rhs: Relative(17) }, JumpIf { condition: Relative(15), location: 178 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(7), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Store { destination_pointer: Relative(19), source: Relative(14) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(7) }, Store { destination_pointer: Relative(18), source: Relative(16) }, Store { destination_pointer: Relative(6), source: Relative(14) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(13) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(7) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Load { destination: Relative(17), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(21), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(15) }, Store { destination_pointer: Relative(17), source: Relative(16) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Store { destination_pointer: Relative(17), source: Relative(18) }, Store { destination_pointer: Relative(2), source: Relative(15) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(11) }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 103 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 240 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 245 }, Jump { location: 247 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 262 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 259 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 252 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 262 }, Return]" ], - "debug_symbols": "pdfRTuM8EAXgd+k1F/HMeGzzKiuECpRVpaqgLv2lX6jvvp4enwArBa2yN5xTSr6kyTih75un3cP55/3++Pzya3P7433zcNofDvuf94eXx+3b/uXYf/u+meKH+OZWbzZSEBXRrqETIiEEoQhDZAQUhaJQFIpBMSgGxaAYFINiUKwr1qMi2jXyhEgIQSjCEBnhCCgZSobiUByKQ3EoDsWhOBSH4lAcSoFSoBQoBUrpivfICEcUREW0a9QJkRCCUASUCqVCqVAqlAqlQWlQGpQGpUFpUNLUf1siO1cju9ci68iGTNPINFJG6kgbmUf6yOGl4aXhyfBkeDI86V6aonQwpSiZxVkKS2Vpo8R0oiQWYVEWykpZKStlpayUjbJRNspG2SgbZaNslGOCk0Rpo8QUoyQWYVEWY8kszlJYQtYobZSY7GRREouwKEuAOYqzFJYA46LEiF9LDLnE1Ykxl/g4MegSe49Rl9hpDLuEHOOO4iyFJeQYvxh7iX3F4KMkFmFRFmPJLM5SWCoL5Ua5UW6UG+VGuVFuIccRtsJSWRqKTBNLYhEWZTGWzOIshaWyhNxXo8RqQ0kswqIsxpJZnKWwVBbKQlkoC2WhLJSFslAWykJZKCtlpaxX+XK52fARc/922u3iCfPpmdOfRK/b0+74trk9ng+Hm81/28P5+ke/XrfHa75tT/3dPne741PPDj7vD7tol5uPraflTVse2/Z7x7x1/rp5Wt68zyJ33mevzkJqXwRZFvrlb0PoAzCtEfrtikJfY2sEsVnQJEtCXhZ08jKEDviaY1BN8zGorBGsOYU8rToGs/kYLKc1glul4F5WCSqzYHmVUJRCEf1nYfFMfrOs+pOPy8JlaV19Ow3F5mmoq6ZBs38Ii2chnjWLQ+3zOKjXxYWVyjJRJ17M+vk8lq9AXQbceB486yqg8jN4resA3uHKtHwE353G4hwGrVNadSVKLv9MWPsL4tuJmoe6D9eqdWXTfK83aauOoc3HYH/c4+76q+3j/vTla9slrNN++3DYjZfP5+Pjp3ff/n/lO/za93p6edw9nU+7kD6++/UfP6SvCHG5i///42V/8vTjuLvE3n8D", + "debug_symbols": "pdfdTuNIEAXgd8k1F93V1T/Fq4wQCmBGkaKAMslKK5R3366cPgZWcjTjuck5SfDnv7JNPjYv09P55+Pu8Pr2a3P/42PzdNzt97ufj/u35+1p93bon35sgr9I2dynu41UREPYNVJARIQgEkIRGQElQUlQEhSFolAUikJRKApFoWhXtEdD2DVyQESEIBJCERlREFAylAylQClQCpQCpUApUAqUAqVAKVAqlAqlQqlQaldKj4woiIpoCLtGC4iIEERCQGlQGpQGpUFpUAyKQTEoBsWgGJQY+qfVs3PNs3vm2UYaMoaRcaSMTCN1ZB5ZRg4vDi8OT4Ynw5PhSfdi8NLBGL1klsJSWRqLjeLTiRJZhCWxUE6UE+VEOVFOlJWyUlbKSlkpK2WlrJR9gqN4sVF8ilEii7AkFmXJLIWlsricvNgoPtlRvUQWYUksDmYvhaWyOOgnxUf8WnzIxc+Oj7n47vigi6/dR118pT7s4rKPO0phqSwu+/j52IuvywcfJbIIS2JRlsxSWCpLY6FslI2yUTbKRtkom8u+hVZZGouhSAgskUVYEouyZJbCUlkai8v9ahS/2lAii7AkFmXJLIWlsjQWykJZKAtloSyUhbJQFspCWSgnyolyusqXy92Gj5jH03Ga/Anz5ZnTn0Tv2+N0OG3uD+f9/m7zz3Z/vv7Rr/ft4Zqn7bF/2+duOrz07ODrbj95u9x9Lh2WF7U8lu33jnnp/H3xuLx439s2gL5TZRaifRPkhpD9iEDI0tYIJSQKRWWNUOMs1BaWhLwspJx4IFM2XbUNZtyGFsIawYpSsLpqGyzM22B9sT8XUvSbF45Df4qsEkKYhZhWCRpnweJfC4tH8sZl1Z98vK6KLF1Xt85EU5mnIa+ahib6KSweBT9dS4TGeRy0P3kXibpMtMDdaF/vDvU70JaBotyLktMqoPFUltbWAZzHGpa34NZh7Pd9HkYptupMiOS/JmL9DeLmRMU4T5TEVUKd7/XN6iqhfG7D/+5xD/3d9nl3/Paz7eLWcbd92k/j7ev58Pzl29O/7/yGP/vej2/P08v5OLn0+duvv/yQfmOQIg/+/7+/7Xd90fBw8bX/Bw==", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 78a287828da..597193b8bf6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_hash/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -47,14 +47,14 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(4), offset_address: Relative(5) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Call { location: 14 }, Call { location: 16 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32839 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 235 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(2) }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(1) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(2) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Const { destination: Relative(7), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(8), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(9), bit_size: Integer(U1), value: 0 }, Const { destination: Relative(10), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(11), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(10), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 103 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(7), location: 165 }, Jump { location: 106 }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(5), bit_size: Field, value: 2 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 5 }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 6 }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(5), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Const { destination: Relative(1), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(6), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Store { destination_pointer: Relative(8), source: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 9 }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(2), size: Relative(6) }, scalars: HeapVector { pointer: Relative(7), size: Relative(8) }, outputs: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(11) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 164 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Return, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(15) }, Cast { destination: Relative(15), source: Relative(7), bit_size: Integer(U128) }, Cast { destination: Relative(14), source: Relative(15), bit_size: Field }, BinaryFieldOp { destination: Relative(15), op: Sub, lhs: Relative(7), rhs: Relative(14) }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(15), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Direct(32835), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(17), op: Add, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(7), rhs: Relative(17) }, JumpIf { condition: Relative(15), location: 178 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(7), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Store { destination_pointer: Relative(19), source: Relative(14) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 241 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(7) }, Store { destination_pointer: Relative(18), source: Relative(16) }, Store { destination_pointer: Relative(6), source: Relative(14) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(13) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(7) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Load { destination: Relative(17), source_pointer: Relative(2) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(21), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(15) }, Store { destination_pointer: Relative(17), source: Relative(16) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 241 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Store { destination_pointer: Relative(17), source: Relative(18) }, Store { destination_pointer: Relative(2), source: Relative(15) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(11) }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 103 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 240 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 245 }, Jump { location: 247 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 262 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 259 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 252 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 262 }, Return]" ], - "debug_symbols": "pdfRTuM8EAXgd+k1F/HMeGzzKiuECpRVpaqgLv2lX6jvvp4enwArBa2yN5xTSr6kyTih75un3cP55/3++Pzya3P7433zcNofDvuf94eXx+3b/uXYf/u+meKH+OZWbzZSEBXRrqETIiEEoQhDZAQUhaJQFIpBMSgGxaAYFINiUKwr1qMi2jXyhEgIQSjCEBnhCCgZSobiUByKQ3EoDsWhOBSH4lAcSoFSoBQoBUrpivfICEcUREW0a9QJkRCCUASUCqVCqVAqlAqlQWlQGpQGpUFpUNLUf1siO1cju9ci68iGTNPINFJG6kgbmUf6yOGl4aXhyfBkeDI86V6aonQwpSiZxVkKS2Vpo8R0oiQWYVEWykpZKStlpayUjbJRNspG2SgbZaNslGOCk0Rpo8QUoyQWYVEWY8kszlJYQtYobZSY7GRREouwKEuAOYqzFJYA46LEiF9LDLnE1Ykxl/g4MegSe49Rl9hpDLuEHOOO4iyFJeQYvxh7iX3F4KMkFmFRFmPJLM5SWCoL5Ua5UW6UG+VGuVFuIccRtsJSWRqKTBNLYhEWZTGWzOIshaWyhNxXo8RqQ0kswqIsxpJZnKWwVBbKQlkoC2WhLJSFslAWykJZKCtlpaxX+XK52fARc/922u3iCfPpmdOfRK/b0+74trk9ng+Hm81/28P5+ke/XrfHa75tT/3dPne741PPDj7vD7tol5uPraflTVse2/Z7x7x1/rp5Wt68zyJ33mevzkJqXwRZFvrlb0PoAzCtEfrtikJfY2sEsVnQJEtCXhZ08jKEDviaY1BN8zGorBGsOYU8rToGs/kYLKc1glul4F5WCSqzYHmVUJRCEf1nYfFMfrOs+pOPy8JlaV19Ow3F5mmoq6ZBs38Ii2chnjWLQ+3zOKjXxYWVyjJRJ17M+vk8lq9AXQbceB486yqg8jN4resA3uHKtHwE353G4hwGrVNadSVKLv9MWPsL4tuJmoe6D9eqdWXTfK83aauOoc3HYH/c4+76q+3j/vTla9slrNN++3DYjZfP5+Pjp3ff/n/lO/za93p6edw9nU+7kD6++/UfP6SvCHG5i///42V/8vTjuLvE3n8D", + "debug_symbols": "pdfdTuNIEAXgd8k1F93V1T/Fq4wQCmBGkaKAMslKK5R3366cPgZWcjTjuck5SfDnv7JNPjYv09P55+Pu8Pr2a3P/42PzdNzt97ufj/u35+1p93bon35sgr9I2dynu41UREPYNVJARIQgEkIRGQElQUlQEhSFolAUikJRKApFoWhXtEdD2DVyQESEIBJCERlREFAylAylQClQCpQCpUApUAqUAqVAKVAqlAqlQqlQaldKj4woiIpoCLtGC4iIEERCQGlQGpQGpUFpUAyKQTEoBsWgGJQY+qfVs3PNs3vm2UYaMoaRcaSMTCN1ZB5ZRg4vDi8OT4Ynw5PhSfdi8NLBGL1klsJSWRqLjeLTiRJZhCWxUE6UE+VEOVFOlJWyUlbKSlkpK2WlrJR9gqN4sVF8ilEii7AkFmXJLIWlsricvNgoPtlRvUQWYUksDmYvhaWyOOgnxUf8WnzIxc+Oj7n47vigi6/dR118pT7s4rKPO0phqSwu+/j52IuvywcfJbIIS2JRlsxSWCpLY6FslI2yUTbKRtkom8u+hVZZGouhSAgskUVYEouyZJbCUlkai8v9ahS/2lAii7AkFmXJLIWlsjQWykJZKAtloSyUhbJQFspCWSgnyolyusqXy92Gj5jH03Ga/Anz5ZnTn0Tv2+N0OG3uD+f9/m7zz3Z/vv7Rr/ft4Zqn7bF/2+duOrz07ODrbj95u9x9Lh2WF7U8lu33jnnp/H3xuLx439s2gL5TZRaifRPkhpD9iEDI0tYIJSQKRWWNUOMs1BaWhLwspJx4IFM2XbUNZtyGFsIawYpSsLpqGyzM22B9sT8XUvSbF45Df4qsEkKYhZhWCRpnweJfC4tH8sZl1Z98vK6KLF1Xt85EU5mnIa+ahib6KSweBT9dS4TGeRy0P3kXibpMtMDdaF/vDvU70JaBotyLktMqoPFUltbWAZzHGpa34NZh7Pd9HkYptupMiOS/JmL9DeLmRMU4T5TEVUKd7/XN6iqhfG7D/+5xD/3d9nl3/Paz7eLWcbd92k/j7ev58Pzl29O/7/yGP/vej2/P08v5OLn0+duvv/yQfmOQIg/+/7+/7Xd90fBw8bX/Bw==", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", "path": "std/field/bn254.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__expanded.snap index 09a241b9367..5828c1747be 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__expanded.snap @@ -17,9 +17,9 @@ pub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field { low + (high * v) } -pub fn blake3_to_field(bytes_to_hash: [u8; N]) -> Field { - let blake3_hashed: [u8; 32] = std::hash::blake3(bytes_to_hash); - let hash_in_a_field: Field = field_from_bytes_32_trunc(blake3_hashed); +pub fn blake2s_to_field(bytes_to_hash: [u8; N]) -> Field { + let blake2s_hashed: [u8; 32] = std::hash::blake2s(bytes_to_hash); + let hash_in_a_field: Field = field_from_bytes_32_trunc(blake2s_hashed); hash_in_a_field } @@ -29,11 +29,11 @@ fn main(tx_effects_hash_input: [Field; 256]) -> pub Field { let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes(); for byte_index in 0..32 { { - let i_3786: u32 = (offset * 32) + byte_index; - hash_input_flattened[i_3786] = input_as_bytes[byte_index]; + let i_3789: u32 = (offset * 32) + byte_index; + hash_input_flattened[i_3789] = input_as_bytes[byte_index]; } } } - let blake3_digest: Field = blake3_to_field(hash_input_flattened); - blake3_digest + let blake2s_digest: Field = blake2s_to_field(hash_input_flattened); + blake2s_digest } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 70e680bac1a..91812c5ad1c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -114721,7 +114721,7 @@ expression: artifact "EXPR [ (-1, _82942) (-1, _82943) 1 ]", "EXPR [ (1, _82932, _82933) (1, _82931) (-1, _82944) 0 ]", "EXPR [ (1, _82943, _82944) (1, _82942) -1 ]", - "BLACKBOX::BLAKE3 [(_288, 8), (_287, 8), (_286, 8), (_285, 8), (_284, 8), (_283, 8), (_282, 8), (_281, 8), (_280, 8), (_279, 8), (_278, 8), (_277, 8), (_276, 8), (_275, 8), (_274, 8), (_273, 8), (_272, 8), (_271, 8), (_270, 8), (_269, 8), (_268, 8), (_267, 8), (_266, 8), (_265, 8), (_264, 8), (_263, 8), (_262, 8), (_261, 8), (_260, 8), (_259, 8), (_258, 8), (_257, 8), (_611, 8), (_610, 8), (_609, 8), (_608, 8), (_607, 8), (_606, 8), (_605, 8), (_604, 8), (_603, 8), (_602, 8), (_601, 8), (_600, 8), (_599, 8), (_598, 8), (_597, 8), (_596, 8), (_595, 8), (_594, 8), (_593, 8), (_592, 8), (_591, 8), (_590, 8), (_589, 8), (_588, 8), (_587, 8), (_586, 8), (_585, 8), (_584, 8), (_583, 8), (_582, 8), (_581, 8), (_580, 8), (_934, 8), (_933, 8), (_932, 8), (_931, 8), (_930, 8), (_929, 8), (_928, 8), (_927, 8), (_926, 8), (_925, 8), (_924, 8), (_923, 8), (_922, 8), (_921, 8), (_920, 8), (_919, 8), (_918, 8), (_917, 8), (_916, 8), (_915, 8), (_914, 8), (_913, 8), (_912, 8), (_911, 8), (_910, 8), (_909, 8), (_908, 8), (_907, 8), (_906, 8), (_905, 8), (_904, 8), (_903, 8), (_1257, 8), (_1256, 8), (_1255, 8), (_1254, 8), (_1253, 8), (_1252, 8), (_1251, 8), (_1250, 8), (_1249, 8), (_1248, 8), (_1247, 8), (_1246, 8), (_1245, 8), (_1244, 8), (_1243, 8), (_1242, 8), (_1241, 8), (_1240, 8), (_1239, 8), (_1238, 8), (_1237, 8), (_1236, 8), (_1235, 8), (_1234, 8), (_1233, 8), (_1232, 8), (_1231, 8), (_1230, 8), (_1229, 8), (_1228, 8), (_1227, 8), (_1226, 8), (_1580, 8), (_1579, 8), (_1578, 8), (_1577, 8), (_1576, 8), (_1575, 8), (_1574, 8), (_1573, 8), (_1572, 8), (_1571, 8), (_1570, 8), (_1569, 8), (_1568, 8), (_1567, 8), (_1566, 8), (_1565, 8), (_1564, 8), (_1563, 8), (_1562, 8), (_1561, 8), (_1560, 8), (_1559, 8), (_1558, 8), (_1557, 8), (_1556, 8), (_1555, 8), (_1554, 8), (_1553, 8), (_1552, 8), (_1551, 8), (_1550, 8), (_1549, 8), (_1903, 8), (_1902, 8), (_1901, 8), (_1900, 8), (_1899, 8), (_1898, 8), (_1897, 8), (_1896, 8), (_1895, 8), (_1894, 8), (_1893, 8), (_1892, 8), (_1891, 8), (_1890, 8), (_1889, 8), (_1888, 8), (_1887, 8), (_1886, 8), (_1885, 8), (_1884, 8), (_1883, 8), (_1882, 8), (_1881, 8), (_1880, 8), (_1879, 8), (_1878, 8), (_1877, 8), (_1876, 8), (_1875, 8), (_1874, 8), (_1873, 8), (_1872, 8), (_2226, 8), (_2225, 8), (_2224, 8), (_2223, 8), (_2222, 8), (_2221, 8), (_2220, 8), (_2219, 8), (_2218, 8), (_2217, 8), (_2216, 8), (_2215, 8), (_2214, 8), (_2213, 8), (_2212, 8), (_2211, 8), (_2210, 8), (_2209, 8), (_2208, 8), (_2207, 8), (_2206, 8), (_2205, 8), (_2204, 8), (_2203, 8), (_2202, 8), (_2201, 8), (_2200, 8), (_2199, 8), (_2198, 8), (_2197, 8), (_2196, 8), (_2195, 8), (_2549, 8), (_2548, 8), (_2547, 8), (_2546, 8), (_2545, 8), (_2544, 8), (_2543, 8), (_2542, 8), (_2541, 8), (_2540, 8), (_2539, 8), (_2538, 8), (_2537, 8), (_2536, 8), (_2535, 8), (_2534, 8), (_2533, 8), (_2532, 8), (_2531, 8), (_2530, 8), (_2529, 8), (_2528, 8), (_2527, 8), (_2526, 8), (_2525, 8), (_2524, 8), (_2523, 8), (_2522, 8), (_2521, 8), (_2520, 8), (_2519, 8), (_2518, 8), (_2872, 8), (_2871, 8), (_2870, 8), (_2869, 8), (_2868, 8), (_2867, 8), (_2866, 8), (_2865, 8), (_2864, 8), (_2863, 8), (_2862, 8), (_2861, 8), (_2860, 8), (_2859, 8), (_2858, 8), (_2857, 8), (_2856, 8), (_2855, 8), (_2854, 8), (_2853, 8), (_2852, 8), (_2851, 8), (_2850, 8), (_2849, 8), (_2848, 8), (_2847, 8), (_2846, 8), (_2845, 8), (_2844, 8), (_2843, 8), (_2842, 8), (_2841, 8), (_3195, 8), (_3194, 8), (_3193, 8), (_3192, 8), (_3191, 8), (_3190, 8), (_3189, 8), (_3188, 8), (_3187, 8), (_3186, 8), (_3185, 8), (_3184, 8), (_3183, 8), (_3182, 8), (_3181, 8), (_3180, 8), (_3179, 8), (_3178, 8), (_3177, 8), (_3176, 8), (_3175, 8), (_3174, 8), (_3173, 8), (_3172, 8), (_3171, 8), (_3170, 8), (_3169, 8), (_3168, 8), (_3167, 8), (_3166, 8), (_3165, 8), (_3164, 8), (_3518, 8), (_3517, 8), (_3516, 8), (_3515, 8), (_3514, 8), (_3513, 8), (_3512, 8), (_3511, 8), (_3510, 8), (_3509, 8), (_3508, 8), (_3507, 8), (_3506, 8), (_3505, 8), (_3504, 8), (_3503, 8), (_3502, 8), (_3501, 8), (_3500, 8), (_3499, 8), (_3498, 8), (_3497, 8), (_3496, 8), (_3495, 8), (_3494, 8), (_3493, 8), (_3492, 8), (_3491, 8), (_3490, 8), (_3489, 8), (_3488, 8), (_3487, 8), (_3841, 8), (_3840, 8), (_3839, 8), (_3838, 8), (_3837, 8), (_3836, 8), (_3835, 8), (_3834, 8), (_3833, 8), (_3832, 8), (_3831, 8), (_3830, 8), (_3829, 8), (_3828, 8), (_3827, 8), (_3826, 8), (_3825, 8), (_3824, 8), (_3823, 8), (_3822, 8), (_3821, 8), (_3820, 8), (_3819, 8), (_3818, 8), (_3817, 8), (_3816, 8), (_3815, 8), (_3814, 8), (_3813, 8), (_3812, 8), (_3811, 8), (_3810, 8), (_4164, 8), (_4163, 8), (_4162, 8), (_4161, 8), (_4160, 8), (_4159, 8), (_4158, 8), (_4157, 8), (_4156, 8), (_4155, 8), (_4154, 8), (_4153, 8), (_4152, 8), (_4151, 8), (_4150, 8), (_4149, 8), (_4148, 8), (_4147, 8), (_4146, 8), (_4145, 8), (_4144, 8), (_4143, 8), (_4142, 8), (_4141, 8), (_4140, 8), (_4139, 8), (_4138, 8), (_4137, 8), (_4136, 8), (_4135, 8), (_4134, 8), (_4133, 8), (_4487, 8), (_4486, 8), (_4485, 8), (_4484, 8), (_4483, 8), (_4482, 8), (_4481, 8), (_4480, 8), (_4479, 8), (_4478, 8), (_4477, 8), (_4476, 8), (_4475, 8), (_4474, 8), (_4473, 8), (_4472, 8), (_4471, 8), (_4470, 8), (_4469, 8), (_4468, 8), (_4467, 8), (_4466, 8), (_4465, 8), (_4464, 8), (_4463, 8), (_4462, 8), (_4461, 8), (_4460, 8), (_4459, 8), (_4458, 8), (_4457, 8), (_4456, 8), (_4810, 8), (_4809, 8), (_4808, 8), (_4807, 8), (_4806, 8), (_4805, 8), (_4804, 8), (_4803, 8), (_4802, 8), (_4801, 8), (_4800, 8), (_4799, 8), (_4798, 8), (_4797, 8), (_4796, 8), (_4795, 8), (_4794, 8), (_4793, 8), (_4792, 8), (_4791, 8), (_4790, 8), (_4789, 8), (_4788, 8), (_4787, 8), (_4786, 8), (_4785, 8), (_4784, 8), (_4783, 8), (_4782, 8), (_4781, 8), (_4780, 8), (_4779, 8), (_5133, 8), (_5132, 8), (_5131, 8), (_5130, 8), (_5129, 8), (_5128, 8), (_5127, 8), (_5126, 8), (_5125, 8), (_5124, 8), (_5123, 8), (_5122, 8), (_5121, 8), (_5120, 8), (_5119, 8), (_5118, 8), (_5117, 8), (_5116, 8), (_5115, 8), (_5114, 8), (_5113, 8), (_5112, 8), (_5111, 8), (_5110, 8), (_5109, 8), (_5108, 8), (_5107, 8), (_5106, 8), (_5105, 8), (_5104, 8), (_5103, 8), (_5102, 8), (_5456, 8), (_5455, 8), (_5454, 8), (_5453, 8), (_5452, 8), (_5451, 8), (_5450, 8), (_5449, 8), (_5448, 8), (_5447, 8), (_5446, 8), (_5445, 8), (_5444, 8), (_5443, 8), (_5442, 8), (_5441, 8), (_5440, 8), (_5439, 8), (_5438, 8), (_5437, 8), (_5436, 8), (_5435, 8), (_5434, 8), (_5433, 8), (_5432, 8), (_5431, 8), (_5430, 8), (_5429, 8), (_5428, 8), (_5427, 8), (_5426, 8), (_5425, 8), (_5779, 8), (_5778, 8), (_5777, 8), (_5776, 8), (_5775, 8), (_5774, 8), (_5773, 8), (_5772, 8), (_5771, 8), (_5770, 8), (_5769, 8), (_5768, 8), (_5767, 8), (_5766, 8), (_5765, 8), (_5764, 8), (_5763, 8), (_5762, 8), (_5761, 8), (_5760, 8), (_5759, 8), (_5758, 8), (_5757, 8), (_5756, 8), (_5755, 8), (_5754, 8), (_5753, 8), (_5752, 8), (_5751, 8), (_5750, 8), (_5749, 8), (_5748, 8), (_6102, 8), (_6101, 8), (_6100, 8), (_6099, 8), (_6098, 8), (_6097, 8), (_6096, 8), (_6095, 8), (_6094, 8), (_6093, 8), (_6092, 8), (_6091, 8), (_6090, 8), (_6089, 8), (_6088, 8), (_6087, 8), (_6086, 8), (_6085, 8), (_6084, 8), (_6083, 8), (_6082, 8), (_6081, 8), (_6080, 8), (_6079, 8), (_6078, 8), (_6077, 8), (_6076, 8), (_6075, 8), (_6074, 8), (_6073, 8), (_6072, 8), (_6071, 8), (_6425, 8), (_6424, 8), (_6423, 8), (_6422, 8), (_6421, 8), (_6420, 8), (_6419, 8), (_6418, 8), (_6417, 8), (_6416, 8), (_6415, 8), (_6414, 8), (_6413, 8), (_6412, 8), (_6411, 8), (_6410, 8), (_6409, 8), (_6408, 8), (_6407, 8), (_6406, 8), (_6405, 8), (_6404, 8), (_6403, 8), (_6402, 8), (_6401, 8), (_6400, 8), (_6399, 8), (_6398, 8), (_6397, 8), (_6396, 8), (_6395, 8), (_6394, 8), (_6748, 8), (_6747, 8), (_6746, 8), (_6745, 8), (_6744, 8), (_6743, 8), (_6742, 8), (_6741, 8), (_6740, 8), (_6739, 8), (_6738, 8), (_6737, 8), (_6736, 8), (_6735, 8), (_6734, 8), (_6733, 8), (_6732, 8), (_6731, 8), (_6730, 8), (_6729, 8), (_6728, 8), (_6727, 8), (_6726, 8), (_6725, 8), (_6724, 8), (_6723, 8), (_6722, 8), (_6721, 8), (_6720, 8), (_6719, 8), (_6718, 8), (_6717, 8), (_7071, 8), (_7070, 8), (_7069, 8), (_7068, 8), (_7067, 8), (_7066, 8), (_7065, 8), (_7064, 8), (_7063, 8), (_7062, 8), (_7061, 8), (_7060, 8), (_7059, 8), (_7058, 8), (_7057, 8), (_7056, 8), (_7055, 8), (_7054, 8), (_7053, 8), (_7052, 8), (_7051, 8), (_7050, 8), (_7049, 8), (_7048, 8), (_7047, 8), (_7046, 8), (_7045, 8), (_7044, 8), (_7043, 8), (_7042, 8), (_7041, 8), (_7040, 8), (_7394, 8), (_7393, 8), (_7392, 8), (_7391, 8), (_7390, 8), (_7389, 8), (_7388, 8), (_7387, 8), (_7386, 8), (_7385, 8), (_7384, 8), (_7383, 8), (_7382, 8), (_7381, 8), (_7380, 8), (_7379, 8), (_7378, 8), (_7377, 8), (_7376, 8), (_7375, 8), (_7374, 8), (_7373, 8), (_7372, 8), (_7371, 8), (_7370, 8), (_7369, 8), (_7368, 8), (_7367, 8), (_7366, 8), (_7365, 8), (_7364, 8), (_7363, 8), (_7717, 8), (_7716, 8), (_7715, 8), (_7714, 8), (_7713, 8), (_7712, 8), (_7711, 8), (_7710, 8), (_7709, 8), (_7708, 8), (_7707, 8), (_7706, 8), (_7705, 8), (_7704, 8), (_7703, 8), (_7702, 8), (_7701, 8), (_7700, 8), (_7699, 8), (_7698, 8), (_7697, 8), (_7696, 8), (_7695, 8), (_7694, 8), (_7693, 8), (_7692, 8), (_7691, 8), (_7690, 8), (_7689, 8), (_7688, 8), (_7687, 8), (_7686, 8), (_8040, 8), (_8039, 8), (_8038, 8), (_8037, 8), (_8036, 8), (_8035, 8), (_8034, 8), (_8033, 8), (_8032, 8), (_8031, 8), (_8030, 8), (_8029, 8), (_8028, 8), (_8027, 8), (_8026, 8), (_8025, 8), (_8024, 8), (_8023, 8), (_8022, 8), (_8021, 8), (_8020, 8), (_8019, 8), (_8018, 8), (_8017, 8), (_8016, 8), (_8015, 8), (_8014, 8), (_8013, 8), (_8012, 8), (_8011, 8), (_8010, 8), (_8009, 8), (_8363, 8), (_8362, 8), (_8361, 8), (_8360, 8), (_8359, 8), (_8358, 8), (_8357, 8), (_8356, 8), (_8355, 8), (_8354, 8), (_8353, 8), (_8352, 8), (_8351, 8), (_8350, 8), (_8349, 8), (_8348, 8), (_8347, 8), (_8346, 8), (_8345, 8), (_8344, 8), (_8343, 8), (_8342, 8), (_8341, 8), (_8340, 8), (_8339, 8), (_8338, 8), (_8337, 8), (_8336, 8), (_8335, 8), (_8334, 8), (_8333, 8), (_8332, 8), (_8686, 8), (_8685, 8), (_8684, 8), (_8683, 8), (_8682, 8), (_8681, 8), (_8680, 8), (_8679, 8), (_8678, 8), (_8677, 8), (_8676, 8), (_8675, 8), (_8674, 8), (_8673, 8), (_8672, 8), (_8671, 8), (_8670, 8), (_8669, 8), (_8668, 8), (_8667, 8), (_8666, 8), (_8665, 8), (_8664, 8), (_8663, 8), (_8662, 8), (_8661, 8), (_8660, 8), (_8659, 8), (_8658, 8), (_8657, 8), (_8656, 8), (_8655, 8), (_9009, 8), (_9008, 8), (_9007, 8), (_9006, 8), (_9005, 8), (_9004, 8), (_9003, 8), (_9002, 8), (_9001, 8), (_9000, 8), (_8999, 8), (_8998, 8), (_8997, 8), (_8996, 8), (_8995, 8), (_8994, 8), (_8993, 8), (_8992, 8), (_8991, 8), (_8990, 8), (_8989, 8), (_8988, 8), (_8987, 8), (_8986, 8), (_8985, 8), (_8984, 8), (_8983, 8), (_8982, 8), (_8981, 8), (_8980, 8), (_8979, 8), (_8978, 8), (_9332, 8), (_9331, 8), (_9330, 8), (_9329, 8), (_9328, 8), (_9327, 8), (_9326, 8), (_9325, 8), (_9324, 8), (_9323, 8), (_9322, 8), (_9321, 8), (_9320, 8), (_9319, 8), (_9318, 8), (_9317, 8), (_9316, 8), (_9315, 8), (_9314, 8), (_9313, 8), (_9312, 8), (_9311, 8), (_9310, 8), (_9309, 8), (_9308, 8), (_9307, 8), (_9306, 8), (_9305, 8), (_9304, 8), (_9303, 8), (_9302, 8), (_9301, 8), (_9655, 8), (_9654, 8), (_9653, 8), (_9652, 8), (_9651, 8), (_9650, 8), (_9649, 8), (_9648, 8), (_9647, 8), (_9646, 8), (_9645, 8), (_9644, 8), (_9643, 8), (_9642, 8), (_9641, 8), (_9640, 8), (_9639, 8), (_9638, 8), (_9637, 8), (_9636, 8), (_9635, 8), (_9634, 8), (_9633, 8), (_9632, 8), (_9631, 8), (_9630, 8), (_9629, 8), (_9628, 8), (_9627, 8), (_9626, 8), (_9625, 8), (_9624, 8), (_9978, 8), (_9977, 8), (_9976, 8), (_9975, 8), (_9974, 8), (_9973, 8), (_9972, 8), (_9971, 8), (_9970, 8), (_9969, 8), (_9968, 8), (_9967, 8), (_9966, 8), (_9965, 8), (_9964, 8), (_9963, 8), (_9962, 8), (_9961, 8), (_9960, 8), (_9959, 8), (_9958, 8), (_9957, 8), (_9956, 8), (_9955, 8), (_9954, 8), (_9953, 8), (_9952, 8), (_9951, 8), (_9950, 8), (_9949, 8), (_9948, 8), (_9947, 8), (_10301, 8), (_10300, 8), (_10299, 8), (_10298, 8), (_10297, 8), (_10296, 8), (_10295, 8), (_10294, 8), (_10293, 8), (_10292, 8), (_10291, 8), (_10290, 8), (_10289, 8), (_10288, 8), (_10287, 8), (_10286, 8), (_10285, 8), (_10284, 8), (_10283, 8), (_10282, 8), (_10281, 8), (_10280, 8), (_10279, 8), (_10278, 8), (_10277, 8), (_10276, 8), (_10275, 8), (_10274, 8), (_10273, 8), (_10272, 8), (_10271, 8), (_10270, 8), (_10624, 8), (_10623, 8), (_10622, 8), (_10621, 8), (_10620, 8), (_10619, 8), (_10618, 8), (_10617, 8), (_10616, 8), (_10615, 8), (_10614, 8), (_10613, 8), (_10612, 8), (_10611, 8), (_10610, 8), (_10609, 8), (_10608, 8), (_10607, 8), (_10606, 8), (_10605, 8), (_10604, 8), (_10603, 8), (_10602, 8), (_10601, 8), (_10600, 8), (_10599, 8), (_10598, 8), (_10597, 8), (_10596, 8), (_10595, 8), (_10594, 8), (_10593, 8), (_10947, 8), (_10946, 8), (_10945, 8), (_10944, 8), (_10943, 8), (_10942, 8), (_10941, 8), (_10940, 8), (_10939, 8), (_10938, 8), (_10937, 8), (_10936, 8), (_10935, 8), (_10934, 8), (_10933, 8), (_10932, 8), (_10931, 8), (_10930, 8), (_10929, 8), (_10928, 8), (_10927, 8), (_10926, 8), (_10925, 8), (_10924, 8), (_10923, 8), (_10922, 8), (_10921, 8), (_10920, 8), (_10919, 8), (_10918, 8), (_10917, 8), (_10916, 8), (_11270, 8), (_11269, 8), (_11268, 8), (_11267, 8), (_11266, 8), (_11265, 8), (_11264, 8), (_11263, 8), (_11262, 8), (_11261, 8), (_11260, 8), (_11259, 8), (_11258, 8), (_11257, 8), (_11256, 8), (_11255, 8), (_11254, 8), (_11253, 8), (_11252, 8), (_11251, 8), (_11250, 8), (_11249, 8), (_11248, 8), (_11247, 8), (_11246, 8), (_11245, 8), (_11244, 8), (_11243, 8), (_11242, 8), (_11241, 8), (_11240, 8), (_11239, 8), (_11593, 8), (_11592, 8), (_11591, 8), (_11590, 8), (_11589, 8), (_11588, 8), (_11587, 8), (_11586, 8), (_11585, 8), (_11584, 8), (_11583, 8), (_11582, 8), (_11581, 8), (_11580, 8), (_11579, 8), (_11578, 8), (_11577, 8), (_11576, 8), (_11575, 8), (_11574, 8), (_11573, 8), (_11572, 8), (_11571, 8), (_11570, 8), (_11569, 8), (_11568, 8), (_11567, 8), (_11566, 8), (_11565, 8), (_11564, 8), (_11563, 8), (_11562, 8), (_11916, 8), (_11915, 8), (_11914, 8), (_11913, 8), (_11912, 8), (_11911, 8), (_11910, 8), (_11909, 8), (_11908, 8), (_11907, 8), (_11906, 8), (_11905, 8), (_11904, 8), (_11903, 8), (_11902, 8), (_11901, 8), (_11900, 8), (_11899, 8), (_11898, 8), (_11897, 8), (_11896, 8), (_11895, 8), (_11894, 8), (_11893, 8), (_11892, 8), (_11891, 8), (_11890, 8), (_11889, 8), (_11888, 8), (_11887, 8), (_11886, 8), (_11885, 8), (_12239, 8), (_12238, 8), (_12237, 8), (_12236, 8), (_12235, 8), (_12234, 8), (_12233, 8), (_12232, 8), (_12231, 8), (_12230, 8), (_12229, 8), (_12228, 8), (_12227, 8), (_12226, 8), (_12225, 8), (_12224, 8), (_12223, 8), (_12222, 8), (_12221, 8), (_12220, 8), (_12219, 8), (_12218, 8), (_12217, 8), (_12216, 8), (_12215, 8), (_12214, 8), (_12213, 8), (_12212, 8), (_12211, 8), (_12210, 8), (_12209, 8), (_12208, 8), (_12562, 8), (_12561, 8), (_12560, 8), (_12559, 8), (_12558, 8), (_12557, 8), (_12556, 8), (_12555, 8), (_12554, 8), (_12553, 8), (_12552, 8), (_12551, 8), (_12550, 8), (_12549, 8), (_12548, 8), (_12547, 8), (_12546, 8), (_12545, 8), (_12544, 8), (_12543, 8), (_12542, 8), (_12541, 8), (_12540, 8), (_12539, 8), (_12538, 8), (_12537, 8), (_12536, 8), (_12535, 8), (_12534, 8), (_12533, 8), (_12532, 8), (_12531, 8), (_12885, 8), (_12884, 8), (_12883, 8), (_12882, 8), (_12881, 8), (_12880, 8), (_12879, 8), (_12878, 8), (_12877, 8), (_12876, 8), (_12875, 8), (_12874, 8), (_12873, 8), (_12872, 8), (_12871, 8), (_12870, 8), (_12869, 8), (_12868, 8), (_12867, 8), (_12866, 8), (_12865, 8), (_12864, 8), (_12863, 8), (_12862, 8), (_12861, 8), (_12860, 8), (_12859, 8), (_12858, 8), (_12857, 8), (_12856, 8), (_12855, 8), (_12854, 8), (_13208, 8), (_13207, 8), (_13206, 8), (_13205, 8), (_13204, 8), (_13203, 8), (_13202, 8), (_13201, 8), (_13200, 8), (_13199, 8), (_13198, 8), (_13197, 8), (_13196, 8), (_13195, 8), (_13194, 8), (_13193, 8), (_13192, 8), (_13191, 8), (_13190, 8), (_13189, 8), (_13188, 8), (_13187, 8), (_13186, 8), (_13185, 8), (_13184, 8), (_13183, 8), (_13182, 8), (_13181, 8), (_13180, 8), (_13179, 8), (_13178, 8), (_13177, 8), (_13531, 8), (_13530, 8), (_13529, 8), (_13528, 8), (_13527, 8), (_13526, 8), (_13525, 8), (_13524, 8), (_13523, 8), (_13522, 8), (_13521, 8), (_13520, 8), (_13519, 8), (_13518, 8), (_13517, 8), (_13516, 8), (_13515, 8), (_13514, 8), (_13513, 8), (_13512, 8), (_13511, 8), (_13510, 8), (_13509, 8), (_13508, 8), (_13507, 8), (_13506, 8), (_13505, 8), (_13504, 8), (_13503, 8), (_13502, 8), (_13501, 8), (_13500, 8), (_13854, 8), (_13853, 8), (_13852, 8), (_13851, 8), (_13850, 8), (_13849, 8), (_13848, 8), (_13847, 8), (_13846, 8), (_13845, 8), (_13844, 8), (_13843, 8), (_13842, 8), (_13841, 8), (_13840, 8), (_13839, 8), (_13838, 8), (_13837, 8), (_13836, 8), (_13835, 8), (_13834, 8), (_13833, 8), (_13832, 8), (_13831, 8), (_13830, 8), (_13829, 8), (_13828, 8), (_13827, 8), (_13826, 8), (_13825, 8), (_13824, 8), (_13823, 8), (_14177, 8), (_14176, 8), (_14175, 8), (_14174, 8), (_14173, 8), (_14172, 8), (_14171, 8), (_14170, 8), (_14169, 8), (_14168, 8), (_14167, 8), (_14166, 8), (_14165, 8), (_14164, 8), (_14163, 8), (_14162, 8), (_14161, 8), (_14160, 8), (_14159, 8), (_14158, 8), (_14157, 8), (_14156, 8), (_14155, 8), (_14154, 8), (_14153, 8), (_14152, 8), (_14151, 8), (_14150, 8), (_14149, 8), (_14148, 8), (_14147, 8), (_14146, 8), (_14500, 8), (_14499, 8), (_14498, 8), (_14497, 8), (_14496, 8), (_14495, 8), (_14494, 8), (_14493, 8), (_14492, 8), (_14491, 8), (_14490, 8), (_14489, 8), (_14488, 8), (_14487, 8), (_14486, 8), (_14485, 8), (_14484, 8), (_14483, 8), (_14482, 8), (_14481, 8), (_14480, 8), (_14479, 8), (_14478, 8), (_14477, 8), (_14476, 8), (_14475, 8), (_14474, 8), (_14473, 8), (_14472, 8), (_14471, 8), (_14470, 8), (_14469, 8), (_14823, 8), (_14822, 8), (_14821, 8), (_14820, 8), (_14819, 8), (_14818, 8), (_14817, 8), (_14816, 8), (_14815, 8), (_14814, 8), (_14813, 8), (_14812, 8), (_14811, 8), (_14810, 8), (_14809, 8), (_14808, 8), (_14807, 8), (_14806, 8), (_14805, 8), (_14804, 8), (_14803, 8), (_14802, 8), (_14801, 8), (_14800, 8), (_14799, 8), (_14798, 8), (_14797, 8), (_14796, 8), (_14795, 8), (_14794, 8), (_14793, 8), (_14792, 8), (_15146, 8), (_15145, 8), (_15144, 8), (_15143, 8), (_15142, 8), (_15141, 8), (_15140, 8), (_15139, 8), (_15138, 8), (_15137, 8), (_15136, 8), (_15135, 8), (_15134, 8), (_15133, 8), (_15132, 8), (_15131, 8), (_15130, 8), (_15129, 8), (_15128, 8), (_15127, 8), (_15126, 8), (_15125, 8), (_15124, 8), (_15123, 8), (_15122, 8), (_15121, 8), (_15120, 8), (_15119, 8), (_15118, 8), (_15117, 8), (_15116, 8), (_15115, 8), (_15469, 8), (_15468, 8), (_15467, 8), (_15466, 8), (_15465, 8), (_15464, 8), (_15463, 8), (_15462, 8), (_15461, 8), (_15460, 8), (_15459, 8), (_15458, 8), (_15457, 8), (_15456, 8), (_15455, 8), (_15454, 8), (_15453, 8), (_15452, 8), (_15451, 8), (_15450, 8), (_15449, 8), (_15448, 8), (_15447, 8), (_15446, 8), (_15445, 8), (_15444, 8), (_15443, 8), (_15442, 8), (_15441, 8), (_15440, 8), (_15439, 8), (_15438, 8), (_15792, 8), (_15791, 8), (_15790, 8), (_15789, 8), (_15788, 8), (_15787, 8), (_15786, 8), (_15785, 8), (_15784, 8), (_15783, 8), (_15782, 8), (_15781, 8), (_15780, 8), (_15779, 8), (_15778, 8), (_15777, 8), (_15776, 8), (_15775, 8), (_15774, 8), (_15773, 8), (_15772, 8), (_15771, 8), (_15770, 8), (_15769, 8), (_15768, 8), (_15767, 8), (_15766, 8), (_15765, 8), (_15764, 8), (_15763, 8), (_15762, 8), (_15761, 8), (_16115, 8), (_16114, 8), (_16113, 8), (_16112, 8), (_16111, 8), (_16110, 8), (_16109, 8), (_16108, 8), (_16107, 8), (_16106, 8), (_16105, 8), (_16104, 8), (_16103, 8), (_16102, 8), (_16101, 8), (_16100, 8), (_16099, 8), (_16098, 8), (_16097, 8), (_16096, 8), (_16095, 8), (_16094, 8), (_16093, 8), (_16092, 8), (_16091, 8), (_16090, 8), (_16089, 8), (_16088, 8), (_16087, 8), (_16086, 8), (_16085, 8), (_16084, 8), (_16438, 8), (_16437, 8), (_16436, 8), (_16435, 8), (_16434, 8), (_16433, 8), (_16432, 8), (_16431, 8), (_16430, 8), (_16429, 8), (_16428, 8), (_16427, 8), (_16426, 8), (_16425, 8), (_16424, 8), (_16423, 8), (_16422, 8), (_16421, 8), (_16420, 8), (_16419, 8), (_16418, 8), (_16417, 8), (_16416, 8), (_16415, 8), (_16414, 8), (_16413, 8), (_16412, 8), (_16411, 8), (_16410, 8), (_16409, 8), (_16408, 8), (_16407, 8), (_16761, 8), (_16760, 8), (_16759, 8), (_16758, 8), (_16757, 8), (_16756, 8), (_16755, 8), (_16754, 8), (_16753, 8), (_16752, 8), (_16751, 8), (_16750, 8), (_16749, 8), (_16748, 8), (_16747, 8), (_16746, 8), (_16745, 8), (_16744, 8), (_16743, 8), (_16742, 8), (_16741, 8), (_16740, 8), (_16739, 8), (_16738, 8), (_16737, 8), (_16736, 8), (_16735, 8), (_16734, 8), (_16733, 8), (_16732, 8), (_16731, 8), (_16730, 8), (_17084, 8), (_17083, 8), (_17082, 8), (_17081, 8), (_17080, 8), (_17079, 8), (_17078, 8), (_17077, 8), (_17076, 8), (_17075, 8), (_17074, 8), (_17073, 8), (_17072, 8), (_17071, 8), (_17070, 8), (_17069, 8), (_17068, 8), (_17067, 8), (_17066, 8), (_17065, 8), (_17064, 8), (_17063, 8), (_17062, 8), (_17061, 8), (_17060, 8), (_17059, 8), (_17058, 8), (_17057, 8), (_17056, 8), (_17055, 8), (_17054, 8), (_17053, 8), (_17407, 8), (_17406, 8), (_17405, 8), (_17404, 8), (_17403, 8), (_17402, 8), (_17401, 8), (_17400, 8), (_17399, 8), (_17398, 8), (_17397, 8), (_17396, 8), (_17395, 8), (_17394, 8), (_17393, 8), (_17392, 8), (_17391, 8), (_17390, 8), (_17389, 8), (_17388, 8), (_17387, 8), (_17386, 8), (_17385, 8), (_17384, 8), (_17383, 8), (_17382, 8), (_17381, 8), (_17380, 8), (_17379, 8), (_17378, 8), (_17377, 8), (_17376, 8), (_17730, 8), (_17729, 8), (_17728, 8), (_17727, 8), (_17726, 8), (_17725, 8), (_17724, 8), (_17723, 8), (_17722, 8), (_17721, 8), (_17720, 8), (_17719, 8), (_17718, 8), (_17717, 8), (_17716, 8), (_17715, 8), (_17714, 8), (_17713, 8), (_17712, 8), (_17711, 8), (_17710, 8), (_17709, 8), (_17708, 8), (_17707, 8), (_17706, 8), (_17705, 8), (_17704, 8), (_17703, 8), (_17702, 8), (_17701, 8), (_17700, 8), (_17699, 8), (_18053, 8), (_18052, 8), (_18051, 8), (_18050, 8), (_18049, 8), (_18048, 8), (_18047, 8), (_18046, 8), (_18045, 8), (_18044, 8), (_18043, 8), (_18042, 8), (_18041, 8), (_18040, 8), (_18039, 8), (_18038, 8), (_18037, 8), (_18036, 8), (_18035, 8), (_18034, 8), (_18033, 8), (_18032, 8), (_18031, 8), (_18030, 8), (_18029, 8), (_18028, 8), (_18027, 8), (_18026, 8), (_18025, 8), (_18024, 8), (_18023, 8), (_18022, 8), (_18376, 8), (_18375, 8), (_18374, 8), (_18373, 8), (_18372, 8), (_18371, 8), (_18370, 8), (_18369, 8), (_18368, 8), (_18367, 8), (_18366, 8), (_18365, 8), (_18364, 8), (_18363, 8), (_18362, 8), (_18361, 8), (_18360, 8), (_18359, 8), (_18358, 8), (_18357, 8), (_18356, 8), (_18355, 8), (_18354, 8), (_18353, 8), (_18352, 8), (_18351, 8), (_18350, 8), (_18349, 8), (_18348, 8), (_18347, 8), (_18346, 8), (_18345, 8), (_18699, 8), (_18698, 8), (_18697, 8), (_18696, 8), (_18695, 8), (_18694, 8), (_18693, 8), (_18692, 8), (_18691, 8), (_18690, 8), (_18689, 8), (_18688, 8), (_18687, 8), (_18686, 8), (_18685, 8), (_18684, 8), (_18683, 8), (_18682, 8), (_18681, 8), (_18680, 8), (_18679, 8), (_18678, 8), (_18677, 8), (_18676, 8), (_18675, 8), (_18674, 8), (_18673, 8), (_18672, 8), (_18671, 8), (_18670, 8), (_18669, 8), (_18668, 8), (_19022, 8), (_19021, 8), (_19020, 8), (_19019, 8), (_19018, 8), (_19017, 8), (_19016, 8), (_19015, 8), (_19014, 8), (_19013, 8), (_19012, 8), (_19011, 8), (_19010, 8), (_19009, 8), (_19008, 8), (_19007, 8), (_19006, 8), (_19005, 8), (_19004, 8), (_19003, 8), (_19002, 8), (_19001, 8), (_19000, 8), (_18999, 8), (_18998, 8), (_18997, 8), (_18996, 8), (_18995, 8), (_18994, 8), (_18993, 8), (_18992, 8), (_18991, 8), (_19345, 8), (_19344, 8), (_19343, 8), (_19342, 8), (_19341, 8), (_19340, 8), (_19339, 8), (_19338, 8), (_19337, 8), (_19336, 8), (_19335, 8), (_19334, 8), (_19333, 8), (_19332, 8), (_19331, 8), (_19330, 8), (_19329, 8), (_19328, 8), (_19327, 8), (_19326, 8), (_19325, 8), (_19324, 8), (_19323, 8), (_19322, 8), (_19321, 8), (_19320, 8), (_19319, 8), (_19318, 8), (_19317, 8), (_19316, 8), (_19315, 8), (_19314, 8), (_19668, 8), (_19667, 8), (_19666, 8), (_19665, 8), (_19664, 8), (_19663, 8), (_19662, 8), (_19661, 8), (_19660, 8), (_19659, 8), (_19658, 8), (_19657, 8), (_19656, 8), (_19655, 8), (_19654, 8), (_19653, 8), (_19652, 8), (_19651, 8), (_19650, 8), (_19649, 8), (_19648, 8), (_19647, 8), (_19646, 8), (_19645, 8), (_19644, 8), (_19643, 8), (_19642, 8), (_19641, 8), (_19640, 8), (_19639, 8), (_19638, 8), (_19637, 8), (_19991, 8), (_19990, 8), (_19989, 8), (_19988, 8), (_19987, 8), (_19986, 8), (_19985, 8), (_19984, 8), (_19983, 8), (_19982, 8), (_19981, 8), (_19980, 8), (_19979, 8), (_19978, 8), (_19977, 8), (_19976, 8), (_19975, 8), (_19974, 8), (_19973, 8), (_19972, 8), (_19971, 8), (_19970, 8), (_19969, 8), (_19968, 8), (_19967, 8), (_19966, 8), (_19965, 8), (_19964, 8), (_19963, 8), (_19962, 8), (_19961, 8), (_19960, 8), (_20314, 8), (_20313, 8), (_20312, 8), (_20311, 8), (_20310, 8), (_20309, 8), (_20308, 8), (_20307, 8), (_20306, 8), (_20305, 8), (_20304, 8), (_20303, 8), (_20302, 8), (_20301, 8), (_20300, 8), (_20299, 8), (_20298, 8), (_20297, 8), (_20296, 8), (_20295, 8), (_20294, 8), (_20293, 8), (_20292, 8), (_20291, 8), (_20290, 8), (_20289, 8), (_20288, 8), (_20287, 8), (_20286, 8), (_20285, 8), (_20284, 8), (_20283, 8), (_20637, 8), (_20636, 8), (_20635, 8), (_20634, 8), (_20633, 8), (_20632, 8), (_20631, 8), (_20630, 8), (_20629, 8), (_20628, 8), (_20627, 8), (_20626, 8), (_20625, 8), (_20624, 8), (_20623, 8), (_20622, 8), (_20621, 8), (_20620, 8), (_20619, 8), (_20618, 8), (_20617, 8), (_20616, 8), (_20615, 8), (_20614, 8), (_20613, 8), (_20612, 8), (_20611, 8), (_20610, 8), (_20609, 8), (_20608, 8), (_20607, 8), (_20606, 8), (_20960, 8), (_20959, 8), (_20958, 8), (_20957, 8), (_20956, 8), (_20955, 8), (_20954, 8), (_20953, 8), (_20952, 8), (_20951, 8), (_20950, 8), (_20949, 8), (_20948, 8), (_20947, 8), (_20946, 8), (_20945, 8), (_20944, 8), (_20943, 8), (_20942, 8), (_20941, 8), (_20940, 8), (_20939, 8), (_20938, 8), (_20937, 8), (_20936, 8), (_20935, 8), (_20934, 8), (_20933, 8), (_20932, 8), (_20931, 8), (_20930, 8), (_20929, 8), (_21283, 8), (_21282, 8), (_21281, 8), (_21280, 8), (_21279, 8), (_21278, 8), (_21277, 8), (_21276, 8), (_21275, 8), (_21274, 8), (_21273, 8), (_21272, 8), (_21271, 8), (_21270, 8), (_21269, 8), (_21268, 8), (_21267, 8), (_21266, 8), (_21265, 8), (_21264, 8), (_21263, 8), (_21262, 8), (_21261, 8), (_21260, 8), (_21259, 8), (_21258, 8), (_21257, 8), (_21256, 8), (_21255, 8), (_21254, 8), (_21253, 8), (_21252, 8), (_21606, 8), (_21605, 8), (_21604, 8), (_21603, 8), (_21602, 8), (_21601, 8), (_21600, 8), (_21599, 8), (_21598, 8), (_21597, 8), (_21596, 8), (_21595, 8), (_21594, 8), (_21593, 8), (_21592, 8), (_21591, 8), (_21590, 8), (_21589, 8), (_21588, 8), (_21587, 8), (_21586, 8), (_21585, 8), (_21584, 8), (_21583, 8), (_21582, 8), (_21581, 8), (_21580, 8), (_21579, 8), (_21578, 8), (_21577, 8), (_21576, 8), (_21575, 8), (_21929, 8), (_21928, 8), (_21927, 8), (_21926, 8), (_21925, 8), (_21924, 8), (_21923, 8), (_21922, 8), (_21921, 8), (_21920, 8), (_21919, 8), (_21918, 8), (_21917, 8), (_21916, 8), (_21915, 8), (_21914, 8), (_21913, 8), (_21912, 8), (_21911, 8), (_21910, 8), (_21909, 8), (_21908, 8), (_21907, 8), (_21906, 8), (_21905, 8), (_21904, 8), (_21903, 8), (_21902, 8), (_21901, 8), (_21900, 8), (_21899, 8), (_21898, 8), (_22252, 8), (_22251, 8), (_22250, 8), (_22249, 8), (_22248, 8), (_22247, 8), (_22246, 8), (_22245, 8), (_22244, 8), (_22243, 8), (_22242, 8), (_22241, 8), (_22240, 8), (_22239, 8), (_22238, 8), (_22237, 8), (_22236, 8), (_22235, 8), (_22234, 8), (_22233, 8), (_22232, 8), (_22231, 8), (_22230, 8), (_22229, 8), (_22228, 8), (_22227, 8), (_22226, 8), (_22225, 8), (_22224, 8), (_22223, 8), (_22222, 8), (_22221, 8), (_22575, 8), (_22574, 8), (_22573, 8), (_22572, 8), (_22571, 8), (_22570, 8), (_22569, 8), (_22568, 8), (_22567, 8), (_22566, 8), (_22565, 8), (_22564, 8), (_22563, 8), (_22562, 8), (_22561, 8), (_22560, 8), (_22559, 8), (_22558, 8), (_22557, 8), (_22556, 8), (_22555, 8), (_22554, 8), (_22553, 8), (_22552, 8), (_22551, 8), (_22550, 8), (_22549, 8), (_22548, 8), (_22547, 8), (_22546, 8), (_22545, 8), (_22544, 8), (_22898, 8), (_22897, 8), (_22896, 8), (_22895, 8), (_22894, 8), (_22893, 8), (_22892, 8), (_22891, 8), (_22890, 8), (_22889, 8), (_22888, 8), (_22887, 8), (_22886, 8), (_22885, 8), (_22884, 8), (_22883, 8), (_22882, 8), (_22881, 8), (_22880, 8), (_22879, 8), (_22878, 8), (_22877, 8), (_22876, 8), (_22875, 8), (_22874, 8), (_22873, 8), (_22872, 8), (_22871, 8), (_22870, 8), (_22869, 8), (_22868, 8), (_22867, 8), (_23221, 8), (_23220, 8), (_23219, 8), (_23218, 8), (_23217, 8), (_23216, 8), (_23215, 8), (_23214, 8), (_23213, 8), (_23212, 8), (_23211, 8), (_23210, 8), (_23209, 8), (_23208, 8), (_23207, 8), (_23206, 8), (_23205, 8), (_23204, 8), (_23203, 8), (_23202, 8), (_23201, 8), (_23200, 8), (_23199, 8), (_23198, 8), (_23197, 8), (_23196, 8), (_23195, 8), (_23194, 8), (_23193, 8), (_23192, 8), (_23191, 8), (_23190, 8), (_23544, 8), (_23543, 8), (_23542, 8), (_23541, 8), (_23540, 8), (_23539, 8), (_23538, 8), (_23537, 8), (_23536, 8), (_23535, 8), (_23534, 8), (_23533, 8), (_23532, 8), (_23531, 8), (_23530, 8), (_23529, 8), (_23528, 8), (_23527, 8), (_23526, 8), (_23525, 8), (_23524, 8), (_23523, 8), (_23522, 8), (_23521, 8), (_23520, 8), (_23519, 8), (_23518, 8), (_23517, 8), (_23516, 8), (_23515, 8), (_23514, 8), (_23513, 8), (_23867, 8), (_23866, 8), (_23865, 8), (_23864, 8), (_23863, 8), (_23862, 8), (_23861, 8), (_23860, 8), (_23859, 8), (_23858, 8), (_23857, 8), (_23856, 8), (_23855, 8), (_23854, 8), (_23853, 8), (_23852, 8), (_23851, 8), (_23850, 8), (_23849, 8), (_23848, 8), (_23847, 8), (_23846, 8), (_23845, 8), (_23844, 8), (_23843, 8), (_23842, 8), (_23841, 8), (_23840, 8), (_23839, 8), (_23838, 8), (_23837, 8), (_23836, 8), (_24190, 8), (_24189, 8), (_24188, 8), (_24187, 8), (_24186, 8), (_24185, 8), (_24184, 8), (_24183, 8), (_24182, 8), (_24181, 8), (_24180, 8), (_24179, 8), (_24178, 8), (_24177, 8), (_24176, 8), (_24175, 8), (_24174, 8), (_24173, 8), (_24172, 8), (_24171, 8), (_24170, 8), (_24169, 8), (_24168, 8), (_24167, 8), (_24166, 8), (_24165, 8), (_24164, 8), (_24163, 8), (_24162, 8), (_24161, 8), (_24160, 8), (_24159, 8), (_24513, 8), (_24512, 8), (_24511, 8), (_24510, 8), (_24509, 8), (_24508, 8), (_24507, 8), (_24506, 8), (_24505, 8), (_24504, 8), (_24503, 8), (_24502, 8), (_24501, 8), (_24500, 8), (_24499, 8), (_24498, 8), (_24497, 8), (_24496, 8), (_24495, 8), (_24494, 8), (_24493, 8), (_24492, 8), (_24491, 8), (_24490, 8), (_24489, 8), (_24488, 8), (_24487, 8), (_24486, 8), (_24485, 8), (_24484, 8), (_24483, 8), (_24482, 8), (_24836, 8), (_24835, 8), (_24834, 8), (_24833, 8), (_24832, 8), (_24831, 8), (_24830, 8), (_24829, 8), (_24828, 8), (_24827, 8), (_24826, 8), (_24825, 8), (_24824, 8), (_24823, 8), (_24822, 8), (_24821, 8), (_24820, 8), (_24819, 8), (_24818, 8), (_24817, 8), (_24816, 8), (_24815, 8), (_24814, 8), (_24813, 8), (_24812, 8), (_24811, 8), (_24810, 8), (_24809, 8), (_24808, 8), (_24807, 8), (_24806, 8), (_24805, 8), (_25159, 8), (_25158, 8), (_25157, 8), (_25156, 8), (_25155, 8), (_25154, 8), (_25153, 8), (_25152, 8), (_25151, 8), (_25150, 8), (_25149, 8), (_25148, 8), (_25147, 8), (_25146, 8), (_25145, 8), (_25144, 8), (_25143, 8), (_25142, 8), (_25141, 8), (_25140, 8), (_25139, 8), (_25138, 8), (_25137, 8), (_25136, 8), (_25135, 8), (_25134, 8), (_25133, 8), (_25132, 8), (_25131, 8), (_25130, 8), (_25129, 8), (_25128, 8), (_25482, 8), (_25481, 8), (_25480, 8), (_25479, 8), (_25478, 8), (_25477, 8), (_25476, 8), (_25475, 8), (_25474, 8), (_25473, 8), (_25472, 8), (_25471, 8), (_25470, 8), (_25469, 8), (_25468, 8), (_25467, 8), (_25466, 8), (_25465, 8), (_25464, 8), (_25463, 8), (_25462, 8), (_25461, 8), (_25460, 8), (_25459, 8), (_25458, 8), (_25457, 8), (_25456, 8), (_25455, 8), (_25454, 8), (_25453, 8), (_25452, 8), (_25451, 8), (_25805, 8), (_25804, 8), (_25803, 8), (_25802, 8), (_25801, 8), (_25800, 8), (_25799, 8), (_25798, 8), (_25797, 8), (_25796, 8), (_25795, 8), (_25794, 8), (_25793, 8), (_25792, 8), (_25791, 8), (_25790, 8), (_25789, 8), (_25788, 8), (_25787, 8), (_25786, 8), (_25785, 8), (_25784, 8), (_25783, 8), (_25782, 8), (_25781, 8), (_25780, 8), (_25779, 8), (_25778, 8), (_25777, 8), (_25776, 8), (_25775, 8), (_25774, 8), (_26128, 8), (_26127, 8), (_26126, 8), (_26125, 8), (_26124, 8), (_26123, 8), (_26122, 8), (_26121, 8), (_26120, 8), (_26119, 8), (_26118, 8), (_26117, 8), (_26116, 8), (_26115, 8), (_26114, 8), (_26113, 8), (_26112, 8), (_26111, 8), (_26110, 8), (_26109, 8), (_26108, 8), (_26107, 8), (_26106, 8), (_26105, 8), (_26104, 8), (_26103, 8), (_26102, 8), (_26101, 8), (_26100, 8), (_26099, 8), (_26098, 8), (_26097, 8), (_26451, 8), (_26450, 8), (_26449, 8), (_26448, 8), (_26447, 8), (_26446, 8), (_26445, 8), (_26444, 8), (_26443, 8), (_26442, 8), (_26441, 8), (_26440, 8), (_26439, 8), (_26438, 8), (_26437, 8), (_26436, 8), (_26435, 8), (_26434, 8), (_26433, 8), (_26432, 8), (_26431, 8), (_26430, 8), (_26429, 8), (_26428, 8), (_26427, 8), (_26426, 8), (_26425, 8), (_26424, 8), (_26423, 8), (_26422, 8), (_26421, 8), (_26420, 8), (_26774, 8), (_26773, 8), (_26772, 8), (_26771, 8), (_26770, 8), (_26769, 8), (_26768, 8), (_26767, 8), (_26766, 8), (_26765, 8), (_26764, 8), (_26763, 8), (_26762, 8), (_26761, 8), (_26760, 8), (_26759, 8), (_26758, 8), (_26757, 8), (_26756, 8), (_26755, 8), (_26754, 8), (_26753, 8), (_26752, 8), (_26751, 8), (_26750, 8), (_26749, 8), (_26748, 8), (_26747, 8), (_26746, 8), (_26745, 8), (_26744, 8), (_26743, 8), (_27097, 8), (_27096, 8), (_27095, 8), (_27094, 8), (_27093, 8), (_27092, 8), (_27091, 8), (_27090, 8), (_27089, 8), (_27088, 8), (_27087, 8), (_27086, 8), (_27085, 8), (_27084, 8), (_27083, 8), (_27082, 8), (_27081, 8), (_27080, 8), (_27079, 8), (_27078, 8), (_27077, 8), (_27076, 8), (_27075, 8), (_27074, 8), (_27073, 8), (_27072, 8), (_27071, 8), (_27070, 8), (_27069, 8), (_27068, 8), (_27067, 8), (_27066, 8), (_27420, 8), (_27419, 8), (_27418, 8), (_27417, 8), (_27416, 8), (_27415, 8), (_27414, 8), (_27413, 8), (_27412, 8), (_27411, 8), (_27410, 8), (_27409, 8), (_27408, 8), (_27407, 8), (_27406, 8), (_27405, 8), (_27404, 8), (_27403, 8), (_27402, 8), (_27401, 8), (_27400, 8), (_27399, 8), (_27398, 8), (_27397, 8), (_27396, 8), (_27395, 8), (_27394, 8), (_27393, 8), (_27392, 8), (_27391, 8), (_27390, 8), (_27389, 8), (_27743, 8), (_27742, 8), (_27741, 8), (_27740, 8), (_27739, 8), (_27738, 8), (_27737, 8), (_27736, 8), (_27735, 8), (_27734, 8), (_27733, 8), (_27732, 8), (_27731, 8), (_27730, 8), (_27729, 8), (_27728, 8), (_27727, 8), (_27726, 8), (_27725, 8), (_27724, 8), (_27723, 8), (_27722, 8), (_27721, 8), (_27720, 8), (_27719, 8), (_27718, 8), (_27717, 8), (_27716, 8), (_27715, 8), (_27714, 8), (_27713, 8), (_27712, 8), (_28066, 8), (_28065, 8), (_28064, 8), (_28063, 8), (_28062, 8), (_28061, 8), (_28060, 8), (_28059, 8), (_28058, 8), (_28057, 8), (_28056, 8), (_28055, 8), (_28054, 8), (_28053, 8), (_28052, 8), (_28051, 8), (_28050, 8), (_28049, 8), (_28048, 8), (_28047, 8), (_28046, 8), (_28045, 8), (_28044, 8), (_28043, 8), (_28042, 8), (_28041, 8), (_28040, 8), (_28039, 8), (_28038, 8), (_28037, 8), (_28036, 8), (_28035, 8), (_28389, 8), (_28388, 8), (_28387, 8), (_28386, 8), (_28385, 8), (_28384, 8), (_28383, 8), (_28382, 8), (_28381, 8), (_28380, 8), (_28379, 8), (_28378, 8), (_28377, 8), (_28376, 8), (_28375, 8), (_28374, 8), (_28373, 8), (_28372, 8), (_28371, 8), (_28370, 8), (_28369, 8), (_28368, 8), (_28367, 8), (_28366, 8), (_28365, 8), (_28364, 8), (_28363, 8), (_28362, 8), (_28361, 8), (_28360, 8), (_28359, 8), (_28358, 8), (_28712, 8), (_28711, 8), (_28710, 8), (_28709, 8), (_28708, 8), (_28707, 8), (_28706, 8), (_28705, 8), (_28704, 8), (_28703, 8), (_28702, 8), (_28701, 8), (_28700, 8), (_28699, 8), (_28698, 8), (_28697, 8), (_28696, 8), (_28695, 8), (_28694, 8), (_28693, 8), (_28692, 8), (_28691, 8), (_28690, 8), (_28689, 8), (_28688, 8), (_28687, 8), (_28686, 8), (_28685, 8), (_28684, 8), (_28683, 8), (_28682, 8), (_28681, 8), (_29035, 8), (_29034, 8), (_29033, 8), (_29032, 8), (_29031, 8), (_29030, 8), (_29029, 8), (_29028, 8), (_29027, 8), (_29026, 8), (_29025, 8), (_29024, 8), (_29023, 8), (_29022, 8), (_29021, 8), (_29020, 8), (_29019, 8), (_29018, 8), (_29017, 8), (_29016, 8), (_29015, 8), (_29014, 8), (_29013, 8), (_29012, 8), (_29011, 8), (_29010, 8), (_29009, 8), (_29008, 8), (_29007, 8), (_29006, 8), (_29005, 8), (_29004, 8), (_29358, 8), (_29357, 8), (_29356, 8), (_29355, 8), (_29354, 8), (_29353, 8), (_29352, 8), (_29351, 8), (_29350, 8), (_29349, 8), (_29348, 8), (_29347, 8), (_29346, 8), (_29345, 8), (_29344, 8), (_29343, 8), (_29342, 8), (_29341, 8), (_29340, 8), (_29339, 8), (_29338, 8), (_29337, 8), (_29336, 8), (_29335, 8), (_29334, 8), (_29333, 8), (_29332, 8), (_29331, 8), (_29330, 8), (_29329, 8), (_29328, 8), (_29327, 8), (_29681, 8), (_29680, 8), (_29679, 8), (_29678, 8), (_29677, 8), (_29676, 8), (_29675, 8), (_29674, 8), (_29673, 8), (_29672, 8), (_29671, 8), (_29670, 8), (_29669, 8), (_29668, 8), (_29667, 8), (_29666, 8), (_29665, 8), (_29664, 8), (_29663, 8), (_29662, 8), (_29661, 8), (_29660, 8), (_29659, 8), (_29658, 8), (_29657, 8), (_29656, 8), (_29655, 8), (_29654, 8), (_29653, 8), (_29652, 8), (_29651, 8), (_29650, 8), (_30004, 8), (_30003, 8), (_30002, 8), (_30001, 8), (_30000, 8), (_29999, 8), (_29998, 8), (_29997, 8), (_29996, 8), (_29995, 8), (_29994, 8), (_29993, 8), (_29992, 8), (_29991, 8), (_29990, 8), (_29989, 8), (_29988, 8), (_29987, 8), (_29986, 8), (_29985, 8), (_29984, 8), (_29983, 8), (_29982, 8), (_29981, 8), (_29980, 8), (_29979, 8), (_29978, 8), (_29977, 8), (_29976, 8), (_29975, 8), (_29974, 8), (_29973, 8), (_30327, 8), (_30326, 8), (_30325, 8), (_30324, 8), (_30323, 8), (_30322, 8), (_30321, 8), (_30320, 8), (_30319, 8), (_30318, 8), (_30317, 8), (_30316, 8), (_30315, 8), (_30314, 8), (_30313, 8), (_30312, 8), (_30311, 8), (_30310, 8), (_30309, 8), (_30308, 8), (_30307, 8), (_30306, 8), (_30305, 8), (_30304, 8), (_30303, 8), (_30302, 8), (_30301, 8), (_30300, 8), (_30299, 8), (_30298, 8), (_30297, 8), (_30296, 8), (_30650, 8), (_30649, 8), (_30648, 8), (_30647, 8), (_30646, 8), (_30645, 8), (_30644, 8), (_30643, 8), (_30642, 8), (_30641, 8), (_30640, 8), (_30639, 8), (_30638, 8), (_30637, 8), (_30636, 8), (_30635, 8), (_30634, 8), (_30633, 8), (_30632, 8), (_30631, 8), (_30630, 8), (_30629, 8), (_30628, 8), (_30627, 8), (_30626, 8), (_30625, 8), (_30624, 8), (_30623, 8), (_30622, 8), (_30621, 8), (_30620, 8), (_30619, 8), (_30973, 8), (_30972, 8), (_30971, 8), (_30970, 8), (_30969, 8), (_30968, 8), (_30967, 8), (_30966, 8), (_30965, 8), (_30964, 8), (_30963, 8), (_30962, 8), (_30961, 8), (_30960, 8), (_30959, 8), (_30958, 8), (_30957, 8), (_30956, 8), (_30955, 8), (_30954, 8), (_30953, 8), (_30952, 8), (_30951, 8), (_30950, 8), (_30949, 8), (_30948, 8), (_30947, 8), (_30946, 8), (_30945, 8), (_30944, 8), (_30943, 8), (_30942, 8), (_31296, 8), (_31295, 8), (_31294, 8), (_31293, 8), (_31292, 8), (_31291, 8), (_31290, 8), (_31289, 8), (_31288, 8), (_31287, 8), (_31286, 8), (_31285, 8), (_31284, 8), (_31283, 8), (_31282, 8), (_31281, 8), (_31280, 8), (_31279, 8), (_31278, 8), (_31277, 8), (_31276, 8), (_31275, 8), (_31274, 8), (_31273, 8), (_31272, 8), (_31271, 8), (_31270, 8), (_31269, 8), (_31268, 8), (_31267, 8), (_31266, 8), (_31265, 8), (_31619, 8), (_31618, 8), (_31617, 8), (_31616, 8), (_31615, 8), (_31614, 8), (_31613, 8), (_31612, 8), (_31611, 8), (_31610, 8), (_31609, 8), (_31608, 8), (_31607, 8), (_31606, 8), (_31605, 8), (_31604, 8), (_31603, 8), (_31602, 8), (_31601, 8), (_31600, 8), (_31599, 8), (_31598, 8), (_31597, 8), (_31596, 8), (_31595, 8), (_31594, 8), (_31593, 8), (_31592, 8), (_31591, 8), (_31590, 8), (_31589, 8), (_31588, 8), (_31942, 8), (_31941, 8), (_31940, 8), (_31939, 8), (_31938, 8), (_31937, 8), (_31936, 8), (_31935, 8), (_31934, 8), (_31933, 8), (_31932, 8), (_31931, 8), (_31930, 8), (_31929, 8), (_31928, 8), (_31927, 8), (_31926, 8), (_31925, 8), (_31924, 8), (_31923, 8), (_31922, 8), (_31921, 8), (_31920, 8), (_31919, 8), (_31918, 8), (_31917, 8), (_31916, 8), (_31915, 8), (_31914, 8), (_31913, 8), (_31912, 8), (_31911, 8), (_32265, 8), (_32264, 8), (_32263, 8), (_32262, 8), (_32261, 8), (_32260, 8), (_32259, 8), (_32258, 8), (_32257, 8), (_32256, 8), (_32255, 8), (_32254, 8), (_32253, 8), (_32252, 8), (_32251, 8), (_32250, 8), (_32249, 8), (_32248, 8), (_32247, 8), (_32246, 8), (_32245, 8), (_32244, 8), (_32243, 8), (_32242, 8), (_32241, 8), (_32240, 8), (_32239, 8), (_32238, 8), (_32237, 8), (_32236, 8), (_32235, 8), (_32234, 8), (_32588, 8), (_32587, 8), (_32586, 8), (_32585, 8), (_32584, 8), (_32583, 8), (_32582, 8), (_32581, 8), (_32580, 8), (_32579, 8), (_32578, 8), (_32577, 8), (_32576, 8), (_32575, 8), (_32574, 8), (_32573, 8), (_32572, 8), (_32571, 8), (_32570, 8), (_32569, 8), (_32568, 8), (_32567, 8), (_32566, 8), (_32565, 8), (_32564, 8), (_32563, 8), (_32562, 8), (_32561, 8), (_32560, 8), (_32559, 8), (_32558, 8), (_32557, 8), (_32911, 8), (_32910, 8), (_32909, 8), (_32908, 8), (_32907, 8), (_32906, 8), (_32905, 8), (_32904, 8), (_32903, 8), (_32902, 8), (_32901, 8), (_32900, 8), (_32899, 8), (_32898, 8), (_32897, 8), (_32896, 8), (_32895, 8), (_32894, 8), (_32893, 8), (_32892, 8), (_32891, 8), (_32890, 8), (_32889, 8), (_32888, 8), (_32887, 8), (_32886, 8), (_32885, 8), (_32884, 8), (_32883, 8), (_32882, 8), (_32881, 8), (_32880, 8), (_33234, 8), (_33233, 8), (_33232, 8), (_33231, 8), (_33230, 8), (_33229, 8), (_33228, 8), (_33227, 8), (_33226, 8), (_33225, 8), (_33224, 8), (_33223, 8), (_33222, 8), (_33221, 8), (_33220, 8), (_33219, 8), (_33218, 8), (_33217, 8), (_33216, 8), (_33215, 8), (_33214, 8), (_33213, 8), (_33212, 8), (_33211, 8), (_33210, 8), (_33209, 8), (_33208, 8), (_33207, 8), (_33206, 8), (_33205, 8), (_33204, 8), (_33203, 8), (_33557, 8), (_33556, 8), (_33555, 8), (_33554, 8), (_33553, 8), (_33552, 8), (_33551, 8), (_33550, 8), (_33549, 8), (_33548, 8), (_33547, 8), (_33546, 8), (_33545, 8), (_33544, 8), (_33543, 8), (_33542, 8), (_33541, 8), (_33540, 8), (_33539, 8), (_33538, 8), (_33537, 8), (_33536, 8), (_33535, 8), (_33534, 8), (_33533, 8), (_33532, 8), (_33531, 8), (_33530, 8), (_33529, 8), (_33528, 8), (_33527, 8), (_33526, 8), (_33880, 8), (_33879, 8), (_33878, 8), (_33877, 8), (_33876, 8), (_33875, 8), (_33874, 8), (_33873, 8), (_33872, 8), (_33871, 8), (_33870, 8), (_33869, 8), (_33868, 8), (_33867, 8), (_33866, 8), (_33865, 8), (_33864, 8), (_33863, 8), (_33862, 8), (_33861, 8), (_33860, 8), (_33859, 8), (_33858, 8), (_33857, 8), (_33856, 8), (_33855, 8), (_33854, 8), (_33853, 8), (_33852, 8), (_33851, 8), (_33850, 8), (_33849, 8), (_34203, 8), (_34202, 8), (_34201, 8), (_34200, 8), (_34199, 8), (_34198, 8), (_34197, 8), (_34196, 8), (_34195, 8), (_34194, 8), (_34193, 8), (_34192, 8), (_34191, 8), (_34190, 8), (_34189, 8), (_34188, 8), (_34187, 8), (_34186, 8), (_34185, 8), (_34184, 8), (_34183, 8), (_34182, 8), (_34181, 8), (_34180, 8), (_34179, 8), (_34178, 8), (_34177, 8), (_34176, 8), (_34175, 8), (_34174, 8), (_34173, 8), (_34172, 8), (_34526, 8), (_34525, 8), (_34524, 8), (_34523, 8), (_34522, 8), (_34521, 8), (_34520, 8), (_34519, 8), (_34518, 8), (_34517, 8), (_34516, 8), (_34515, 8), (_34514, 8), (_34513, 8), (_34512, 8), (_34511, 8), (_34510, 8), (_34509, 8), (_34508, 8), (_34507, 8), (_34506, 8), (_34505, 8), (_34504, 8), (_34503, 8), (_34502, 8), (_34501, 8), (_34500, 8), (_34499, 8), (_34498, 8), (_34497, 8), (_34496, 8), (_34495, 8), (_34849, 8), (_34848, 8), (_34847, 8), (_34846, 8), (_34845, 8), (_34844, 8), (_34843, 8), (_34842, 8), (_34841, 8), (_34840, 8), (_34839, 8), (_34838, 8), (_34837, 8), (_34836, 8), (_34835, 8), (_34834, 8), (_34833, 8), (_34832, 8), (_34831, 8), (_34830, 8), (_34829, 8), (_34828, 8), (_34827, 8), (_34826, 8), (_34825, 8), (_34824, 8), (_34823, 8), (_34822, 8), (_34821, 8), (_34820, 8), (_34819, 8), (_34818, 8), (_35172, 8), (_35171, 8), (_35170, 8), (_35169, 8), (_35168, 8), (_35167, 8), (_35166, 8), (_35165, 8), (_35164, 8), (_35163, 8), (_35162, 8), (_35161, 8), (_35160, 8), (_35159, 8), (_35158, 8), (_35157, 8), (_35156, 8), (_35155, 8), (_35154, 8), (_35153, 8), (_35152, 8), (_35151, 8), (_35150, 8), (_35149, 8), (_35148, 8), (_35147, 8), (_35146, 8), (_35145, 8), (_35144, 8), (_35143, 8), (_35142, 8), (_35141, 8), (_35495, 8), (_35494, 8), (_35493, 8), (_35492, 8), (_35491, 8), (_35490, 8), (_35489, 8), (_35488, 8), (_35487, 8), (_35486, 8), (_35485, 8), (_35484, 8), (_35483, 8), (_35482, 8), (_35481, 8), (_35480, 8), (_35479, 8), (_35478, 8), (_35477, 8), (_35476, 8), (_35475, 8), (_35474, 8), (_35473, 8), (_35472, 8), (_35471, 8), (_35470, 8), (_35469, 8), (_35468, 8), (_35467, 8), (_35466, 8), (_35465, 8), (_35464, 8), (_35818, 8), (_35817, 8), (_35816, 8), (_35815, 8), (_35814, 8), (_35813, 8), (_35812, 8), (_35811, 8), (_35810, 8), (_35809, 8), (_35808, 8), (_35807, 8), (_35806, 8), (_35805, 8), (_35804, 8), (_35803, 8), (_35802, 8), (_35801, 8), (_35800, 8), (_35799, 8), (_35798, 8), (_35797, 8), (_35796, 8), (_35795, 8), (_35794, 8), (_35793, 8), (_35792, 8), (_35791, 8), (_35790, 8), (_35789, 8), (_35788, 8), (_35787, 8), (_36141, 8), (_36140, 8), (_36139, 8), (_36138, 8), (_36137, 8), (_36136, 8), (_36135, 8), (_36134, 8), (_36133, 8), (_36132, 8), (_36131, 8), (_36130, 8), (_36129, 8), (_36128, 8), (_36127, 8), (_36126, 8), (_36125, 8), (_36124, 8), (_36123, 8), (_36122, 8), (_36121, 8), (_36120, 8), (_36119, 8), (_36118, 8), (_36117, 8), (_36116, 8), (_36115, 8), (_36114, 8), (_36113, 8), (_36112, 8), (_36111, 8), (_36110, 8), (_36464, 8), (_36463, 8), (_36462, 8), (_36461, 8), (_36460, 8), (_36459, 8), (_36458, 8), (_36457, 8), (_36456, 8), (_36455, 8), (_36454, 8), (_36453, 8), (_36452, 8), (_36451, 8), (_36450, 8), (_36449, 8), (_36448, 8), (_36447, 8), (_36446, 8), (_36445, 8), (_36444, 8), (_36443, 8), (_36442, 8), (_36441, 8), (_36440, 8), (_36439, 8), (_36438, 8), (_36437, 8), (_36436, 8), (_36435, 8), (_36434, 8), (_36433, 8), (_36787, 8), (_36786, 8), (_36785, 8), (_36784, 8), (_36783, 8), (_36782, 8), (_36781, 8), (_36780, 8), (_36779, 8), (_36778, 8), (_36777, 8), (_36776, 8), (_36775, 8), (_36774, 8), (_36773, 8), (_36772, 8), (_36771, 8), (_36770, 8), (_36769, 8), (_36768, 8), (_36767, 8), (_36766, 8), (_36765, 8), (_36764, 8), (_36763, 8), (_36762, 8), (_36761, 8), (_36760, 8), (_36759, 8), (_36758, 8), (_36757, 8), (_36756, 8), (_37110, 8), (_37109, 8), (_37108, 8), (_37107, 8), (_37106, 8), (_37105, 8), (_37104, 8), (_37103, 8), (_37102, 8), (_37101, 8), (_37100, 8), (_37099, 8), (_37098, 8), (_37097, 8), (_37096, 8), (_37095, 8), (_37094, 8), (_37093, 8), (_37092, 8), (_37091, 8), (_37090, 8), (_37089, 8), (_37088, 8), (_37087, 8), (_37086, 8), (_37085, 8), (_37084, 8), (_37083, 8), (_37082, 8), (_37081, 8), (_37080, 8), (_37079, 8), (_37433, 8), (_37432, 8), (_37431, 8), (_37430, 8), (_37429, 8), (_37428, 8), (_37427, 8), (_37426, 8), (_37425, 8), (_37424, 8), (_37423, 8), (_37422, 8), (_37421, 8), (_37420, 8), (_37419, 8), (_37418, 8), (_37417, 8), (_37416, 8), (_37415, 8), (_37414, 8), (_37413, 8), (_37412, 8), (_37411, 8), (_37410, 8), (_37409, 8), (_37408, 8), (_37407, 8), (_37406, 8), (_37405, 8), (_37404, 8), (_37403, 8), (_37402, 8), (_37756, 8), (_37755, 8), (_37754, 8), (_37753, 8), (_37752, 8), (_37751, 8), (_37750, 8), (_37749, 8), (_37748, 8), (_37747, 8), (_37746, 8), (_37745, 8), (_37744, 8), (_37743, 8), (_37742, 8), (_37741, 8), (_37740, 8), (_37739, 8), (_37738, 8), (_37737, 8), (_37736, 8), (_37735, 8), (_37734, 8), (_37733, 8), (_37732, 8), (_37731, 8), (_37730, 8), (_37729, 8), (_37728, 8), (_37727, 8), (_37726, 8), (_37725, 8), (_38079, 8), (_38078, 8), (_38077, 8), (_38076, 8), (_38075, 8), (_38074, 8), (_38073, 8), (_38072, 8), (_38071, 8), (_38070, 8), (_38069, 8), (_38068, 8), (_38067, 8), (_38066, 8), (_38065, 8), (_38064, 8), (_38063, 8), (_38062, 8), (_38061, 8), (_38060, 8), (_38059, 8), (_38058, 8), (_38057, 8), (_38056, 8), (_38055, 8), (_38054, 8), (_38053, 8), (_38052, 8), (_38051, 8), (_38050, 8), (_38049, 8), (_38048, 8), (_38402, 8), (_38401, 8), (_38400, 8), (_38399, 8), (_38398, 8), (_38397, 8), (_38396, 8), (_38395, 8), (_38394, 8), (_38393, 8), (_38392, 8), (_38391, 8), (_38390, 8), (_38389, 8), (_38388, 8), (_38387, 8), (_38386, 8), (_38385, 8), (_38384, 8), (_38383, 8), (_38382, 8), (_38381, 8), (_38380, 8), (_38379, 8), (_38378, 8), (_38377, 8), (_38376, 8), (_38375, 8), (_38374, 8), (_38373, 8), (_38372, 8), (_38371, 8), (_38725, 8), (_38724, 8), (_38723, 8), (_38722, 8), (_38721, 8), (_38720, 8), (_38719, 8), (_38718, 8), (_38717, 8), (_38716, 8), (_38715, 8), (_38714, 8), (_38713, 8), (_38712, 8), (_38711, 8), (_38710, 8), (_38709, 8), (_38708, 8), (_38707, 8), (_38706, 8), (_38705, 8), (_38704, 8), (_38703, 8), (_38702, 8), (_38701, 8), (_38700, 8), (_38699, 8), (_38698, 8), (_38697, 8), (_38696, 8), (_38695, 8), (_38694, 8), (_39048, 8), (_39047, 8), (_39046, 8), (_39045, 8), (_39044, 8), (_39043, 8), (_39042, 8), (_39041, 8), (_39040, 8), (_39039, 8), (_39038, 8), (_39037, 8), (_39036, 8), (_39035, 8), (_39034, 8), (_39033, 8), (_39032, 8), (_39031, 8), (_39030, 8), (_39029, 8), (_39028, 8), (_39027, 8), (_39026, 8), (_39025, 8), (_39024, 8), (_39023, 8), (_39022, 8), (_39021, 8), (_39020, 8), (_39019, 8), (_39018, 8), (_39017, 8), (_39371, 8), (_39370, 8), (_39369, 8), (_39368, 8), (_39367, 8), (_39366, 8), (_39365, 8), (_39364, 8), (_39363, 8), (_39362, 8), (_39361, 8), (_39360, 8), (_39359, 8), (_39358, 8), (_39357, 8), (_39356, 8), (_39355, 8), (_39354, 8), (_39353, 8), (_39352, 8), (_39351, 8), (_39350, 8), (_39349, 8), (_39348, 8), (_39347, 8), (_39346, 8), (_39345, 8), (_39344, 8), (_39343, 8), (_39342, 8), (_39341, 8), (_39340, 8), (_39694, 8), (_39693, 8), (_39692, 8), (_39691, 8), (_39690, 8), (_39689, 8), (_39688, 8), (_39687, 8), (_39686, 8), (_39685, 8), (_39684, 8), (_39683, 8), (_39682, 8), (_39681, 8), (_39680, 8), (_39679, 8), (_39678, 8), (_39677, 8), (_39676, 8), (_39675, 8), (_39674, 8), (_39673, 8), (_39672, 8), (_39671, 8), (_39670, 8), (_39669, 8), (_39668, 8), (_39667, 8), (_39666, 8), (_39665, 8), (_39664, 8), (_39663, 8), (_40017, 8), (_40016, 8), (_40015, 8), (_40014, 8), (_40013, 8), (_40012, 8), (_40011, 8), (_40010, 8), (_40009, 8), (_40008, 8), (_40007, 8), (_40006, 8), (_40005, 8), (_40004, 8), (_40003, 8), (_40002, 8), (_40001, 8), (_40000, 8), (_39999, 8), (_39998, 8), (_39997, 8), (_39996, 8), (_39995, 8), (_39994, 8), (_39993, 8), (_39992, 8), (_39991, 8), (_39990, 8), (_39989, 8), (_39988, 8), (_39987, 8), (_39986, 8), (_40340, 8), (_40339, 8), (_40338, 8), (_40337, 8), (_40336, 8), (_40335, 8), (_40334, 8), (_40333, 8), (_40332, 8), (_40331, 8), (_40330, 8), (_40329, 8), (_40328, 8), (_40327, 8), (_40326, 8), (_40325, 8), (_40324, 8), (_40323, 8), (_40322, 8), (_40321, 8), (_40320, 8), (_40319, 8), (_40318, 8), (_40317, 8), (_40316, 8), (_40315, 8), (_40314, 8), (_40313, 8), (_40312, 8), (_40311, 8), (_40310, 8), (_40309, 8), (_40663, 8), (_40662, 8), (_40661, 8), (_40660, 8), (_40659, 8), (_40658, 8), (_40657, 8), (_40656, 8), (_40655, 8), (_40654, 8), (_40653, 8), (_40652, 8), (_40651, 8), (_40650, 8), (_40649, 8), (_40648, 8), (_40647, 8), (_40646, 8), (_40645, 8), (_40644, 8), (_40643, 8), (_40642, 8), (_40641, 8), (_40640, 8), (_40639, 8), (_40638, 8), (_40637, 8), (_40636, 8), (_40635, 8), (_40634, 8), (_40633, 8), (_40632, 8), (_40986, 8), (_40985, 8), (_40984, 8), (_40983, 8), (_40982, 8), (_40981, 8), (_40980, 8), (_40979, 8), (_40978, 8), (_40977, 8), (_40976, 8), (_40975, 8), (_40974, 8), (_40973, 8), (_40972, 8), (_40971, 8), (_40970, 8), (_40969, 8), (_40968, 8), (_40967, 8), (_40966, 8), (_40965, 8), (_40964, 8), (_40963, 8), (_40962, 8), (_40961, 8), (_40960, 8), (_40959, 8), (_40958, 8), (_40957, 8), (_40956, 8), (_40955, 8), (_41309, 8), (_41308, 8), (_41307, 8), (_41306, 8), (_41305, 8), (_41304, 8), (_41303, 8), (_41302, 8), (_41301, 8), (_41300, 8), (_41299, 8), (_41298, 8), (_41297, 8), (_41296, 8), (_41295, 8), (_41294, 8), (_41293, 8), (_41292, 8), (_41291, 8), (_41290, 8), (_41289, 8), (_41288, 8), (_41287, 8), (_41286, 8), (_41285, 8), (_41284, 8), (_41283, 8), (_41282, 8), (_41281, 8), (_41280, 8), (_41279, 8), (_41278, 8), (_41632, 8), (_41631, 8), (_41630, 8), (_41629, 8), (_41628, 8), (_41627, 8), (_41626, 8), (_41625, 8), (_41624, 8), (_41623, 8), (_41622, 8), (_41621, 8), (_41620, 8), (_41619, 8), (_41618, 8), (_41617, 8), (_41616, 8), (_41615, 8), (_41614, 8), (_41613, 8), (_41612, 8), (_41611, 8), (_41610, 8), (_41609, 8), (_41608, 8), (_41607, 8), (_41606, 8), (_41605, 8), (_41604, 8), (_41603, 8), (_41602, 8), (_41601, 8), (_41955, 8), (_41954, 8), (_41953, 8), (_41952, 8), (_41951, 8), (_41950, 8), (_41949, 8), (_41948, 8), (_41947, 8), (_41946, 8), (_41945, 8), (_41944, 8), (_41943, 8), (_41942, 8), (_41941, 8), (_41940, 8), (_41939, 8), (_41938, 8), (_41937, 8), (_41936, 8), (_41935, 8), (_41934, 8), (_41933, 8), (_41932, 8), (_41931, 8), (_41930, 8), (_41929, 8), (_41928, 8), (_41927, 8), (_41926, 8), (_41925, 8), (_41924, 8), (_42278, 8), (_42277, 8), (_42276, 8), (_42275, 8), (_42274, 8), (_42273, 8), (_42272, 8), (_42271, 8), (_42270, 8), (_42269, 8), (_42268, 8), (_42267, 8), (_42266, 8), (_42265, 8), (_42264, 8), (_42263, 8), (_42262, 8), (_42261, 8), (_42260, 8), (_42259, 8), (_42258, 8), (_42257, 8), (_42256, 8), (_42255, 8), (_42254, 8), (_42253, 8), (_42252, 8), (_42251, 8), (_42250, 8), (_42249, 8), (_42248, 8), (_42247, 8), (_42601, 8), (_42600, 8), (_42599, 8), (_42598, 8), (_42597, 8), (_42596, 8), (_42595, 8), (_42594, 8), (_42593, 8), (_42592, 8), (_42591, 8), (_42590, 8), (_42589, 8), (_42588, 8), (_42587, 8), (_42586, 8), (_42585, 8), (_42584, 8), (_42583, 8), (_42582, 8), (_42581, 8), (_42580, 8), (_42579, 8), (_42578, 8), (_42577, 8), (_42576, 8), (_42575, 8), (_42574, 8), (_42573, 8), (_42572, 8), (_42571, 8), (_42570, 8), (_42924, 8), (_42923, 8), (_42922, 8), (_42921, 8), (_42920, 8), (_42919, 8), (_42918, 8), (_42917, 8), (_42916, 8), (_42915, 8), (_42914, 8), (_42913, 8), (_42912, 8), (_42911, 8), (_42910, 8), (_42909, 8), (_42908, 8), (_42907, 8), (_42906, 8), (_42905, 8), (_42904, 8), (_42903, 8), (_42902, 8), (_42901, 8), (_42900, 8), (_42899, 8), (_42898, 8), (_42897, 8), (_42896, 8), (_42895, 8), (_42894, 8), (_42893, 8), (_43247, 8), (_43246, 8), (_43245, 8), (_43244, 8), (_43243, 8), (_43242, 8), (_43241, 8), (_43240, 8), (_43239, 8), (_43238, 8), (_43237, 8), (_43236, 8), (_43235, 8), (_43234, 8), (_43233, 8), (_43232, 8), (_43231, 8), (_43230, 8), (_43229, 8), (_43228, 8), (_43227, 8), (_43226, 8), (_43225, 8), (_43224, 8), (_43223, 8), (_43222, 8), (_43221, 8), (_43220, 8), (_43219, 8), (_43218, 8), (_43217, 8), (_43216, 8), (_43570, 8), (_43569, 8), (_43568, 8), (_43567, 8), (_43566, 8), (_43565, 8), (_43564, 8), (_43563, 8), (_43562, 8), (_43561, 8), (_43560, 8), (_43559, 8), (_43558, 8), (_43557, 8), (_43556, 8), (_43555, 8), (_43554, 8), (_43553, 8), (_43552, 8), (_43551, 8), (_43550, 8), (_43549, 8), (_43548, 8), (_43547, 8), (_43546, 8), (_43545, 8), (_43544, 8), (_43543, 8), (_43542, 8), (_43541, 8), (_43540, 8), (_43539, 8), (_43893, 8), (_43892, 8), (_43891, 8), (_43890, 8), (_43889, 8), (_43888, 8), (_43887, 8), (_43886, 8), (_43885, 8), (_43884, 8), (_43883, 8), (_43882, 8), (_43881, 8), (_43880, 8), (_43879, 8), (_43878, 8), (_43877, 8), (_43876, 8), (_43875, 8), (_43874, 8), (_43873, 8), (_43872, 8), (_43871, 8), (_43870, 8), (_43869, 8), (_43868, 8), (_43867, 8), (_43866, 8), (_43865, 8), (_43864, 8), (_43863, 8), (_43862, 8), (_44216, 8), (_44215, 8), (_44214, 8), (_44213, 8), (_44212, 8), (_44211, 8), (_44210, 8), (_44209, 8), (_44208, 8), (_44207, 8), (_44206, 8), (_44205, 8), (_44204, 8), (_44203, 8), (_44202, 8), (_44201, 8), (_44200, 8), (_44199, 8), (_44198, 8), (_44197, 8), (_44196, 8), (_44195, 8), (_44194, 8), (_44193, 8), (_44192, 8), (_44191, 8), (_44190, 8), (_44189, 8), (_44188, 8), (_44187, 8), (_44186, 8), (_44185, 8), (_44539, 8), (_44538, 8), (_44537, 8), (_44536, 8), (_44535, 8), (_44534, 8), (_44533, 8), (_44532, 8), (_44531, 8), (_44530, 8), (_44529, 8), (_44528, 8), (_44527, 8), (_44526, 8), (_44525, 8), (_44524, 8), (_44523, 8), (_44522, 8), (_44521, 8), (_44520, 8), (_44519, 8), (_44518, 8), (_44517, 8), (_44516, 8), (_44515, 8), (_44514, 8), (_44513, 8), (_44512, 8), (_44511, 8), (_44510, 8), (_44509, 8), (_44508, 8), (_44862, 8), (_44861, 8), (_44860, 8), (_44859, 8), (_44858, 8), (_44857, 8), (_44856, 8), (_44855, 8), (_44854, 8), (_44853, 8), (_44852, 8), (_44851, 8), (_44850, 8), (_44849, 8), (_44848, 8), (_44847, 8), (_44846, 8), (_44845, 8), (_44844, 8), (_44843, 8), (_44842, 8), (_44841, 8), (_44840, 8), (_44839, 8), (_44838, 8), (_44837, 8), (_44836, 8), (_44835, 8), (_44834, 8), (_44833, 8), (_44832, 8), (_44831, 8), (_45185, 8), (_45184, 8), (_45183, 8), (_45182, 8), (_45181, 8), (_45180, 8), (_45179, 8), (_45178, 8), (_45177, 8), (_45176, 8), (_45175, 8), (_45174, 8), (_45173, 8), (_45172, 8), (_45171, 8), (_45170, 8), (_45169, 8), (_45168, 8), (_45167, 8), (_45166, 8), (_45165, 8), (_45164, 8), (_45163, 8), (_45162, 8), (_45161, 8), (_45160, 8), (_45159, 8), (_45158, 8), (_45157, 8), (_45156, 8), (_45155, 8), (_45154, 8), (_45508, 8), (_45507, 8), (_45506, 8), (_45505, 8), (_45504, 8), (_45503, 8), (_45502, 8), (_45501, 8), (_45500, 8), (_45499, 8), (_45498, 8), (_45497, 8), (_45496, 8), (_45495, 8), (_45494, 8), (_45493, 8), (_45492, 8), (_45491, 8), (_45490, 8), (_45489, 8), (_45488, 8), (_45487, 8), (_45486, 8), (_45485, 8), (_45484, 8), (_45483, 8), (_45482, 8), (_45481, 8), (_45480, 8), (_45479, 8), (_45478, 8), (_45477, 8), (_45831, 8), (_45830, 8), (_45829, 8), (_45828, 8), (_45827, 8), (_45826, 8), (_45825, 8), (_45824, 8), (_45823, 8), (_45822, 8), (_45821, 8), (_45820, 8), (_45819, 8), (_45818, 8), (_45817, 8), (_45816, 8), (_45815, 8), (_45814, 8), (_45813, 8), (_45812, 8), (_45811, 8), (_45810, 8), (_45809, 8), (_45808, 8), (_45807, 8), (_45806, 8), (_45805, 8), (_45804, 8), (_45803, 8), (_45802, 8), (_45801, 8), (_45800, 8), (_46154, 8), (_46153, 8), (_46152, 8), (_46151, 8), (_46150, 8), (_46149, 8), (_46148, 8), (_46147, 8), (_46146, 8), (_46145, 8), (_46144, 8), (_46143, 8), (_46142, 8), (_46141, 8), (_46140, 8), (_46139, 8), (_46138, 8), (_46137, 8), (_46136, 8), (_46135, 8), (_46134, 8), (_46133, 8), (_46132, 8), (_46131, 8), (_46130, 8), (_46129, 8), (_46128, 8), (_46127, 8), (_46126, 8), (_46125, 8), (_46124, 8), (_46123, 8), (_46477, 8), (_46476, 8), (_46475, 8), (_46474, 8), (_46473, 8), (_46472, 8), (_46471, 8), (_46470, 8), (_46469, 8), (_46468, 8), (_46467, 8), (_46466, 8), (_46465, 8), (_46464, 8), (_46463, 8), (_46462, 8), (_46461, 8), (_46460, 8), (_46459, 8), (_46458, 8), (_46457, 8), (_46456, 8), (_46455, 8), (_46454, 8), (_46453, 8), (_46452, 8), (_46451, 8), (_46450, 8), (_46449, 8), (_46448, 8), (_46447, 8), (_46446, 8), (_46800, 8), (_46799, 8), (_46798, 8), (_46797, 8), (_46796, 8), (_46795, 8), (_46794, 8), (_46793, 8), (_46792, 8), (_46791, 8), (_46790, 8), (_46789, 8), (_46788, 8), (_46787, 8), (_46786, 8), (_46785, 8), (_46784, 8), (_46783, 8), (_46782, 8), (_46781, 8), (_46780, 8), (_46779, 8), (_46778, 8), (_46777, 8), (_46776, 8), (_46775, 8), (_46774, 8), (_46773, 8), (_46772, 8), (_46771, 8), (_46770, 8), (_46769, 8), (_47123, 8), (_47122, 8), (_47121, 8), (_47120, 8), (_47119, 8), (_47118, 8), (_47117, 8), (_47116, 8), (_47115, 8), (_47114, 8), (_47113, 8), (_47112, 8), (_47111, 8), (_47110, 8), (_47109, 8), (_47108, 8), (_47107, 8), (_47106, 8), (_47105, 8), (_47104, 8), (_47103, 8), (_47102, 8), (_47101, 8), (_47100, 8), (_47099, 8), (_47098, 8), (_47097, 8), (_47096, 8), (_47095, 8), (_47094, 8), (_47093, 8), (_47092, 8), (_47446, 8), (_47445, 8), (_47444, 8), (_47443, 8), (_47442, 8), (_47441, 8), (_47440, 8), (_47439, 8), (_47438, 8), (_47437, 8), (_47436, 8), (_47435, 8), (_47434, 8), (_47433, 8), (_47432, 8), (_47431, 8), (_47430, 8), (_47429, 8), (_47428, 8), (_47427, 8), (_47426, 8), (_47425, 8), (_47424, 8), (_47423, 8), (_47422, 8), (_47421, 8), (_47420, 8), (_47419, 8), (_47418, 8), (_47417, 8), (_47416, 8), (_47415, 8), (_47769, 8), (_47768, 8), (_47767, 8), (_47766, 8), (_47765, 8), (_47764, 8), (_47763, 8), (_47762, 8), (_47761, 8), (_47760, 8), (_47759, 8), (_47758, 8), (_47757, 8), (_47756, 8), (_47755, 8), (_47754, 8), (_47753, 8), (_47752, 8), (_47751, 8), (_47750, 8), (_47749, 8), (_47748, 8), (_47747, 8), (_47746, 8), (_47745, 8), (_47744, 8), (_47743, 8), (_47742, 8), (_47741, 8), (_47740, 8), (_47739, 8), (_47738, 8), (_48092, 8), (_48091, 8), (_48090, 8), (_48089, 8), (_48088, 8), (_48087, 8), (_48086, 8), (_48085, 8), (_48084, 8), (_48083, 8), (_48082, 8), (_48081, 8), (_48080, 8), (_48079, 8), (_48078, 8), (_48077, 8), (_48076, 8), (_48075, 8), (_48074, 8), (_48073, 8), (_48072, 8), (_48071, 8), (_48070, 8), (_48069, 8), (_48068, 8), (_48067, 8), (_48066, 8), (_48065, 8), (_48064, 8), (_48063, 8), (_48062, 8), (_48061, 8), (_48415, 8), (_48414, 8), (_48413, 8), (_48412, 8), (_48411, 8), (_48410, 8), (_48409, 8), (_48408, 8), (_48407, 8), (_48406, 8), (_48405, 8), (_48404, 8), (_48403, 8), (_48402, 8), (_48401, 8), (_48400, 8), (_48399, 8), (_48398, 8), (_48397, 8), (_48396, 8), (_48395, 8), (_48394, 8), (_48393, 8), (_48392, 8), (_48391, 8), (_48390, 8), (_48389, 8), (_48388, 8), (_48387, 8), (_48386, 8), (_48385, 8), (_48384, 8), (_48738, 8), (_48737, 8), (_48736, 8), (_48735, 8), (_48734, 8), (_48733, 8), (_48732, 8), (_48731, 8), (_48730, 8), (_48729, 8), (_48728, 8), (_48727, 8), (_48726, 8), (_48725, 8), (_48724, 8), (_48723, 8), (_48722, 8), (_48721, 8), (_48720, 8), (_48719, 8), (_48718, 8), (_48717, 8), (_48716, 8), (_48715, 8), (_48714, 8), (_48713, 8), (_48712, 8), (_48711, 8), (_48710, 8), (_48709, 8), (_48708, 8), (_48707, 8), (_49061, 8), (_49060, 8), (_49059, 8), (_49058, 8), (_49057, 8), (_49056, 8), (_49055, 8), (_49054, 8), (_49053, 8), (_49052, 8), (_49051, 8), (_49050, 8), (_49049, 8), (_49048, 8), (_49047, 8), (_49046, 8), (_49045, 8), (_49044, 8), (_49043, 8), (_49042, 8), (_49041, 8), (_49040, 8), (_49039, 8), (_49038, 8), (_49037, 8), (_49036, 8), (_49035, 8), (_49034, 8), (_49033, 8), (_49032, 8), (_49031, 8), (_49030, 8), (_49384, 8), (_49383, 8), (_49382, 8), (_49381, 8), (_49380, 8), (_49379, 8), (_49378, 8), (_49377, 8), (_49376, 8), (_49375, 8), (_49374, 8), (_49373, 8), (_49372, 8), (_49371, 8), (_49370, 8), (_49369, 8), (_49368, 8), (_49367, 8), (_49366, 8), (_49365, 8), (_49364, 8), (_49363, 8), (_49362, 8), (_49361, 8), (_49360, 8), (_49359, 8), (_49358, 8), (_49357, 8), (_49356, 8), (_49355, 8), (_49354, 8), (_49353, 8), (_49707, 8), (_49706, 8), (_49705, 8), (_49704, 8), (_49703, 8), (_49702, 8), (_49701, 8), (_49700, 8), (_49699, 8), (_49698, 8), (_49697, 8), (_49696, 8), (_49695, 8), (_49694, 8), (_49693, 8), (_49692, 8), (_49691, 8), (_49690, 8), (_49689, 8), (_49688, 8), (_49687, 8), (_49686, 8), (_49685, 8), (_49684, 8), (_49683, 8), (_49682, 8), (_49681, 8), (_49680, 8), (_49679, 8), (_49678, 8), (_49677, 8), (_49676, 8), (_50030, 8), (_50029, 8), (_50028, 8), (_50027, 8), (_50026, 8), (_50025, 8), (_50024, 8), (_50023, 8), (_50022, 8), (_50021, 8), (_50020, 8), (_50019, 8), (_50018, 8), (_50017, 8), (_50016, 8), (_50015, 8), (_50014, 8), (_50013, 8), (_50012, 8), (_50011, 8), (_50010, 8), (_50009, 8), (_50008, 8), (_50007, 8), (_50006, 8), (_50005, 8), (_50004, 8), (_50003, 8), (_50002, 8), (_50001, 8), (_50000, 8), (_49999, 8), (_50353, 8), (_50352, 8), (_50351, 8), (_50350, 8), (_50349, 8), (_50348, 8), (_50347, 8), (_50346, 8), (_50345, 8), (_50344, 8), (_50343, 8), (_50342, 8), (_50341, 8), (_50340, 8), (_50339, 8), (_50338, 8), (_50337, 8), (_50336, 8), (_50335, 8), (_50334, 8), (_50333, 8), (_50332, 8), (_50331, 8), (_50330, 8), (_50329, 8), (_50328, 8), (_50327, 8), (_50326, 8), (_50325, 8), (_50324, 8), (_50323, 8), (_50322, 8), (_50676, 8), (_50675, 8), (_50674, 8), (_50673, 8), (_50672, 8), (_50671, 8), (_50670, 8), (_50669, 8), (_50668, 8), (_50667, 8), (_50666, 8), (_50665, 8), (_50664, 8), (_50663, 8), (_50662, 8), (_50661, 8), (_50660, 8), (_50659, 8), (_50658, 8), (_50657, 8), (_50656, 8), (_50655, 8), (_50654, 8), (_50653, 8), (_50652, 8), (_50651, 8), (_50650, 8), (_50649, 8), (_50648, 8), (_50647, 8), (_50646, 8), (_50645, 8), (_50999, 8), (_50998, 8), (_50997, 8), (_50996, 8), (_50995, 8), (_50994, 8), (_50993, 8), (_50992, 8), (_50991, 8), (_50990, 8), (_50989, 8), (_50988, 8), (_50987, 8), (_50986, 8), (_50985, 8), (_50984, 8), (_50983, 8), (_50982, 8), (_50981, 8), (_50980, 8), (_50979, 8), (_50978, 8), (_50977, 8), (_50976, 8), (_50975, 8), (_50974, 8), (_50973, 8), (_50972, 8), (_50971, 8), (_50970, 8), (_50969, 8), (_50968, 8), (_51322, 8), (_51321, 8), (_51320, 8), (_51319, 8), (_51318, 8), (_51317, 8), (_51316, 8), (_51315, 8), (_51314, 8), (_51313, 8), (_51312, 8), (_51311, 8), (_51310, 8), (_51309, 8), (_51308, 8), (_51307, 8), (_51306, 8), (_51305, 8), (_51304, 8), (_51303, 8), (_51302, 8), (_51301, 8), (_51300, 8), (_51299, 8), (_51298, 8), (_51297, 8), (_51296, 8), (_51295, 8), (_51294, 8), (_51293, 8), (_51292, 8), (_51291, 8), (_51645, 8), (_51644, 8), (_51643, 8), (_51642, 8), (_51641, 8), (_51640, 8), (_51639, 8), (_51638, 8), (_51637, 8), (_51636, 8), (_51635, 8), (_51634, 8), (_51633, 8), (_51632, 8), (_51631, 8), (_51630, 8), (_51629, 8), (_51628, 8), (_51627, 8), (_51626, 8), (_51625, 8), (_51624, 8), (_51623, 8), (_51622, 8), (_51621, 8), (_51620, 8), (_51619, 8), (_51618, 8), (_51617, 8), (_51616, 8), (_51615, 8), (_51614, 8), (_51968, 8), (_51967, 8), (_51966, 8), (_51965, 8), (_51964, 8), (_51963, 8), (_51962, 8), (_51961, 8), (_51960, 8), (_51959, 8), (_51958, 8), (_51957, 8), (_51956, 8), (_51955, 8), (_51954, 8), (_51953, 8), (_51952, 8), (_51951, 8), (_51950, 8), (_51949, 8), (_51948, 8), (_51947, 8), (_51946, 8), (_51945, 8), (_51944, 8), (_51943, 8), (_51942, 8), (_51941, 8), (_51940, 8), (_51939, 8), (_51938, 8), (_51937, 8), (_52291, 8), (_52290, 8), (_52289, 8), (_52288, 8), (_52287, 8), (_52286, 8), (_52285, 8), (_52284, 8), (_52283, 8), (_52282, 8), (_52281, 8), (_52280, 8), (_52279, 8), (_52278, 8), (_52277, 8), (_52276, 8), (_52275, 8), (_52274, 8), (_52273, 8), (_52272, 8), (_52271, 8), (_52270, 8), (_52269, 8), (_52268, 8), (_52267, 8), (_52266, 8), (_52265, 8), (_52264, 8), (_52263, 8), (_52262, 8), (_52261, 8), (_52260, 8), (_52614, 8), (_52613, 8), (_52612, 8), (_52611, 8), (_52610, 8), (_52609, 8), (_52608, 8), (_52607, 8), (_52606, 8), (_52605, 8), (_52604, 8), (_52603, 8), (_52602, 8), (_52601, 8), (_52600, 8), (_52599, 8), (_52598, 8), (_52597, 8), (_52596, 8), (_52595, 8), (_52594, 8), (_52593, 8), (_52592, 8), (_52591, 8), (_52590, 8), (_52589, 8), (_52588, 8), (_52587, 8), (_52586, 8), (_52585, 8), (_52584, 8), (_52583, 8), (_52937, 8), (_52936, 8), (_52935, 8), (_52934, 8), (_52933, 8), (_52932, 8), (_52931, 8), (_52930, 8), (_52929, 8), (_52928, 8), (_52927, 8), (_52926, 8), (_52925, 8), (_52924, 8), (_52923, 8), (_52922, 8), (_52921, 8), (_52920, 8), (_52919, 8), (_52918, 8), (_52917, 8), (_52916, 8), (_52915, 8), (_52914, 8), (_52913, 8), (_52912, 8), (_52911, 8), (_52910, 8), (_52909, 8), (_52908, 8), (_52907, 8), (_52906, 8), (_53260, 8), (_53259, 8), (_53258, 8), (_53257, 8), (_53256, 8), (_53255, 8), (_53254, 8), (_53253, 8), (_53252, 8), (_53251, 8), (_53250, 8), (_53249, 8), (_53248, 8), (_53247, 8), (_53246, 8), (_53245, 8), (_53244, 8), (_53243, 8), (_53242, 8), (_53241, 8), (_53240, 8), (_53239, 8), (_53238, 8), (_53237, 8), (_53236, 8), (_53235, 8), (_53234, 8), (_53233, 8), (_53232, 8), (_53231, 8), (_53230, 8), (_53229, 8), (_53583, 8), (_53582, 8), (_53581, 8), (_53580, 8), (_53579, 8), (_53578, 8), (_53577, 8), (_53576, 8), (_53575, 8), (_53574, 8), (_53573, 8), (_53572, 8), (_53571, 8), (_53570, 8), (_53569, 8), (_53568, 8), (_53567, 8), (_53566, 8), (_53565, 8), (_53564, 8), (_53563, 8), (_53562, 8), (_53561, 8), (_53560, 8), (_53559, 8), (_53558, 8), (_53557, 8), (_53556, 8), (_53555, 8), (_53554, 8), (_53553, 8), (_53552, 8), (_53906, 8), (_53905, 8), (_53904, 8), (_53903, 8), (_53902, 8), (_53901, 8), (_53900, 8), (_53899, 8), (_53898, 8), (_53897, 8), (_53896, 8), (_53895, 8), (_53894, 8), (_53893, 8), (_53892, 8), (_53891, 8), (_53890, 8), (_53889, 8), (_53888, 8), (_53887, 8), (_53886, 8), (_53885, 8), (_53884, 8), (_53883, 8), (_53882, 8), (_53881, 8), (_53880, 8), (_53879, 8), (_53878, 8), (_53877, 8), (_53876, 8), (_53875, 8), (_54229, 8), (_54228, 8), (_54227, 8), (_54226, 8), (_54225, 8), (_54224, 8), (_54223, 8), (_54222, 8), (_54221, 8), (_54220, 8), (_54219, 8), (_54218, 8), (_54217, 8), (_54216, 8), (_54215, 8), (_54214, 8), (_54213, 8), (_54212, 8), (_54211, 8), (_54210, 8), (_54209, 8), (_54208, 8), (_54207, 8), (_54206, 8), (_54205, 8), (_54204, 8), (_54203, 8), (_54202, 8), (_54201, 8), (_54200, 8), (_54199, 8), (_54198, 8), (_54552, 8), (_54551, 8), (_54550, 8), (_54549, 8), (_54548, 8), (_54547, 8), (_54546, 8), (_54545, 8), (_54544, 8), (_54543, 8), (_54542, 8), (_54541, 8), (_54540, 8), (_54539, 8), (_54538, 8), (_54537, 8), (_54536, 8), (_54535, 8), (_54534, 8), (_54533, 8), (_54532, 8), (_54531, 8), (_54530, 8), (_54529, 8), (_54528, 8), (_54527, 8), (_54526, 8), (_54525, 8), (_54524, 8), (_54523, 8), (_54522, 8), (_54521, 8), (_54875, 8), (_54874, 8), (_54873, 8), (_54872, 8), (_54871, 8), (_54870, 8), (_54869, 8), (_54868, 8), (_54867, 8), (_54866, 8), (_54865, 8), (_54864, 8), (_54863, 8), (_54862, 8), (_54861, 8), (_54860, 8), (_54859, 8), (_54858, 8), (_54857, 8), (_54856, 8), (_54855, 8), (_54854, 8), (_54853, 8), (_54852, 8), (_54851, 8), (_54850, 8), (_54849, 8), (_54848, 8), (_54847, 8), (_54846, 8), (_54845, 8), (_54844, 8), (_55198, 8), (_55197, 8), (_55196, 8), (_55195, 8), (_55194, 8), (_55193, 8), (_55192, 8), (_55191, 8), (_55190, 8), (_55189, 8), (_55188, 8), (_55187, 8), (_55186, 8), (_55185, 8), (_55184, 8), (_55183, 8), (_55182, 8), (_55181, 8), (_55180, 8), (_55179, 8), (_55178, 8), (_55177, 8), (_55176, 8), (_55175, 8), (_55174, 8), (_55173, 8), (_55172, 8), (_55171, 8), (_55170, 8), (_55169, 8), (_55168, 8), (_55167, 8), (_55521, 8), (_55520, 8), (_55519, 8), (_55518, 8), (_55517, 8), (_55516, 8), (_55515, 8), (_55514, 8), (_55513, 8), (_55512, 8), (_55511, 8), (_55510, 8), (_55509, 8), (_55508, 8), (_55507, 8), (_55506, 8), (_55505, 8), (_55504, 8), (_55503, 8), (_55502, 8), (_55501, 8), (_55500, 8), (_55499, 8), (_55498, 8), (_55497, 8), (_55496, 8), (_55495, 8), (_55494, 8), (_55493, 8), (_55492, 8), (_55491, 8), (_55490, 8), (_55844, 8), (_55843, 8), (_55842, 8), (_55841, 8), (_55840, 8), (_55839, 8), (_55838, 8), (_55837, 8), (_55836, 8), (_55835, 8), (_55834, 8), (_55833, 8), (_55832, 8), (_55831, 8), (_55830, 8), (_55829, 8), (_55828, 8), (_55827, 8), (_55826, 8), (_55825, 8), (_55824, 8), (_55823, 8), (_55822, 8), (_55821, 8), (_55820, 8), (_55819, 8), (_55818, 8), (_55817, 8), (_55816, 8), (_55815, 8), (_55814, 8), (_55813, 8), (_56167, 8), (_56166, 8), (_56165, 8), (_56164, 8), (_56163, 8), (_56162, 8), (_56161, 8), (_56160, 8), (_56159, 8), (_56158, 8), (_56157, 8), (_56156, 8), (_56155, 8), (_56154, 8), (_56153, 8), (_56152, 8), (_56151, 8), (_56150, 8), (_56149, 8), (_56148, 8), (_56147, 8), (_56146, 8), (_56145, 8), (_56144, 8), (_56143, 8), (_56142, 8), (_56141, 8), (_56140, 8), (_56139, 8), (_56138, 8), (_56137, 8), (_56136, 8), (_56490, 8), (_56489, 8), (_56488, 8), (_56487, 8), (_56486, 8), (_56485, 8), (_56484, 8), (_56483, 8), (_56482, 8), (_56481, 8), (_56480, 8), (_56479, 8), (_56478, 8), (_56477, 8), (_56476, 8), (_56475, 8), (_56474, 8), (_56473, 8), (_56472, 8), (_56471, 8), (_56470, 8), (_56469, 8), (_56468, 8), (_56467, 8), (_56466, 8), (_56465, 8), (_56464, 8), (_56463, 8), (_56462, 8), (_56461, 8), (_56460, 8), (_56459, 8), (_56813, 8), (_56812, 8), (_56811, 8), (_56810, 8), (_56809, 8), (_56808, 8), (_56807, 8), (_56806, 8), (_56805, 8), (_56804, 8), (_56803, 8), (_56802, 8), (_56801, 8), (_56800, 8), (_56799, 8), (_56798, 8), (_56797, 8), (_56796, 8), (_56795, 8), (_56794, 8), (_56793, 8), (_56792, 8), (_56791, 8), (_56790, 8), (_56789, 8), (_56788, 8), (_56787, 8), (_56786, 8), (_56785, 8), (_56784, 8), (_56783, 8), (_56782, 8), (_57136, 8), (_57135, 8), (_57134, 8), (_57133, 8), (_57132, 8), (_57131, 8), (_57130, 8), (_57129, 8), (_57128, 8), (_57127, 8), (_57126, 8), (_57125, 8), (_57124, 8), (_57123, 8), (_57122, 8), (_57121, 8), (_57120, 8), (_57119, 8), (_57118, 8), (_57117, 8), (_57116, 8), (_57115, 8), (_57114, 8), (_57113, 8), (_57112, 8), (_57111, 8), (_57110, 8), (_57109, 8), (_57108, 8), (_57107, 8), (_57106, 8), (_57105, 8), (_57459, 8), (_57458, 8), (_57457, 8), (_57456, 8), (_57455, 8), (_57454, 8), (_57453, 8), (_57452, 8), (_57451, 8), (_57450, 8), (_57449, 8), (_57448, 8), (_57447, 8), (_57446, 8), (_57445, 8), (_57444, 8), (_57443, 8), (_57442, 8), (_57441, 8), (_57440, 8), (_57439, 8), (_57438, 8), (_57437, 8), (_57436, 8), (_57435, 8), (_57434, 8), (_57433, 8), (_57432, 8), (_57431, 8), (_57430, 8), (_57429, 8), (_57428, 8), (_57782, 8), (_57781, 8), (_57780, 8), (_57779, 8), (_57778, 8), (_57777, 8), (_57776, 8), (_57775, 8), (_57774, 8), (_57773, 8), (_57772, 8), (_57771, 8), (_57770, 8), (_57769, 8), (_57768, 8), (_57767, 8), (_57766, 8), (_57765, 8), (_57764, 8), (_57763, 8), (_57762, 8), (_57761, 8), (_57760, 8), (_57759, 8), (_57758, 8), (_57757, 8), (_57756, 8), (_57755, 8), (_57754, 8), (_57753, 8), (_57752, 8), (_57751, 8), (_58105, 8), (_58104, 8), (_58103, 8), (_58102, 8), (_58101, 8), (_58100, 8), (_58099, 8), (_58098, 8), (_58097, 8), (_58096, 8), (_58095, 8), (_58094, 8), (_58093, 8), (_58092, 8), (_58091, 8), (_58090, 8), (_58089, 8), (_58088, 8), (_58087, 8), (_58086, 8), (_58085, 8), (_58084, 8), (_58083, 8), (_58082, 8), (_58081, 8), (_58080, 8), (_58079, 8), (_58078, 8), (_58077, 8), (_58076, 8), (_58075, 8), (_58074, 8), (_58428, 8), (_58427, 8), (_58426, 8), (_58425, 8), (_58424, 8), (_58423, 8), (_58422, 8), (_58421, 8), (_58420, 8), (_58419, 8), (_58418, 8), (_58417, 8), (_58416, 8), (_58415, 8), (_58414, 8), (_58413, 8), (_58412, 8), (_58411, 8), (_58410, 8), (_58409, 8), (_58408, 8), (_58407, 8), (_58406, 8), (_58405, 8), (_58404, 8), (_58403, 8), (_58402, 8), (_58401, 8), (_58400, 8), (_58399, 8), (_58398, 8), (_58397, 8), (_58751, 8), (_58750, 8), (_58749, 8), (_58748, 8), (_58747, 8), (_58746, 8), (_58745, 8), (_58744, 8), (_58743, 8), (_58742, 8), (_58741, 8), (_58740, 8), (_58739, 8), (_58738, 8), (_58737, 8), (_58736, 8), (_58735, 8), (_58734, 8), (_58733, 8), (_58732, 8), (_58731, 8), (_58730, 8), (_58729, 8), (_58728, 8), (_58727, 8), (_58726, 8), (_58725, 8), (_58724, 8), (_58723, 8), (_58722, 8), (_58721, 8), (_58720, 8), (_59074, 8), (_59073, 8), (_59072, 8), (_59071, 8), (_59070, 8), (_59069, 8), (_59068, 8), (_59067, 8), (_59066, 8), (_59065, 8), (_59064, 8), (_59063, 8), (_59062, 8), (_59061, 8), (_59060, 8), (_59059, 8), (_59058, 8), (_59057, 8), (_59056, 8), (_59055, 8), (_59054, 8), (_59053, 8), (_59052, 8), (_59051, 8), (_59050, 8), (_59049, 8), (_59048, 8), (_59047, 8), (_59046, 8), (_59045, 8), (_59044, 8), (_59043, 8), (_59397, 8), (_59396, 8), (_59395, 8), (_59394, 8), (_59393, 8), (_59392, 8), (_59391, 8), (_59390, 8), (_59389, 8), (_59388, 8), (_59387, 8), (_59386, 8), (_59385, 8), (_59384, 8), (_59383, 8), (_59382, 8), (_59381, 8), (_59380, 8), (_59379, 8), (_59378, 8), (_59377, 8), (_59376, 8), (_59375, 8), (_59374, 8), (_59373, 8), (_59372, 8), (_59371, 8), (_59370, 8), (_59369, 8), (_59368, 8), (_59367, 8), (_59366, 8), (_59720, 8), (_59719, 8), (_59718, 8), (_59717, 8), (_59716, 8), (_59715, 8), (_59714, 8), (_59713, 8), (_59712, 8), (_59711, 8), (_59710, 8), (_59709, 8), (_59708, 8), (_59707, 8), (_59706, 8), (_59705, 8), (_59704, 8), (_59703, 8), (_59702, 8), (_59701, 8), (_59700, 8), (_59699, 8), (_59698, 8), (_59697, 8), (_59696, 8), (_59695, 8), (_59694, 8), (_59693, 8), (_59692, 8), (_59691, 8), (_59690, 8), (_59689, 8), (_60043, 8), (_60042, 8), (_60041, 8), (_60040, 8), (_60039, 8), (_60038, 8), (_60037, 8), (_60036, 8), (_60035, 8), (_60034, 8), (_60033, 8), (_60032, 8), (_60031, 8), (_60030, 8), (_60029, 8), (_60028, 8), (_60027, 8), (_60026, 8), (_60025, 8), (_60024, 8), (_60023, 8), (_60022, 8), (_60021, 8), (_60020, 8), (_60019, 8), (_60018, 8), (_60017, 8), (_60016, 8), (_60015, 8), (_60014, 8), (_60013, 8), (_60012, 8), (_60366, 8), (_60365, 8), (_60364, 8), (_60363, 8), (_60362, 8), (_60361, 8), (_60360, 8), (_60359, 8), (_60358, 8), (_60357, 8), (_60356, 8), (_60355, 8), (_60354, 8), (_60353, 8), (_60352, 8), (_60351, 8), (_60350, 8), (_60349, 8), (_60348, 8), (_60347, 8), (_60346, 8), (_60345, 8), (_60344, 8), (_60343, 8), (_60342, 8), (_60341, 8), (_60340, 8), (_60339, 8), (_60338, 8), (_60337, 8), (_60336, 8), (_60335, 8), (_60689, 8), (_60688, 8), (_60687, 8), (_60686, 8), (_60685, 8), (_60684, 8), (_60683, 8), (_60682, 8), (_60681, 8), (_60680, 8), (_60679, 8), (_60678, 8), (_60677, 8), (_60676, 8), (_60675, 8), (_60674, 8), (_60673, 8), (_60672, 8), (_60671, 8), (_60670, 8), (_60669, 8), (_60668, 8), (_60667, 8), (_60666, 8), (_60665, 8), (_60664, 8), (_60663, 8), (_60662, 8), (_60661, 8), (_60660, 8), (_60659, 8), (_60658, 8), (_61012, 8), (_61011, 8), (_61010, 8), (_61009, 8), (_61008, 8), (_61007, 8), (_61006, 8), (_61005, 8), (_61004, 8), (_61003, 8), (_61002, 8), (_61001, 8), (_61000, 8), (_60999, 8), (_60998, 8), (_60997, 8), (_60996, 8), (_60995, 8), (_60994, 8), (_60993, 8), (_60992, 8), (_60991, 8), (_60990, 8), (_60989, 8), (_60988, 8), (_60987, 8), (_60986, 8), (_60985, 8), (_60984, 8), (_60983, 8), (_60982, 8), (_60981, 8), (_61335, 8), (_61334, 8), (_61333, 8), (_61332, 8), (_61331, 8), (_61330, 8), (_61329, 8), (_61328, 8), (_61327, 8), (_61326, 8), (_61325, 8), (_61324, 8), (_61323, 8), (_61322, 8), (_61321, 8), (_61320, 8), (_61319, 8), (_61318, 8), (_61317, 8), (_61316, 8), (_61315, 8), (_61314, 8), (_61313, 8), (_61312, 8), (_61311, 8), (_61310, 8), (_61309, 8), (_61308, 8), (_61307, 8), (_61306, 8), (_61305, 8), (_61304, 8), (_61658, 8), (_61657, 8), (_61656, 8), (_61655, 8), (_61654, 8), (_61653, 8), (_61652, 8), (_61651, 8), (_61650, 8), (_61649, 8), (_61648, 8), (_61647, 8), (_61646, 8), (_61645, 8), (_61644, 8), (_61643, 8), (_61642, 8), (_61641, 8), (_61640, 8), (_61639, 8), (_61638, 8), (_61637, 8), (_61636, 8), (_61635, 8), (_61634, 8), (_61633, 8), (_61632, 8), (_61631, 8), (_61630, 8), (_61629, 8), (_61628, 8), (_61627, 8), (_61981, 8), (_61980, 8), (_61979, 8), (_61978, 8), (_61977, 8), (_61976, 8), (_61975, 8), (_61974, 8), (_61973, 8), (_61972, 8), (_61971, 8), (_61970, 8), (_61969, 8), (_61968, 8), (_61967, 8), (_61966, 8), (_61965, 8), (_61964, 8), (_61963, 8), (_61962, 8), (_61961, 8), (_61960, 8), (_61959, 8), (_61958, 8), (_61957, 8), (_61956, 8), (_61955, 8), (_61954, 8), (_61953, 8), (_61952, 8), (_61951, 8), (_61950, 8), (_62304, 8), (_62303, 8), (_62302, 8), (_62301, 8), (_62300, 8), (_62299, 8), (_62298, 8), (_62297, 8), (_62296, 8), (_62295, 8), (_62294, 8), (_62293, 8), (_62292, 8), (_62291, 8), (_62290, 8), (_62289, 8), (_62288, 8), (_62287, 8), (_62286, 8), (_62285, 8), (_62284, 8), (_62283, 8), (_62282, 8), (_62281, 8), (_62280, 8), (_62279, 8), (_62278, 8), (_62277, 8), (_62276, 8), (_62275, 8), (_62274, 8), (_62273, 8), (_62627, 8), (_62626, 8), (_62625, 8), (_62624, 8), (_62623, 8), (_62622, 8), (_62621, 8), (_62620, 8), (_62619, 8), (_62618, 8), (_62617, 8), (_62616, 8), (_62615, 8), (_62614, 8), (_62613, 8), (_62612, 8), (_62611, 8), (_62610, 8), (_62609, 8), (_62608, 8), (_62607, 8), (_62606, 8), (_62605, 8), (_62604, 8), (_62603, 8), (_62602, 8), (_62601, 8), (_62600, 8), (_62599, 8), (_62598, 8), (_62597, 8), (_62596, 8), (_62950, 8), (_62949, 8), (_62948, 8), (_62947, 8), (_62946, 8), (_62945, 8), (_62944, 8), (_62943, 8), (_62942, 8), (_62941, 8), (_62940, 8), (_62939, 8), (_62938, 8), (_62937, 8), (_62936, 8), (_62935, 8), (_62934, 8), (_62933, 8), (_62932, 8), (_62931, 8), (_62930, 8), (_62929, 8), (_62928, 8), (_62927, 8), (_62926, 8), (_62925, 8), (_62924, 8), (_62923, 8), (_62922, 8), (_62921, 8), (_62920, 8), (_62919, 8), (_63273, 8), (_63272, 8), (_63271, 8), (_63270, 8), (_63269, 8), (_63268, 8), (_63267, 8), (_63266, 8), (_63265, 8), (_63264, 8), (_63263, 8), (_63262, 8), (_63261, 8), (_63260, 8), (_63259, 8), (_63258, 8), (_63257, 8), (_63256, 8), (_63255, 8), (_63254, 8), (_63253, 8), (_63252, 8), (_63251, 8), (_63250, 8), (_63249, 8), (_63248, 8), (_63247, 8), (_63246, 8), (_63245, 8), (_63244, 8), (_63243, 8), (_63242, 8), (_63596, 8), (_63595, 8), (_63594, 8), (_63593, 8), (_63592, 8), (_63591, 8), (_63590, 8), (_63589, 8), (_63588, 8), (_63587, 8), (_63586, 8), (_63585, 8), (_63584, 8), (_63583, 8), (_63582, 8), (_63581, 8), (_63580, 8), (_63579, 8), (_63578, 8), (_63577, 8), (_63576, 8), (_63575, 8), (_63574, 8), (_63573, 8), (_63572, 8), (_63571, 8), (_63570, 8), (_63569, 8), (_63568, 8), (_63567, 8), (_63566, 8), (_63565, 8), (_63919, 8), (_63918, 8), (_63917, 8), (_63916, 8), (_63915, 8), (_63914, 8), (_63913, 8), (_63912, 8), (_63911, 8), (_63910, 8), (_63909, 8), (_63908, 8), (_63907, 8), (_63906, 8), (_63905, 8), (_63904, 8), (_63903, 8), (_63902, 8), (_63901, 8), (_63900, 8), (_63899, 8), (_63898, 8), (_63897, 8), (_63896, 8), (_63895, 8), (_63894, 8), (_63893, 8), (_63892, 8), (_63891, 8), (_63890, 8), (_63889, 8), (_63888, 8), (_64242, 8), (_64241, 8), (_64240, 8), (_64239, 8), (_64238, 8), (_64237, 8), (_64236, 8), (_64235, 8), (_64234, 8), (_64233, 8), (_64232, 8), (_64231, 8), (_64230, 8), (_64229, 8), (_64228, 8), (_64227, 8), (_64226, 8), (_64225, 8), (_64224, 8), (_64223, 8), (_64222, 8), (_64221, 8), (_64220, 8), (_64219, 8), (_64218, 8), (_64217, 8), (_64216, 8), (_64215, 8), (_64214, 8), (_64213, 8), (_64212, 8), (_64211, 8), (_64565, 8), (_64564, 8), (_64563, 8), (_64562, 8), (_64561, 8), (_64560, 8), (_64559, 8), (_64558, 8), (_64557, 8), (_64556, 8), (_64555, 8), (_64554, 8), (_64553, 8), (_64552, 8), (_64551, 8), (_64550, 8), (_64549, 8), (_64548, 8), (_64547, 8), (_64546, 8), (_64545, 8), (_64544, 8), (_64543, 8), (_64542, 8), (_64541, 8), (_64540, 8), (_64539, 8), (_64538, 8), (_64537, 8), (_64536, 8), (_64535, 8), (_64534, 8), (_64888, 8), (_64887, 8), (_64886, 8), (_64885, 8), (_64884, 8), (_64883, 8), (_64882, 8), (_64881, 8), (_64880, 8), (_64879, 8), (_64878, 8), (_64877, 8), (_64876, 8), (_64875, 8), (_64874, 8), (_64873, 8), (_64872, 8), (_64871, 8), (_64870, 8), (_64869, 8), (_64868, 8), (_64867, 8), (_64866, 8), (_64865, 8), (_64864, 8), (_64863, 8), (_64862, 8), (_64861, 8), (_64860, 8), (_64859, 8), (_64858, 8), (_64857, 8), (_65211, 8), (_65210, 8), (_65209, 8), (_65208, 8), (_65207, 8), (_65206, 8), (_65205, 8), (_65204, 8), (_65203, 8), (_65202, 8), (_65201, 8), (_65200, 8), (_65199, 8), (_65198, 8), (_65197, 8), (_65196, 8), (_65195, 8), (_65194, 8), (_65193, 8), (_65192, 8), (_65191, 8), (_65190, 8), (_65189, 8), (_65188, 8), (_65187, 8), (_65186, 8), (_65185, 8), (_65184, 8), (_65183, 8), (_65182, 8), (_65181, 8), (_65180, 8), (_65534, 8), (_65533, 8), (_65532, 8), (_65531, 8), (_65530, 8), (_65529, 8), (_65528, 8), (_65527, 8), (_65526, 8), (_65525, 8), (_65524, 8), (_65523, 8), (_65522, 8), (_65521, 8), (_65520, 8), (_65519, 8), (_65518, 8), (_65517, 8), (_65516, 8), (_65515, 8), (_65514, 8), (_65513, 8), (_65512, 8), (_65511, 8), (_65510, 8), (_65509, 8), (_65508, 8), (_65507, 8), (_65506, 8), (_65505, 8), (_65504, 8), (_65503, 8), (_65857, 8), (_65856, 8), (_65855, 8), (_65854, 8), (_65853, 8), (_65852, 8), (_65851, 8), (_65850, 8), (_65849, 8), (_65848, 8), (_65847, 8), (_65846, 8), (_65845, 8), (_65844, 8), (_65843, 8), (_65842, 8), (_65841, 8), (_65840, 8), (_65839, 8), (_65838, 8), (_65837, 8), (_65836, 8), (_65835, 8), (_65834, 8), (_65833, 8), (_65832, 8), (_65831, 8), (_65830, 8), (_65829, 8), (_65828, 8), (_65827, 8), (_65826, 8), (_66180, 8), (_66179, 8), (_66178, 8), (_66177, 8), (_66176, 8), (_66175, 8), (_66174, 8), (_66173, 8), (_66172, 8), (_66171, 8), (_66170, 8), (_66169, 8), (_66168, 8), (_66167, 8), (_66166, 8), (_66165, 8), (_66164, 8), (_66163, 8), (_66162, 8), (_66161, 8), (_66160, 8), (_66159, 8), (_66158, 8), (_66157, 8), (_66156, 8), (_66155, 8), (_66154, 8), (_66153, 8), (_66152, 8), (_66151, 8), (_66150, 8), (_66149, 8), (_66503, 8), (_66502, 8), (_66501, 8), (_66500, 8), (_66499, 8), (_66498, 8), (_66497, 8), (_66496, 8), (_66495, 8), (_66494, 8), (_66493, 8), (_66492, 8), (_66491, 8), (_66490, 8), (_66489, 8), (_66488, 8), (_66487, 8), (_66486, 8), (_66485, 8), (_66484, 8), (_66483, 8), (_66482, 8), (_66481, 8), (_66480, 8), (_66479, 8), (_66478, 8), (_66477, 8), (_66476, 8), (_66475, 8), (_66474, 8), (_66473, 8), (_66472, 8), (_66826, 8), (_66825, 8), (_66824, 8), (_66823, 8), (_66822, 8), (_66821, 8), (_66820, 8), (_66819, 8), (_66818, 8), (_66817, 8), (_66816, 8), (_66815, 8), (_66814, 8), (_66813, 8), (_66812, 8), (_66811, 8), (_66810, 8), (_66809, 8), (_66808, 8), (_66807, 8), (_66806, 8), (_66805, 8), (_66804, 8), (_66803, 8), (_66802, 8), (_66801, 8), (_66800, 8), (_66799, 8), (_66798, 8), (_66797, 8), (_66796, 8), (_66795, 8), (_67149, 8), (_67148, 8), (_67147, 8), (_67146, 8), (_67145, 8), (_67144, 8), (_67143, 8), (_67142, 8), (_67141, 8), (_67140, 8), (_67139, 8), (_67138, 8), (_67137, 8), (_67136, 8), (_67135, 8), (_67134, 8), (_67133, 8), (_67132, 8), (_67131, 8), (_67130, 8), (_67129, 8), (_67128, 8), (_67127, 8), (_67126, 8), (_67125, 8), (_67124, 8), (_67123, 8), (_67122, 8), (_67121, 8), (_67120, 8), (_67119, 8), (_67118, 8), (_67472, 8), (_67471, 8), (_67470, 8), (_67469, 8), (_67468, 8), (_67467, 8), (_67466, 8), (_67465, 8), (_67464, 8), (_67463, 8), (_67462, 8), (_67461, 8), (_67460, 8), (_67459, 8), (_67458, 8), (_67457, 8), (_67456, 8), (_67455, 8), (_67454, 8), (_67453, 8), (_67452, 8), (_67451, 8), (_67450, 8), (_67449, 8), (_67448, 8), (_67447, 8), (_67446, 8), (_67445, 8), (_67444, 8), (_67443, 8), (_67442, 8), (_67441, 8), (_67795, 8), (_67794, 8), (_67793, 8), (_67792, 8), (_67791, 8), (_67790, 8), (_67789, 8), (_67788, 8), (_67787, 8), (_67786, 8), (_67785, 8), (_67784, 8), (_67783, 8), (_67782, 8), (_67781, 8), (_67780, 8), (_67779, 8), (_67778, 8), (_67777, 8), (_67776, 8), (_67775, 8), (_67774, 8), (_67773, 8), (_67772, 8), (_67771, 8), (_67770, 8), (_67769, 8), (_67768, 8), (_67767, 8), (_67766, 8), (_67765, 8), (_67764, 8), (_68118, 8), (_68117, 8), (_68116, 8), (_68115, 8), (_68114, 8), (_68113, 8), (_68112, 8), (_68111, 8), (_68110, 8), (_68109, 8), (_68108, 8), (_68107, 8), (_68106, 8), (_68105, 8), (_68104, 8), (_68103, 8), (_68102, 8), (_68101, 8), (_68100, 8), (_68099, 8), (_68098, 8), (_68097, 8), (_68096, 8), (_68095, 8), (_68094, 8), (_68093, 8), (_68092, 8), (_68091, 8), (_68090, 8), (_68089, 8), (_68088, 8), (_68087, 8), (_68441, 8), (_68440, 8), (_68439, 8), (_68438, 8), (_68437, 8), (_68436, 8), (_68435, 8), (_68434, 8), (_68433, 8), (_68432, 8), (_68431, 8), (_68430, 8), (_68429, 8), (_68428, 8), (_68427, 8), (_68426, 8), (_68425, 8), (_68424, 8), (_68423, 8), (_68422, 8), (_68421, 8), (_68420, 8), (_68419, 8), (_68418, 8), (_68417, 8), (_68416, 8), (_68415, 8), (_68414, 8), (_68413, 8), (_68412, 8), (_68411, 8), (_68410, 8), (_68764, 8), (_68763, 8), (_68762, 8), (_68761, 8), (_68760, 8), (_68759, 8), (_68758, 8), (_68757, 8), (_68756, 8), (_68755, 8), (_68754, 8), (_68753, 8), (_68752, 8), (_68751, 8), (_68750, 8), (_68749, 8), (_68748, 8), (_68747, 8), (_68746, 8), (_68745, 8), (_68744, 8), (_68743, 8), (_68742, 8), (_68741, 8), (_68740, 8), (_68739, 8), (_68738, 8), (_68737, 8), (_68736, 8), (_68735, 8), (_68734, 8), (_68733, 8), (_69087, 8), (_69086, 8), (_69085, 8), (_69084, 8), (_69083, 8), (_69082, 8), (_69081, 8), (_69080, 8), (_69079, 8), (_69078, 8), (_69077, 8), (_69076, 8), (_69075, 8), (_69074, 8), (_69073, 8), (_69072, 8), (_69071, 8), (_69070, 8), (_69069, 8), (_69068, 8), (_69067, 8), (_69066, 8), (_69065, 8), (_69064, 8), (_69063, 8), (_69062, 8), (_69061, 8), (_69060, 8), (_69059, 8), (_69058, 8), (_69057, 8), (_69056, 8), (_69410, 8), (_69409, 8), (_69408, 8), (_69407, 8), (_69406, 8), (_69405, 8), (_69404, 8), (_69403, 8), (_69402, 8), (_69401, 8), (_69400, 8), (_69399, 8), (_69398, 8), (_69397, 8), (_69396, 8), (_69395, 8), (_69394, 8), (_69393, 8), (_69392, 8), (_69391, 8), (_69390, 8), (_69389, 8), (_69388, 8), (_69387, 8), (_69386, 8), (_69385, 8), (_69384, 8), (_69383, 8), (_69382, 8), (_69381, 8), (_69380, 8), (_69379, 8), (_69733, 8), (_69732, 8), (_69731, 8), (_69730, 8), (_69729, 8), (_69728, 8), (_69727, 8), (_69726, 8), (_69725, 8), (_69724, 8), (_69723, 8), (_69722, 8), (_69721, 8), (_69720, 8), (_69719, 8), (_69718, 8), (_69717, 8), (_69716, 8), (_69715, 8), (_69714, 8), (_69713, 8), (_69712, 8), (_69711, 8), (_69710, 8), (_69709, 8), (_69708, 8), (_69707, 8), (_69706, 8), (_69705, 8), (_69704, 8), (_69703, 8), (_69702, 8), (_70056, 8), (_70055, 8), (_70054, 8), (_70053, 8), (_70052, 8), (_70051, 8), (_70050, 8), (_70049, 8), (_70048, 8), (_70047, 8), (_70046, 8), (_70045, 8), (_70044, 8), (_70043, 8), (_70042, 8), (_70041, 8), (_70040, 8), (_70039, 8), (_70038, 8), (_70037, 8), (_70036, 8), (_70035, 8), (_70034, 8), (_70033, 8), (_70032, 8), (_70031, 8), (_70030, 8), (_70029, 8), (_70028, 8), (_70027, 8), (_70026, 8), (_70025, 8), (_70379, 8), (_70378, 8), (_70377, 8), (_70376, 8), (_70375, 8), (_70374, 8), (_70373, 8), (_70372, 8), (_70371, 8), (_70370, 8), (_70369, 8), (_70368, 8), (_70367, 8), (_70366, 8), (_70365, 8), (_70364, 8), (_70363, 8), (_70362, 8), (_70361, 8), (_70360, 8), (_70359, 8), (_70358, 8), (_70357, 8), (_70356, 8), (_70355, 8), (_70354, 8), (_70353, 8), (_70352, 8), (_70351, 8), (_70350, 8), (_70349, 8), (_70348, 8), (_70702, 8), (_70701, 8), (_70700, 8), (_70699, 8), (_70698, 8), (_70697, 8), (_70696, 8), (_70695, 8), (_70694, 8), (_70693, 8), (_70692, 8), (_70691, 8), (_70690, 8), (_70689, 8), (_70688, 8), (_70687, 8), (_70686, 8), (_70685, 8), (_70684, 8), (_70683, 8), (_70682, 8), (_70681, 8), (_70680, 8), (_70679, 8), (_70678, 8), (_70677, 8), (_70676, 8), (_70675, 8), (_70674, 8), (_70673, 8), (_70672, 8), (_70671, 8), (_71025, 8), (_71024, 8), (_71023, 8), (_71022, 8), (_71021, 8), (_71020, 8), (_71019, 8), (_71018, 8), (_71017, 8), (_71016, 8), (_71015, 8), (_71014, 8), (_71013, 8), (_71012, 8), (_71011, 8), (_71010, 8), (_71009, 8), (_71008, 8), (_71007, 8), (_71006, 8), (_71005, 8), (_71004, 8), (_71003, 8), (_71002, 8), (_71001, 8), (_71000, 8), (_70999, 8), (_70998, 8), (_70997, 8), (_70996, 8), (_70995, 8), (_70994, 8), (_71348, 8), (_71347, 8), (_71346, 8), (_71345, 8), (_71344, 8), (_71343, 8), (_71342, 8), (_71341, 8), (_71340, 8), (_71339, 8), (_71338, 8), (_71337, 8), (_71336, 8), (_71335, 8), (_71334, 8), (_71333, 8), (_71332, 8), (_71331, 8), (_71330, 8), (_71329, 8), (_71328, 8), (_71327, 8), (_71326, 8), (_71325, 8), (_71324, 8), (_71323, 8), (_71322, 8), (_71321, 8), (_71320, 8), (_71319, 8), (_71318, 8), (_71317, 8), (_71671, 8), (_71670, 8), (_71669, 8), (_71668, 8), (_71667, 8), (_71666, 8), (_71665, 8), (_71664, 8), (_71663, 8), (_71662, 8), (_71661, 8), (_71660, 8), (_71659, 8), (_71658, 8), (_71657, 8), (_71656, 8), (_71655, 8), (_71654, 8), (_71653, 8), (_71652, 8), (_71651, 8), (_71650, 8), (_71649, 8), (_71648, 8), (_71647, 8), (_71646, 8), (_71645, 8), (_71644, 8), (_71643, 8), (_71642, 8), (_71641, 8), (_71640, 8), (_71994, 8), (_71993, 8), (_71992, 8), (_71991, 8), (_71990, 8), (_71989, 8), (_71988, 8), (_71987, 8), (_71986, 8), (_71985, 8), (_71984, 8), (_71983, 8), (_71982, 8), (_71981, 8), (_71980, 8), (_71979, 8), (_71978, 8), (_71977, 8), (_71976, 8), (_71975, 8), (_71974, 8), (_71973, 8), (_71972, 8), (_71971, 8), (_71970, 8), (_71969, 8), (_71968, 8), (_71967, 8), (_71966, 8), (_71965, 8), (_71964, 8), (_71963, 8), (_72317, 8), (_72316, 8), (_72315, 8), (_72314, 8), (_72313, 8), (_72312, 8), (_72311, 8), (_72310, 8), (_72309, 8), (_72308, 8), (_72307, 8), (_72306, 8), (_72305, 8), (_72304, 8), (_72303, 8), (_72302, 8), (_72301, 8), (_72300, 8), (_72299, 8), (_72298, 8), (_72297, 8), (_72296, 8), (_72295, 8), (_72294, 8), (_72293, 8), (_72292, 8), (_72291, 8), (_72290, 8), (_72289, 8), (_72288, 8), (_72287, 8), (_72286, 8), (_72640, 8), (_72639, 8), (_72638, 8), (_72637, 8), (_72636, 8), (_72635, 8), (_72634, 8), (_72633, 8), (_72632, 8), (_72631, 8), (_72630, 8), (_72629, 8), (_72628, 8), (_72627, 8), (_72626, 8), (_72625, 8), (_72624, 8), (_72623, 8), (_72622, 8), (_72621, 8), (_72620, 8), (_72619, 8), (_72618, 8), (_72617, 8), (_72616, 8), (_72615, 8), (_72614, 8), (_72613, 8), (_72612, 8), (_72611, 8), (_72610, 8), (_72609, 8), (_72963, 8), (_72962, 8), (_72961, 8), (_72960, 8), (_72959, 8), (_72958, 8), (_72957, 8), (_72956, 8), (_72955, 8), (_72954, 8), (_72953, 8), (_72952, 8), (_72951, 8), (_72950, 8), (_72949, 8), (_72948, 8), (_72947, 8), (_72946, 8), (_72945, 8), (_72944, 8), (_72943, 8), (_72942, 8), (_72941, 8), (_72940, 8), (_72939, 8), (_72938, 8), (_72937, 8), (_72936, 8), (_72935, 8), (_72934, 8), (_72933, 8), (_72932, 8), (_73286, 8), (_73285, 8), (_73284, 8), (_73283, 8), (_73282, 8), (_73281, 8), (_73280, 8), (_73279, 8), (_73278, 8), (_73277, 8), (_73276, 8), (_73275, 8), (_73274, 8), (_73273, 8), (_73272, 8), (_73271, 8), (_73270, 8), (_73269, 8), (_73268, 8), (_73267, 8), (_73266, 8), (_73265, 8), (_73264, 8), (_73263, 8), (_73262, 8), (_73261, 8), (_73260, 8), (_73259, 8), (_73258, 8), (_73257, 8), (_73256, 8), (_73255, 8), (_73609, 8), (_73608, 8), (_73607, 8), (_73606, 8), (_73605, 8), (_73604, 8), (_73603, 8), (_73602, 8), (_73601, 8), (_73600, 8), (_73599, 8), (_73598, 8), (_73597, 8), (_73596, 8), (_73595, 8), (_73594, 8), (_73593, 8), (_73592, 8), (_73591, 8), (_73590, 8), (_73589, 8), (_73588, 8), (_73587, 8), (_73586, 8), (_73585, 8), (_73584, 8), (_73583, 8), (_73582, 8), (_73581, 8), (_73580, 8), (_73579, 8), (_73578, 8), (_73932, 8), (_73931, 8), (_73930, 8), (_73929, 8), (_73928, 8), (_73927, 8), (_73926, 8), (_73925, 8), (_73924, 8), (_73923, 8), (_73922, 8), (_73921, 8), (_73920, 8), (_73919, 8), (_73918, 8), (_73917, 8), (_73916, 8), (_73915, 8), (_73914, 8), (_73913, 8), (_73912, 8), (_73911, 8), (_73910, 8), (_73909, 8), (_73908, 8), (_73907, 8), (_73906, 8), (_73905, 8), (_73904, 8), (_73903, 8), (_73902, 8), (_73901, 8), (_74255, 8), (_74254, 8), (_74253, 8), (_74252, 8), (_74251, 8), (_74250, 8), (_74249, 8), (_74248, 8), (_74247, 8), (_74246, 8), (_74245, 8), (_74244, 8), (_74243, 8), (_74242, 8), (_74241, 8), (_74240, 8), (_74239, 8), (_74238, 8), (_74237, 8), (_74236, 8), (_74235, 8), (_74234, 8), (_74233, 8), (_74232, 8), (_74231, 8), (_74230, 8), (_74229, 8), (_74228, 8), (_74227, 8), (_74226, 8), (_74225, 8), (_74224, 8), (_74578, 8), (_74577, 8), (_74576, 8), (_74575, 8), (_74574, 8), (_74573, 8), (_74572, 8), (_74571, 8), (_74570, 8), (_74569, 8), (_74568, 8), (_74567, 8), (_74566, 8), (_74565, 8), (_74564, 8), (_74563, 8), (_74562, 8), (_74561, 8), (_74560, 8), (_74559, 8), (_74558, 8), (_74557, 8), (_74556, 8), (_74555, 8), (_74554, 8), (_74553, 8), (_74552, 8), (_74551, 8), (_74550, 8), (_74549, 8), (_74548, 8), (_74547, 8), (_74901, 8), (_74900, 8), (_74899, 8), (_74898, 8), (_74897, 8), (_74896, 8), (_74895, 8), (_74894, 8), (_74893, 8), (_74892, 8), (_74891, 8), (_74890, 8), (_74889, 8), (_74888, 8), (_74887, 8), (_74886, 8), (_74885, 8), (_74884, 8), (_74883, 8), (_74882, 8), (_74881, 8), (_74880, 8), (_74879, 8), (_74878, 8), (_74877, 8), (_74876, 8), (_74875, 8), (_74874, 8), (_74873, 8), (_74872, 8), (_74871, 8), (_74870, 8), (_75224, 8), (_75223, 8), (_75222, 8), (_75221, 8), (_75220, 8), (_75219, 8), (_75218, 8), (_75217, 8), (_75216, 8), (_75215, 8), (_75214, 8), (_75213, 8), (_75212, 8), (_75211, 8), (_75210, 8), (_75209, 8), (_75208, 8), (_75207, 8), (_75206, 8), (_75205, 8), (_75204, 8), (_75203, 8), (_75202, 8), (_75201, 8), (_75200, 8), (_75199, 8), (_75198, 8), (_75197, 8), (_75196, 8), (_75195, 8), (_75194, 8), (_75193, 8), (_75547, 8), (_75546, 8), (_75545, 8), (_75544, 8), (_75543, 8), (_75542, 8), (_75541, 8), (_75540, 8), (_75539, 8), (_75538, 8), (_75537, 8), (_75536, 8), (_75535, 8), (_75534, 8), (_75533, 8), (_75532, 8), (_75531, 8), (_75530, 8), (_75529, 8), (_75528, 8), (_75527, 8), (_75526, 8), (_75525, 8), (_75524, 8), (_75523, 8), (_75522, 8), (_75521, 8), (_75520, 8), (_75519, 8), (_75518, 8), (_75517, 8), (_75516, 8), (_75870, 8), (_75869, 8), (_75868, 8), (_75867, 8), (_75866, 8), (_75865, 8), (_75864, 8), (_75863, 8), (_75862, 8), (_75861, 8), (_75860, 8), (_75859, 8), (_75858, 8), (_75857, 8), (_75856, 8), (_75855, 8), (_75854, 8), (_75853, 8), (_75852, 8), (_75851, 8), (_75850, 8), (_75849, 8), (_75848, 8), (_75847, 8), (_75846, 8), (_75845, 8), (_75844, 8), (_75843, 8), (_75842, 8), (_75841, 8), (_75840, 8), (_75839, 8), (_76193, 8), (_76192, 8), (_76191, 8), (_76190, 8), (_76189, 8), (_76188, 8), (_76187, 8), (_76186, 8), (_76185, 8), (_76184, 8), (_76183, 8), (_76182, 8), (_76181, 8), (_76180, 8), (_76179, 8), (_76178, 8), (_76177, 8), (_76176, 8), (_76175, 8), (_76174, 8), (_76173, 8), (_76172, 8), (_76171, 8), (_76170, 8), (_76169, 8), (_76168, 8), (_76167, 8), (_76166, 8), (_76165, 8), (_76164, 8), (_76163, 8), (_76162, 8), (_76516, 8), (_76515, 8), (_76514, 8), (_76513, 8), (_76512, 8), (_76511, 8), (_76510, 8), (_76509, 8), (_76508, 8), (_76507, 8), (_76506, 8), (_76505, 8), (_76504, 8), (_76503, 8), (_76502, 8), (_76501, 8), (_76500, 8), (_76499, 8), (_76498, 8), (_76497, 8), (_76496, 8), (_76495, 8), (_76494, 8), (_76493, 8), (_76492, 8), (_76491, 8), (_76490, 8), (_76489, 8), (_76488, 8), (_76487, 8), (_76486, 8), (_76485, 8), (_76839, 8), (_76838, 8), (_76837, 8), (_76836, 8), (_76835, 8), (_76834, 8), (_76833, 8), (_76832, 8), (_76831, 8), (_76830, 8), (_76829, 8), (_76828, 8), (_76827, 8), (_76826, 8), (_76825, 8), (_76824, 8), (_76823, 8), (_76822, 8), (_76821, 8), (_76820, 8), (_76819, 8), (_76818, 8), (_76817, 8), (_76816, 8), (_76815, 8), (_76814, 8), (_76813, 8), (_76812, 8), (_76811, 8), (_76810, 8), (_76809, 8), (_76808, 8), (_77162, 8), (_77161, 8), (_77160, 8), (_77159, 8), (_77158, 8), (_77157, 8), (_77156, 8), (_77155, 8), (_77154, 8), (_77153, 8), (_77152, 8), (_77151, 8), (_77150, 8), (_77149, 8), (_77148, 8), (_77147, 8), (_77146, 8), (_77145, 8), (_77144, 8), (_77143, 8), (_77142, 8), (_77141, 8), (_77140, 8), (_77139, 8), (_77138, 8), (_77137, 8), (_77136, 8), (_77135, 8), (_77134, 8), (_77133, 8), (_77132, 8), (_77131, 8), (_77485, 8), (_77484, 8), (_77483, 8), (_77482, 8), (_77481, 8), (_77480, 8), (_77479, 8), (_77478, 8), (_77477, 8), (_77476, 8), (_77475, 8), (_77474, 8), (_77473, 8), (_77472, 8), (_77471, 8), (_77470, 8), (_77469, 8), (_77468, 8), (_77467, 8), (_77466, 8), (_77465, 8), (_77464, 8), (_77463, 8), (_77462, 8), (_77461, 8), (_77460, 8), (_77459, 8), (_77458, 8), (_77457, 8), (_77456, 8), (_77455, 8), (_77454, 8), (_77808, 8), (_77807, 8), (_77806, 8), (_77805, 8), (_77804, 8), (_77803, 8), (_77802, 8), (_77801, 8), (_77800, 8), (_77799, 8), (_77798, 8), (_77797, 8), (_77796, 8), (_77795, 8), (_77794, 8), (_77793, 8), (_77792, 8), (_77791, 8), (_77790, 8), (_77789, 8), (_77788, 8), (_77787, 8), (_77786, 8), (_77785, 8), (_77784, 8), (_77783, 8), (_77782, 8), (_77781, 8), (_77780, 8), (_77779, 8), (_77778, 8), (_77777, 8), (_78131, 8), (_78130, 8), (_78129, 8), (_78128, 8), (_78127, 8), (_78126, 8), (_78125, 8), (_78124, 8), (_78123, 8), (_78122, 8), (_78121, 8), (_78120, 8), (_78119, 8), (_78118, 8), (_78117, 8), (_78116, 8), (_78115, 8), (_78114, 8), (_78113, 8), (_78112, 8), (_78111, 8), (_78110, 8), (_78109, 8), (_78108, 8), (_78107, 8), (_78106, 8), (_78105, 8), (_78104, 8), (_78103, 8), (_78102, 8), (_78101, 8), (_78100, 8), (_78454, 8), (_78453, 8), (_78452, 8), (_78451, 8), (_78450, 8), (_78449, 8), (_78448, 8), (_78447, 8), (_78446, 8), (_78445, 8), (_78444, 8), (_78443, 8), (_78442, 8), (_78441, 8), (_78440, 8), (_78439, 8), (_78438, 8), (_78437, 8), (_78436, 8), (_78435, 8), (_78434, 8), (_78433, 8), (_78432, 8), (_78431, 8), (_78430, 8), (_78429, 8), (_78428, 8), (_78427, 8), (_78426, 8), (_78425, 8), (_78424, 8), (_78423, 8), (_78777, 8), (_78776, 8), (_78775, 8), (_78774, 8), (_78773, 8), (_78772, 8), (_78771, 8), (_78770, 8), (_78769, 8), (_78768, 8), (_78767, 8), (_78766, 8), (_78765, 8), (_78764, 8), (_78763, 8), (_78762, 8), (_78761, 8), (_78760, 8), (_78759, 8), (_78758, 8), (_78757, 8), (_78756, 8), (_78755, 8), (_78754, 8), (_78753, 8), (_78752, 8), (_78751, 8), (_78750, 8), (_78749, 8), (_78748, 8), (_78747, 8), (_78746, 8), (_79100, 8), (_79099, 8), (_79098, 8), (_79097, 8), (_79096, 8), (_79095, 8), (_79094, 8), (_79093, 8), (_79092, 8), (_79091, 8), (_79090, 8), (_79089, 8), (_79088, 8), (_79087, 8), (_79086, 8), (_79085, 8), (_79084, 8), (_79083, 8), (_79082, 8), (_79081, 8), (_79080, 8), (_79079, 8), (_79078, 8), (_79077, 8), (_79076, 8), (_79075, 8), (_79074, 8), (_79073, 8), (_79072, 8), (_79071, 8), (_79070, 8), (_79069, 8), (_79423, 8), (_79422, 8), (_79421, 8), (_79420, 8), (_79419, 8), (_79418, 8), (_79417, 8), (_79416, 8), (_79415, 8), (_79414, 8), (_79413, 8), (_79412, 8), (_79411, 8), (_79410, 8), (_79409, 8), (_79408, 8), (_79407, 8), (_79406, 8), (_79405, 8), (_79404, 8), (_79403, 8), (_79402, 8), (_79401, 8), (_79400, 8), (_79399, 8), (_79398, 8), (_79397, 8), (_79396, 8), (_79395, 8), (_79394, 8), (_79393, 8), (_79392, 8), (_79746, 8), (_79745, 8), (_79744, 8), (_79743, 8), (_79742, 8), (_79741, 8), (_79740, 8), (_79739, 8), (_79738, 8), (_79737, 8), (_79736, 8), (_79735, 8), (_79734, 8), (_79733, 8), (_79732, 8), (_79731, 8), (_79730, 8), (_79729, 8), (_79728, 8), (_79727, 8), (_79726, 8), (_79725, 8), (_79724, 8), (_79723, 8), (_79722, 8), (_79721, 8), (_79720, 8), (_79719, 8), (_79718, 8), (_79717, 8), (_79716, 8), (_79715, 8), (_80069, 8), (_80068, 8), (_80067, 8), (_80066, 8), (_80065, 8), (_80064, 8), (_80063, 8), (_80062, 8), (_80061, 8), (_80060, 8), (_80059, 8), (_80058, 8), (_80057, 8), (_80056, 8), (_80055, 8), (_80054, 8), (_80053, 8), (_80052, 8), (_80051, 8), (_80050, 8), (_80049, 8), (_80048, 8), (_80047, 8), (_80046, 8), (_80045, 8), (_80044, 8), (_80043, 8), (_80042, 8), (_80041, 8), (_80040, 8), (_80039, 8), (_80038, 8), (_80392, 8), (_80391, 8), (_80390, 8), (_80389, 8), (_80388, 8), (_80387, 8), (_80386, 8), (_80385, 8), (_80384, 8), (_80383, 8), (_80382, 8), (_80381, 8), (_80380, 8), (_80379, 8), (_80378, 8), (_80377, 8), (_80376, 8), (_80375, 8), (_80374, 8), (_80373, 8), (_80372, 8), (_80371, 8), (_80370, 8), (_80369, 8), (_80368, 8), (_80367, 8), (_80366, 8), (_80365, 8), (_80364, 8), (_80363, 8), (_80362, 8), (_80361, 8), (_80715, 8), (_80714, 8), (_80713, 8), (_80712, 8), (_80711, 8), (_80710, 8), (_80709, 8), (_80708, 8), (_80707, 8), (_80706, 8), (_80705, 8), (_80704, 8), (_80703, 8), (_80702, 8), (_80701, 8), (_80700, 8), (_80699, 8), (_80698, 8), (_80697, 8), (_80696, 8), (_80695, 8), (_80694, 8), (_80693, 8), (_80692, 8), (_80691, 8), (_80690, 8), (_80689, 8), (_80688, 8), (_80687, 8), (_80686, 8), (_80685, 8), (_80684, 8), (_81038, 8), (_81037, 8), (_81036, 8), (_81035, 8), (_81034, 8), (_81033, 8), (_81032, 8), (_81031, 8), (_81030, 8), (_81029, 8), (_81028, 8), (_81027, 8), (_81026, 8), (_81025, 8), (_81024, 8), (_81023, 8), (_81022, 8), (_81021, 8), (_81020, 8), (_81019, 8), (_81018, 8), (_81017, 8), (_81016, 8), (_81015, 8), (_81014, 8), (_81013, 8), (_81012, 8), (_81011, 8), (_81010, 8), (_81009, 8), (_81008, 8), (_81007, 8), (_81361, 8), (_81360, 8), (_81359, 8), (_81358, 8), (_81357, 8), (_81356, 8), (_81355, 8), (_81354, 8), (_81353, 8), (_81352, 8), (_81351, 8), (_81350, 8), (_81349, 8), (_81348, 8), (_81347, 8), (_81346, 8), (_81345, 8), (_81344, 8), (_81343, 8), (_81342, 8), (_81341, 8), (_81340, 8), (_81339, 8), (_81338, 8), (_81337, 8), (_81336, 8), (_81335, 8), (_81334, 8), (_81333, 8), (_81332, 8), (_81331, 8), (_81330, 8), (_81684, 8), (_81683, 8), (_81682, 8), (_81681, 8), (_81680, 8), (_81679, 8), (_81678, 8), (_81677, 8), (_81676, 8), (_81675, 8), (_81674, 8), (_81673, 8), (_81672, 8), (_81671, 8), (_81670, 8), (_81669, 8), (_81668, 8), (_81667, 8), (_81666, 8), (_81665, 8), (_81664, 8), (_81663, 8), (_81662, 8), (_81661, 8), (_81660, 8), (_81659, 8), (_81658, 8), (_81657, 8), (_81656, 8), (_81655, 8), (_81654, 8), (_81653, 8), (_82007, 8), (_82006, 8), (_82005, 8), (_82004, 8), (_82003, 8), (_82002, 8), (_82001, 8), (_82000, 8), (_81999, 8), (_81998, 8), (_81997, 8), (_81996, 8), (_81995, 8), (_81994, 8), (_81993, 8), (_81992, 8), (_81991, 8), (_81990, 8), (_81989, 8), (_81988, 8), (_81987, 8), (_81986, 8), (_81985, 8), (_81984, 8), (_81983, 8), (_81982, 8), (_81981, 8), (_81980, 8), (_81979, 8), (_81978, 8), (_81977, 8), (_81976, 8), (_82330, 8), (_82329, 8), (_82328, 8), (_82327, 8), (_82326, 8), (_82325, 8), (_82324, 8), (_82323, 8), (_82322, 8), (_82321, 8), (_82320, 8), (_82319, 8), (_82318, 8), (_82317, 8), (_82316, 8), (_82315, 8), (_82314, 8), (_82313, 8), (_82312, 8), (_82311, 8), (_82310, 8), (_82309, 8), (_82308, 8), (_82307, 8), (_82306, 8), (_82305, 8), (_82304, 8), (_82303, 8), (_82302, 8), (_82301, 8), (_82300, 8), (_82299, 8), (_82653, 8), (_82652, 8), (_82651, 8), (_82650, 8), (_82649, 8), (_82648, 8), (_82647, 8), (_82646, 8), (_82645, 8), (_82644, 8), (_82643, 8), (_82642, 8), (_82641, 8), (_82640, 8), (_82639, 8), (_82638, 8), (_82637, 8), (_82636, 8), (_82635, 8), (_82634, 8), (_82633, 8), (_82632, 8), (_82631, 8), (_82630, 8), (_82629, 8), (_82628, 8), (_82627, 8), (_82626, 8), (_82625, 8), (_82624, 8), (_82623, 8), (_82622, 8)] [_82945, _82946, _82947, _82948, _82949, _82950, _82951, _82952, _82953, _82954, _82955, _82956, _82957, _82958, _82959, _82960, _82961, _82962, _82963, _82964, _82965, _82966, _82967, _82968, _82969, _82970, _82971, _82972, _82973, _82974, _82975, _82976]", + "BLACKBOX::BLAKE2S [(_288, 8), (_287, 8), (_286, 8), (_285, 8), (_284, 8), (_283, 8), (_282, 8), (_281, 8), (_280, 8), (_279, 8), (_278, 8), (_277, 8), (_276, 8), (_275, 8), (_274, 8), (_273, 8), (_272, 8), (_271, 8), (_270, 8), (_269, 8), (_268, 8), (_267, 8), (_266, 8), (_265, 8), (_264, 8), (_263, 8), (_262, 8), (_261, 8), (_260, 8), (_259, 8), (_258, 8), (_257, 8), (_611, 8), (_610, 8), (_609, 8), (_608, 8), (_607, 8), (_606, 8), (_605, 8), (_604, 8), (_603, 8), (_602, 8), (_601, 8), (_600, 8), (_599, 8), (_598, 8), (_597, 8), (_596, 8), (_595, 8), (_594, 8), (_593, 8), (_592, 8), (_591, 8), (_590, 8), (_589, 8), (_588, 8), (_587, 8), (_586, 8), (_585, 8), (_584, 8), (_583, 8), (_582, 8), (_581, 8), (_580, 8), (_934, 8), (_933, 8), (_932, 8), (_931, 8), (_930, 8), (_929, 8), (_928, 8), (_927, 8), (_926, 8), (_925, 8), (_924, 8), (_923, 8), (_922, 8), (_921, 8), (_920, 8), (_919, 8), (_918, 8), (_917, 8), (_916, 8), (_915, 8), (_914, 8), (_913, 8), (_912, 8), (_911, 8), (_910, 8), (_909, 8), (_908, 8), (_907, 8), (_906, 8), (_905, 8), (_904, 8), (_903, 8), (_1257, 8), (_1256, 8), (_1255, 8), (_1254, 8), (_1253, 8), (_1252, 8), (_1251, 8), (_1250, 8), (_1249, 8), (_1248, 8), (_1247, 8), (_1246, 8), (_1245, 8), (_1244, 8), (_1243, 8), (_1242, 8), (_1241, 8), (_1240, 8), (_1239, 8), (_1238, 8), (_1237, 8), (_1236, 8), (_1235, 8), (_1234, 8), (_1233, 8), (_1232, 8), (_1231, 8), (_1230, 8), (_1229, 8), (_1228, 8), (_1227, 8), (_1226, 8), (_1580, 8), (_1579, 8), (_1578, 8), (_1577, 8), (_1576, 8), (_1575, 8), (_1574, 8), (_1573, 8), (_1572, 8), (_1571, 8), (_1570, 8), (_1569, 8), (_1568, 8), (_1567, 8), (_1566, 8), (_1565, 8), (_1564, 8), (_1563, 8), (_1562, 8), (_1561, 8), (_1560, 8), (_1559, 8), (_1558, 8), (_1557, 8), (_1556, 8), (_1555, 8), (_1554, 8), (_1553, 8), (_1552, 8), (_1551, 8), (_1550, 8), (_1549, 8), (_1903, 8), (_1902, 8), (_1901, 8), (_1900, 8), (_1899, 8), (_1898, 8), (_1897, 8), (_1896, 8), (_1895, 8), (_1894, 8), (_1893, 8), (_1892, 8), (_1891, 8), (_1890, 8), (_1889, 8), (_1888, 8), (_1887, 8), (_1886, 8), (_1885, 8), (_1884, 8), (_1883, 8), (_1882, 8), (_1881, 8), (_1880, 8), (_1879, 8), (_1878, 8), (_1877, 8), (_1876, 8), (_1875, 8), (_1874, 8), (_1873, 8), (_1872, 8), (_2226, 8), (_2225, 8), (_2224, 8), (_2223, 8), (_2222, 8), (_2221, 8), (_2220, 8), (_2219, 8), (_2218, 8), (_2217, 8), (_2216, 8), (_2215, 8), (_2214, 8), (_2213, 8), (_2212, 8), (_2211, 8), (_2210, 8), (_2209, 8), (_2208, 8), (_2207, 8), (_2206, 8), (_2205, 8), (_2204, 8), (_2203, 8), (_2202, 8), (_2201, 8), (_2200, 8), (_2199, 8), (_2198, 8), (_2197, 8), (_2196, 8), (_2195, 8), (_2549, 8), (_2548, 8), (_2547, 8), (_2546, 8), (_2545, 8), (_2544, 8), (_2543, 8), (_2542, 8), (_2541, 8), (_2540, 8), (_2539, 8), (_2538, 8), (_2537, 8), (_2536, 8), (_2535, 8), (_2534, 8), (_2533, 8), (_2532, 8), (_2531, 8), (_2530, 8), (_2529, 8), (_2528, 8), (_2527, 8), (_2526, 8), (_2525, 8), (_2524, 8), (_2523, 8), (_2522, 8), (_2521, 8), (_2520, 8), (_2519, 8), (_2518, 8), (_2872, 8), (_2871, 8), (_2870, 8), (_2869, 8), (_2868, 8), (_2867, 8), (_2866, 8), (_2865, 8), (_2864, 8), (_2863, 8), (_2862, 8), (_2861, 8), (_2860, 8), (_2859, 8), (_2858, 8), (_2857, 8), (_2856, 8), (_2855, 8), (_2854, 8), (_2853, 8), (_2852, 8), (_2851, 8), (_2850, 8), (_2849, 8), (_2848, 8), (_2847, 8), (_2846, 8), (_2845, 8), (_2844, 8), (_2843, 8), (_2842, 8), (_2841, 8), (_3195, 8), (_3194, 8), (_3193, 8), (_3192, 8), (_3191, 8), (_3190, 8), (_3189, 8), (_3188, 8), (_3187, 8), (_3186, 8), (_3185, 8), (_3184, 8), (_3183, 8), (_3182, 8), (_3181, 8), (_3180, 8), (_3179, 8), (_3178, 8), (_3177, 8), (_3176, 8), (_3175, 8), (_3174, 8), (_3173, 8), (_3172, 8), (_3171, 8), (_3170, 8), (_3169, 8), (_3168, 8), (_3167, 8), (_3166, 8), (_3165, 8), (_3164, 8), (_3518, 8), (_3517, 8), (_3516, 8), (_3515, 8), (_3514, 8), (_3513, 8), (_3512, 8), (_3511, 8), (_3510, 8), (_3509, 8), (_3508, 8), (_3507, 8), (_3506, 8), (_3505, 8), (_3504, 8), (_3503, 8), (_3502, 8), (_3501, 8), (_3500, 8), (_3499, 8), (_3498, 8), (_3497, 8), (_3496, 8), (_3495, 8), (_3494, 8), (_3493, 8), (_3492, 8), (_3491, 8), (_3490, 8), (_3489, 8), (_3488, 8), (_3487, 8), (_3841, 8), (_3840, 8), (_3839, 8), (_3838, 8), (_3837, 8), (_3836, 8), (_3835, 8), (_3834, 8), (_3833, 8), (_3832, 8), (_3831, 8), (_3830, 8), (_3829, 8), (_3828, 8), (_3827, 8), (_3826, 8), (_3825, 8), (_3824, 8), (_3823, 8), (_3822, 8), (_3821, 8), (_3820, 8), (_3819, 8), (_3818, 8), (_3817, 8), (_3816, 8), (_3815, 8), (_3814, 8), (_3813, 8), (_3812, 8), (_3811, 8), (_3810, 8), (_4164, 8), (_4163, 8), (_4162, 8), (_4161, 8), (_4160, 8), (_4159, 8), (_4158, 8), (_4157, 8), (_4156, 8), (_4155, 8), (_4154, 8), (_4153, 8), (_4152, 8), (_4151, 8), (_4150, 8), (_4149, 8), (_4148, 8), (_4147, 8), (_4146, 8), (_4145, 8), (_4144, 8), (_4143, 8), (_4142, 8), (_4141, 8), (_4140, 8), (_4139, 8), (_4138, 8), (_4137, 8), (_4136, 8), (_4135, 8), (_4134, 8), (_4133, 8), (_4487, 8), (_4486, 8), (_4485, 8), (_4484, 8), (_4483, 8), (_4482, 8), (_4481, 8), (_4480, 8), (_4479, 8), (_4478, 8), (_4477, 8), (_4476, 8), (_4475, 8), (_4474, 8), (_4473, 8), (_4472, 8), (_4471, 8), (_4470, 8), (_4469, 8), (_4468, 8), (_4467, 8), (_4466, 8), (_4465, 8), (_4464, 8), (_4463, 8), (_4462, 8), (_4461, 8), (_4460, 8), (_4459, 8), (_4458, 8), (_4457, 8), (_4456, 8), (_4810, 8), (_4809, 8), (_4808, 8), (_4807, 8), (_4806, 8), (_4805, 8), (_4804, 8), (_4803, 8), (_4802, 8), (_4801, 8), (_4800, 8), (_4799, 8), (_4798, 8), (_4797, 8), (_4796, 8), (_4795, 8), (_4794, 8), (_4793, 8), (_4792, 8), (_4791, 8), (_4790, 8), (_4789, 8), (_4788, 8), (_4787, 8), (_4786, 8), (_4785, 8), (_4784, 8), (_4783, 8), (_4782, 8), (_4781, 8), (_4780, 8), (_4779, 8), (_5133, 8), (_5132, 8), (_5131, 8), (_5130, 8), (_5129, 8), (_5128, 8), (_5127, 8), (_5126, 8), (_5125, 8), (_5124, 8), (_5123, 8), (_5122, 8), (_5121, 8), (_5120, 8), (_5119, 8), (_5118, 8), (_5117, 8), (_5116, 8), (_5115, 8), (_5114, 8), (_5113, 8), (_5112, 8), (_5111, 8), (_5110, 8), (_5109, 8), (_5108, 8), (_5107, 8), (_5106, 8), (_5105, 8), (_5104, 8), (_5103, 8), (_5102, 8), (_5456, 8), (_5455, 8), (_5454, 8), (_5453, 8), (_5452, 8), (_5451, 8), (_5450, 8), (_5449, 8), (_5448, 8), (_5447, 8), (_5446, 8), (_5445, 8), (_5444, 8), (_5443, 8), (_5442, 8), (_5441, 8), (_5440, 8), (_5439, 8), (_5438, 8), (_5437, 8), (_5436, 8), (_5435, 8), (_5434, 8), (_5433, 8), (_5432, 8), (_5431, 8), (_5430, 8), (_5429, 8), (_5428, 8), (_5427, 8), (_5426, 8), (_5425, 8), (_5779, 8), (_5778, 8), (_5777, 8), (_5776, 8), (_5775, 8), (_5774, 8), (_5773, 8), (_5772, 8), (_5771, 8), (_5770, 8), (_5769, 8), (_5768, 8), (_5767, 8), (_5766, 8), (_5765, 8), (_5764, 8), (_5763, 8), (_5762, 8), (_5761, 8), (_5760, 8), (_5759, 8), (_5758, 8), (_5757, 8), (_5756, 8), (_5755, 8), (_5754, 8), (_5753, 8), (_5752, 8), (_5751, 8), (_5750, 8), (_5749, 8), (_5748, 8), (_6102, 8), (_6101, 8), (_6100, 8), (_6099, 8), (_6098, 8), (_6097, 8), (_6096, 8), (_6095, 8), (_6094, 8), (_6093, 8), (_6092, 8), (_6091, 8), (_6090, 8), (_6089, 8), (_6088, 8), (_6087, 8), (_6086, 8), (_6085, 8), (_6084, 8), (_6083, 8), (_6082, 8), (_6081, 8), (_6080, 8), (_6079, 8), (_6078, 8), (_6077, 8), (_6076, 8), (_6075, 8), (_6074, 8), (_6073, 8), (_6072, 8), (_6071, 8), (_6425, 8), (_6424, 8), (_6423, 8), (_6422, 8), (_6421, 8), (_6420, 8), (_6419, 8), (_6418, 8), (_6417, 8), (_6416, 8), (_6415, 8), (_6414, 8), (_6413, 8), (_6412, 8), (_6411, 8), (_6410, 8), (_6409, 8), (_6408, 8), (_6407, 8), (_6406, 8), (_6405, 8), (_6404, 8), (_6403, 8), (_6402, 8), (_6401, 8), (_6400, 8), (_6399, 8), (_6398, 8), (_6397, 8), (_6396, 8), (_6395, 8), (_6394, 8), (_6748, 8), (_6747, 8), (_6746, 8), (_6745, 8), (_6744, 8), (_6743, 8), (_6742, 8), (_6741, 8), (_6740, 8), (_6739, 8), (_6738, 8), (_6737, 8), (_6736, 8), (_6735, 8), (_6734, 8), (_6733, 8), (_6732, 8), (_6731, 8), (_6730, 8), (_6729, 8), (_6728, 8), (_6727, 8), (_6726, 8), (_6725, 8), (_6724, 8), (_6723, 8), (_6722, 8), (_6721, 8), (_6720, 8), (_6719, 8), (_6718, 8), (_6717, 8), (_7071, 8), (_7070, 8), (_7069, 8), (_7068, 8), (_7067, 8), (_7066, 8), (_7065, 8), (_7064, 8), (_7063, 8), (_7062, 8), (_7061, 8), (_7060, 8), (_7059, 8), (_7058, 8), (_7057, 8), (_7056, 8), (_7055, 8), (_7054, 8), (_7053, 8), (_7052, 8), (_7051, 8), (_7050, 8), (_7049, 8), (_7048, 8), (_7047, 8), (_7046, 8), (_7045, 8), (_7044, 8), (_7043, 8), (_7042, 8), (_7041, 8), (_7040, 8), (_7394, 8), (_7393, 8), (_7392, 8), (_7391, 8), (_7390, 8), (_7389, 8), (_7388, 8), (_7387, 8), (_7386, 8), (_7385, 8), (_7384, 8), (_7383, 8), (_7382, 8), (_7381, 8), (_7380, 8), (_7379, 8), (_7378, 8), (_7377, 8), (_7376, 8), (_7375, 8), (_7374, 8), (_7373, 8), (_7372, 8), (_7371, 8), (_7370, 8), (_7369, 8), (_7368, 8), (_7367, 8), (_7366, 8), (_7365, 8), (_7364, 8), (_7363, 8), (_7717, 8), (_7716, 8), (_7715, 8), (_7714, 8), (_7713, 8), (_7712, 8), (_7711, 8), (_7710, 8), (_7709, 8), (_7708, 8), (_7707, 8), (_7706, 8), (_7705, 8), (_7704, 8), (_7703, 8), (_7702, 8), (_7701, 8), (_7700, 8), (_7699, 8), (_7698, 8), (_7697, 8), (_7696, 8), (_7695, 8), (_7694, 8), (_7693, 8), (_7692, 8), (_7691, 8), (_7690, 8), (_7689, 8), (_7688, 8), (_7687, 8), (_7686, 8), (_8040, 8), (_8039, 8), (_8038, 8), (_8037, 8), (_8036, 8), (_8035, 8), (_8034, 8), (_8033, 8), (_8032, 8), (_8031, 8), (_8030, 8), (_8029, 8), (_8028, 8), (_8027, 8), (_8026, 8), (_8025, 8), (_8024, 8), (_8023, 8), (_8022, 8), (_8021, 8), (_8020, 8), (_8019, 8), (_8018, 8), (_8017, 8), (_8016, 8), (_8015, 8), (_8014, 8), (_8013, 8), (_8012, 8), (_8011, 8), (_8010, 8), (_8009, 8), (_8363, 8), (_8362, 8), (_8361, 8), (_8360, 8), (_8359, 8), (_8358, 8), (_8357, 8), (_8356, 8), (_8355, 8), (_8354, 8), (_8353, 8), (_8352, 8), (_8351, 8), (_8350, 8), (_8349, 8), (_8348, 8), (_8347, 8), (_8346, 8), (_8345, 8), (_8344, 8), (_8343, 8), (_8342, 8), (_8341, 8), (_8340, 8), (_8339, 8), (_8338, 8), (_8337, 8), (_8336, 8), (_8335, 8), (_8334, 8), (_8333, 8), (_8332, 8), (_8686, 8), (_8685, 8), (_8684, 8), (_8683, 8), (_8682, 8), (_8681, 8), (_8680, 8), (_8679, 8), (_8678, 8), (_8677, 8), (_8676, 8), (_8675, 8), (_8674, 8), (_8673, 8), (_8672, 8), (_8671, 8), (_8670, 8), (_8669, 8), (_8668, 8), (_8667, 8), (_8666, 8), (_8665, 8), (_8664, 8), (_8663, 8), (_8662, 8), (_8661, 8), (_8660, 8), (_8659, 8), (_8658, 8), (_8657, 8), (_8656, 8), (_8655, 8), (_9009, 8), (_9008, 8), (_9007, 8), (_9006, 8), (_9005, 8), (_9004, 8), (_9003, 8), (_9002, 8), (_9001, 8), (_9000, 8), (_8999, 8), (_8998, 8), (_8997, 8), (_8996, 8), (_8995, 8), (_8994, 8), (_8993, 8), (_8992, 8), (_8991, 8), (_8990, 8), (_8989, 8), (_8988, 8), (_8987, 8), (_8986, 8), (_8985, 8), (_8984, 8), (_8983, 8), (_8982, 8), (_8981, 8), (_8980, 8), (_8979, 8), (_8978, 8), (_9332, 8), (_9331, 8), (_9330, 8), (_9329, 8), (_9328, 8), (_9327, 8), (_9326, 8), (_9325, 8), (_9324, 8), (_9323, 8), (_9322, 8), (_9321, 8), (_9320, 8), (_9319, 8), (_9318, 8), (_9317, 8), (_9316, 8), (_9315, 8), (_9314, 8), (_9313, 8), (_9312, 8), (_9311, 8), (_9310, 8), (_9309, 8), (_9308, 8), (_9307, 8), (_9306, 8), (_9305, 8), (_9304, 8), (_9303, 8), (_9302, 8), (_9301, 8), (_9655, 8), (_9654, 8), (_9653, 8), (_9652, 8), (_9651, 8), (_9650, 8), (_9649, 8), (_9648, 8), (_9647, 8), (_9646, 8), (_9645, 8), (_9644, 8), (_9643, 8), (_9642, 8), (_9641, 8), (_9640, 8), (_9639, 8), (_9638, 8), (_9637, 8), (_9636, 8), (_9635, 8), (_9634, 8), (_9633, 8), (_9632, 8), (_9631, 8), (_9630, 8), (_9629, 8), (_9628, 8), (_9627, 8), (_9626, 8), (_9625, 8), (_9624, 8), (_9978, 8), (_9977, 8), (_9976, 8), (_9975, 8), (_9974, 8), (_9973, 8), (_9972, 8), (_9971, 8), (_9970, 8), (_9969, 8), (_9968, 8), (_9967, 8), (_9966, 8), (_9965, 8), (_9964, 8), (_9963, 8), (_9962, 8), (_9961, 8), (_9960, 8), (_9959, 8), (_9958, 8), (_9957, 8), (_9956, 8), (_9955, 8), (_9954, 8), (_9953, 8), (_9952, 8), (_9951, 8), (_9950, 8), (_9949, 8), (_9948, 8), (_9947, 8), (_10301, 8), (_10300, 8), (_10299, 8), (_10298, 8), (_10297, 8), (_10296, 8), (_10295, 8), (_10294, 8), (_10293, 8), (_10292, 8), (_10291, 8), (_10290, 8), (_10289, 8), (_10288, 8), (_10287, 8), (_10286, 8), (_10285, 8), (_10284, 8), (_10283, 8), (_10282, 8), (_10281, 8), (_10280, 8), (_10279, 8), (_10278, 8), (_10277, 8), (_10276, 8), (_10275, 8), (_10274, 8), (_10273, 8), (_10272, 8), (_10271, 8), (_10270, 8), (_10624, 8), (_10623, 8), (_10622, 8), (_10621, 8), (_10620, 8), (_10619, 8), (_10618, 8), (_10617, 8), (_10616, 8), (_10615, 8), (_10614, 8), (_10613, 8), (_10612, 8), (_10611, 8), (_10610, 8), (_10609, 8), (_10608, 8), (_10607, 8), (_10606, 8), (_10605, 8), (_10604, 8), (_10603, 8), (_10602, 8), (_10601, 8), (_10600, 8), (_10599, 8), (_10598, 8), (_10597, 8), (_10596, 8), (_10595, 8), (_10594, 8), (_10593, 8), (_10947, 8), (_10946, 8), (_10945, 8), (_10944, 8), (_10943, 8), (_10942, 8), (_10941, 8), (_10940, 8), (_10939, 8), (_10938, 8), (_10937, 8), (_10936, 8), (_10935, 8), (_10934, 8), (_10933, 8), (_10932, 8), (_10931, 8), (_10930, 8), (_10929, 8), (_10928, 8), (_10927, 8), (_10926, 8), (_10925, 8), (_10924, 8), (_10923, 8), (_10922, 8), (_10921, 8), (_10920, 8), (_10919, 8), (_10918, 8), (_10917, 8), (_10916, 8), (_11270, 8), (_11269, 8), (_11268, 8), (_11267, 8), (_11266, 8), (_11265, 8), (_11264, 8), (_11263, 8), (_11262, 8), (_11261, 8), (_11260, 8), (_11259, 8), (_11258, 8), (_11257, 8), (_11256, 8), (_11255, 8), (_11254, 8), (_11253, 8), (_11252, 8), (_11251, 8), (_11250, 8), (_11249, 8), (_11248, 8), (_11247, 8), (_11246, 8), (_11245, 8), (_11244, 8), (_11243, 8), (_11242, 8), (_11241, 8), (_11240, 8), (_11239, 8), (_11593, 8), (_11592, 8), (_11591, 8), (_11590, 8), (_11589, 8), (_11588, 8), (_11587, 8), (_11586, 8), (_11585, 8), (_11584, 8), (_11583, 8), (_11582, 8), (_11581, 8), (_11580, 8), (_11579, 8), (_11578, 8), (_11577, 8), (_11576, 8), (_11575, 8), (_11574, 8), (_11573, 8), (_11572, 8), (_11571, 8), (_11570, 8), (_11569, 8), (_11568, 8), (_11567, 8), (_11566, 8), (_11565, 8), (_11564, 8), (_11563, 8), (_11562, 8), (_11916, 8), (_11915, 8), (_11914, 8), (_11913, 8), (_11912, 8), (_11911, 8), (_11910, 8), (_11909, 8), (_11908, 8), (_11907, 8), (_11906, 8), (_11905, 8), (_11904, 8), (_11903, 8), (_11902, 8), (_11901, 8), (_11900, 8), (_11899, 8), (_11898, 8), (_11897, 8), (_11896, 8), (_11895, 8), (_11894, 8), (_11893, 8), (_11892, 8), (_11891, 8), (_11890, 8), (_11889, 8), (_11888, 8), (_11887, 8), (_11886, 8), (_11885, 8), (_12239, 8), (_12238, 8), (_12237, 8), (_12236, 8), (_12235, 8), (_12234, 8), (_12233, 8), (_12232, 8), (_12231, 8), (_12230, 8), (_12229, 8), (_12228, 8), (_12227, 8), (_12226, 8), (_12225, 8), (_12224, 8), (_12223, 8), (_12222, 8), (_12221, 8), (_12220, 8), (_12219, 8), (_12218, 8), (_12217, 8), (_12216, 8), (_12215, 8), (_12214, 8), (_12213, 8), (_12212, 8), (_12211, 8), (_12210, 8), (_12209, 8), (_12208, 8), (_12562, 8), (_12561, 8), (_12560, 8), (_12559, 8), (_12558, 8), (_12557, 8), (_12556, 8), (_12555, 8), (_12554, 8), (_12553, 8), (_12552, 8), (_12551, 8), (_12550, 8), (_12549, 8), (_12548, 8), (_12547, 8), (_12546, 8), (_12545, 8), (_12544, 8), (_12543, 8), (_12542, 8), (_12541, 8), (_12540, 8), (_12539, 8), (_12538, 8), (_12537, 8), (_12536, 8), (_12535, 8), (_12534, 8), (_12533, 8), (_12532, 8), (_12531, 8), (_12885, 8), (_12884, 8), (_12883, 8), (_12882, 8), (_12881, 8), (_12880, 8), (_12879, 8), (_12878, 8), (_12877, 8), (_12876, 8), (_12875, 8), (_12874, 8), (_12873, 8), (_12872, 8), (_12871, 8), (_12870, 8), (_12869, 8), (_12868, 8), (_12867, 8), (_12866, 8), (_12865, 8), (_12864, 8), (_12863, 8), (_12862, 8), (_12861, 8), (_12860, 8), (_12859, 8), (_12858, 8), (_12857, 8), (_12856, 8), (_12855, 8), (_12854, 8), (_13208, 8), (_13207, 8), (_13206, 8), (_13205, 8), (_13204, 8), (_13203, 8), (_13202, 8), (_13201, 8), (_13200, 8), (_13199, 8), (_13198, 8), (_13197, 8), (_13196, 8), (_13195, 8), (_13194, 8), (_13193, 8), (_13192, 8), (_13191, 8), (_13190, 8), (_13189, 8), (_13188, 8), (_13187, 8), (_13186, 8), (_13185, 8), (_13184, 8), (_13183, 8), (_13182, 8), (_13181, 8), (_13180, 8), (_13179, 8), (_13178, 8), (_13177, 8), (_13531, 8), (_13530, 8), (_13529, 8), (_13528, 8), (_13527, 8), (_13526, 8), (_13525, 8), (_13524, 8), (_13523, 8), (_13522, 8), (_13521, 8), (_13520, 8), (_13519, 8), (_13518, 8), (_13517, 8), (_13516, 8), (_13515, 8), (_13514, 8), (_13513, 8), (_13512, 8), (_13511, 8), (_13510, 8), (_13509, 8), (_13508, 8), (_13507, 8), (_13506, 8), (_13505, 8), (_13504, 8), (_13503, 8), (_13502, 8), (_13501, 8), (_13500, 8), (_13854, 8), (_13853, 8), (_13852, 8), (_13851, 8), (_13850, 8), (_13849, 8), (_13848, 8), (_13847, 8), (_13846, 8), (_13845, 8), (_13844, 8), (_13843, 8), (_13842, 8), (_13841, 8), (_13840, 8), (_13839, 8), (_13838, 8), (_13837, 8), (_13836, 8), (_13835, 8), (_13834, 8), (_13833, 8), (_13832, 8), (_13831, 8), (_13830, 8), (_13829, 8), (_13828, 8), (_13827, 8), (_13826, 8), (_13825, 8), (_13824, 8), (_13823, 8), (_14177, 8), (_14176, 8), (_14175, 8), (_14174, 8), (_14173, 8), (_14172, 8), (_14171, 8), (_14170, 8), (_14169, 8), (_14168, 8), (_14167, 8), (_14166, 8), (_14165, 8), (_14164, 8), (_14163, 8), (_14162, 8), (_14161, 8), (_14160, 8), (_14159, 8), (_14158, 8), (_14157, 8), (_14156, 8), (_14155, 8), (_14154, 8), (_14153, 8), (_14152, 8), (_14151, 8), (_14150, 8), (_14149, 8), (_14148, 8), (_14147, 8), (_14146, 8), (_14500, 8), (_14499, 8), (_14498, 8), (_14497, 8), (_14496, 8), (_14495, 8), (_14494, 8), (_14493, 8), (_14492, 8), (_14491, 8), (_14490, 8), (_14489, 8), (_14488, 8), (_14487, 8), (_14486, 8), (_14485, 8), (_14484, 8), (_14483, 8), (_14482, 8), (_14481, 8), (_14480, 8), (_14479, 8), (_14478, 8), (_14477, 8), (_14476, 8), (_14475, 8), (_14474, 8), (_14473, 8), (_14472, 8), (_14471, 8), (_14470, 8), (_14469, 8), (_14823, 8), (_14822, 8), (_14821, 8), (_14820, 8), (_14819, 8), (_14818, 8), (_14817, 8), (_14816, 8), (_14815, 8), (_14814, 8), (_14813, 8), (_14812, 8), (_14811, 8), (_14810, 8), (_14809, 8), (_14808, 8), (_14807, 8), (_14806, 8), (_14805, 8), (_14804, 8), (_14803, 8), (_14802, 8), (_14801, 8), (_14800, 8), (_14799, 8), (_14798, 8), (_14797, 8), (_14796, 8), (_14795, 8), (_14794, 8), (_14793, 8), (_14792, 8), (_15146, 8), (_15145, 8), (_15144, 8), (_15143, 8), (_15142, 8), (_15141, 8), (_15140, 8), (_15139, 8), (_15138, 8), (_15137, 8), (_15136, 8), (_15135, 8), (_15134, 8), (_15133, 8), (_15132, 8), (_15131, 8), (_15130, 8), (_15129, 8), (_15128, 8), (_15127, 8), (_15126, 8), (_15125, 8), (_15124, 8), (_15123, 8), (_15122, 8), (_15121, 8), (_15120, 8), (_15119, 8), (_15118, 8), (_15117, 8), (_15116, 8), (_15115, 8), (_15469, 8), (_15468, 8), (_15467, 8), (_15466, 8), (_15465, 8), (_15464, 8), (_15463, 8), (_15462, 8), (_15461, 8), (_15460, 8), (_15459, 8), (_15458, 8), (_15457, 8), (_15456, 8), (_15455, 8), (_15454, 8), (_15453, 8), (_15452, 8), (_15451, 8), (_15450, 8), (_15449, 8), (_15448, 8), (_15447, 8), (_15446, 8), (_15445, 8), (_15444, 8), (_15443, 8), (_15442, 8), (_15441, 8), (_15440, 8), (_15439, 8), (_15438, 8), (_15792, 8), (_15791, 8), (_15790, 8), (_15789, 8), (_15788, 8), (_15787, 8), (_15786, 8), (_15785, 8), (_15784, 8), (_15783, 8), (_15782, 8), (_15781, 8), (_15780, 8), (_15779, 8), (_15778, 8), (_15777, 8), (_15776, 8), (_15775, 8), (_15774, 8), (_15773, 8), (_15772, 8), (_15771, 8), (_15770, 8), (_15769, 8), (_15768, 8), (_15767, 8), (_15766, 8), (_15765, 8), (_15764, 8), (_15763, 8), (_15762, 8), (_15761, 8), (_16115, 8), (_16114, 8), (_16113, 8), (_16112, 8), (_16111, 8), (_16110, 8), (_16109, 8), (_16108, 8), (_16107, 8), (_16106, 8), (_16105, 8), (_16104, 8), (_16103, 8), (_16102, 8), (_16101, 8), (_16100, 8), (_16099, 8), (_16098, 8), (_16097, 8), (_16096, 8), (_16095, 8), (_16094, 8), (_16093, 8), (_16092, 8), (_16091, 8), (_16090, 8), (_16089, 8), (_16088, 8), (_16087, 8), (_16086, 8), (_16085, 8), (_16084, 8), (_16438, 8), (_16437, 8), (_16436, 8), (_16435, 8), (_16434, 8), (_16433, 8), (_16432, 8), (_16431, 8), (_16430, 8), (_16429, 8), (_16428, 8), (_16427, 8), (_16426, 8), (_16425, 8), (_16424, 8), (_16423, 8), (_16422, 8), (_16421, 8), (_16420, 8), (_16419, 8), (_16418, 8), (_16417, 8), (_16416, 8), (_16415, 8), (_16414, 8), (_16413, 8), (_16412, 8), (_16411, 8), (_16410, 8), (_16409, 8), (_16408, 8), (_16407, 8), (_16761, 8), (_16760, 8), (_16759, 8), (_16758, 8), (_16757, 8), (_16756, 8), (_16755, 8), (_16754, 8), (_16753, 8), (_16752, 8), (_16751, 8), (_16750, 8), (_16749, 8), (_16748, 8), (_16747, 8), (_16746, 8), (_16745, 8), (_16744, 8), (_16743, 8), (_16742, 8), (_16741, 8), (_16740, 8), (_16739, 8), (_16738, 8), (_16737, 8), (_16736, 8), (_16735, 8), (_16734, 8), (_16733, 8), (_16732, 8), (_16731, 8), (_16730, 8), (_17084, 8), (_17083, 8), (_17082, 8), (_17081, 8), (_17080, 8), (_17079, 8), (_17078, 8), (_17077, 8), (_17076, 8), (_17075, 8), (_17074, 8), (_17073, 8), (_17072, 8), (_17071, 8), (_17070, 8), (_17069, 8), (_17068, 8), (_17067, 8), (_17066, 8), (_17065, 8), (_17064, 8), (_17063, 8), (_17062, 8), (_17061, 8), (_17060, 8), (_17059, 8), (_17058, 8), (_17057, 8), (_17056, 8), (_17055, 8), (_17054, 8), (_17053, 8), (_17407, 8), (_17406, 8), (_17405, 8), (_17404, 8), (_17403, 8), (_17402, 8), (_17401, 8), (_17400, 8), (_17399, 8), (_17398, 8), (_17397, 8), (_17396, 8), (_17395, 8), (_17394, 8), (_17393, 8), (_17392, 8), (_17391, 8), (_17390, 8), (_17389, 8), (_17388, 8), (_17387, 8), (_17386, 8), (_17385, 8), (_17384, 8), (_17383, 8), (_17382, 8), (_17381, 8), (_17380, 8), (_17379, 8), (_17378, 8), (_17377, 8), (_17376, 8), (_17730, 8), (_17729, 8), (_17728, 8), (_17727, 8), (_17726, 8), (_17725, 8), (_17724, 8), (_17723, 8), (_17722, 8), (_17721, 8), (_17720, 8), (_17719, 8), (_17718, 8), (_17717, 8), (_17716, 8), (_17715, 8), (_17714, 8), (_17713, 8), (_17712, 8), (_17711, 8), (_17710, 8), (_17709, 8), (_17708, 8), (_17707, 8), (_17706, 8), (_17705, 8), (_17704, 8), (_17703, 8), (_17702, 8), (_17701, 8), (_17700, 8), (_17699, 8), (_18053, 8), (_18052, 8), (_18051, 8), (_18050, 8), (_18049, 8), (_18048, 8), (_18047, 8), (_18046, 8), (_18045, 8), (_18044, 8), (_18043, 8), (_18042, 8), (_18041, 8), (_18040, 8), (_18039, 8), (_18038, 8), (_18037, 8), (_18036, 8), (_18035, 8), (_18034, 8), (_18033, 8), (_18032, 8), (_18031, 8), (_18030, 8), (_18029, 8), (_18028, 8), (_18027, 8), (_18026, 8), (_18025, 8), (_18024, 8), (_18023, 8), (_18022, 8), (_18376, 8), (_18375, 8), (_18374, 8), (_18373, 8), (_18372, 8), (_18371, 8), (_18370, 8), (_18369, 8), (_18368, 8), (_18367, 8), (_18366, 8), (_18365, 8), (_18364, 8), (_18363, 8), (_18362, 8), (_18361, 8), (_18360, 8), (_18359, 8), (_18358, 8), (_18357, 8), (_18356, 8), (_18355, 8), (_18354, 8), (_18353, 8), (_18352, 8), (_18351, 8), (_18350, 8), (_18349, 8), (_18348, 8), (_18347, 8), (_18346, 8), (_18345, 8), (_18699, 8), (_18698, 8), (_18697, 8), (_18696, 8), (_18695, 8), (_18694, 8), (_18693, 8), (_18692, 8), (_18691, 8), (_18690, 8), (_18689, 8), (_18688, 8), (_18687, 8), (_18686, 8), (_18685, 8), (_18684, 8), (_18683, 8), (_18682, 8), (_18681, 8), (_18680, 8), (_18679, 8), (_18678, 8), (_18677, 8), (_18676, 8), (_18675, 8), (_18674, 8), (_18673, 8), (_18672, 8), (_18671, 8), (_18670, 8), (_18669, 8), (_18668, 8), (_19022, 8), (_19021, 8), (_19020, 8), (_19019, 8), (_19018, 8), (_19017, 8), (_19016, 8), (_19015, 8), (_19014, 8), (_19013, 8), (_19012, 8), (_19011, 8), (_19010, 8), (_19009, 8), (_19008, 8), (_19007, 8), (_19006, 8), (_19005, 8), (_19004, 8), (_19003, 8), (_19002, 8), (_19001, 8), (_19000, 8), (_18999, 8), (_18998, 8), (_18997, 8), (_18996, 8), (_18995, 8), (_18994, 8), (_18993, 8), (_18992, 8), (_18991, 8), (_19345, 8), (_19344, 8), (_19343, 8), (_19342, 8), (_19341, 8), (_19340, 8), (_19339, 8), (_19338, 8), (_19337, 8), (_19336, 8), (_19335, 8), (_19334, 8), (_19333, 8), (_19332, 8), (_19331, 8), (_19330, 8), (_19329, 8), (_19328, 8), (_19327, 8), (_19326, 8), (_19325, 8), (_19324, 8), (_19323, 8), (_19322, 8), (_19321, 8), (_19320, 8), (_19319, 8), (_19318, 8), (_19317, 8), (_19316, 8), (_19315, 8), (_19314, 8), (_19668, 8), (_19667, 8), (_19666, 8), (_19665, 8), (_19664, 8), (_19663, 8), (_19662, 8), (_19661, 8), (_19660, 8), (_19659, 8), (_19658, 8), (_19657, 8), (_19656, 8), (_19655, 8), (_19654, 8), (_19653, 8), (_19652, 8), (_19651, 8), (_19650, 8), (_19649, 8), (_19648, 8), (_19647, 8), (_19646, 8), (_19645, 8), (_19644, 8), (_19643, 8), (_19642, 8), (_19641, 8), (_19640, 8), (_19639, 8), (_19638, 8), (_19637, 8), (_19991, 8), (_19990, 8), (_19989, 8), (_19988, 8), (_19987, 8), (_19986, 8), (_19985, 8), (_19984, 8), (_19983, 8), (_19982, 8), (_19981, 8), (_19980, 8), (_19979, 8), (_19978, 8), (_19977, 8), (_19976, 8), (_19975, 8), (_19974, 8), (_19973, 8), (_19972, 8), (_19971, 8), (_19970, 8), (_19969, 8), (_19968, 8), (_19967, 8), (_19966, 8), (_19965, 8), (_19964, 8), (_19963, 8), (_19962, 8), (_19961, 8), (_19960, 8), (_20314, 8), (_20313, 8), (_20312, 8), (_20311, 8), (_20310, 8), (_20309, 8), (_20308, 8), (_20307, 8), (_20306, 8), (_20305, 8), (_20304, 8), (_20303, 8), (_20302, 8), (_20301, 8), (_20300, 8), (_20299, 8), (_20298, 8), (_20297, 8), (_20296, 8), (_20295, 8), (_20294, 8), (_20293, 8), (_20292, 8), (_20291, 8), (_20290, 8), (_20289, 8), (_20288, 8), (_20287, 8), (_20286, 8), (_20285, 8), (_20284, 8), (_20283, 8), (_20637, 8), (_20636, 8), (_20635, 8), (_20634, 8), (_20633, 8), (_20632, 8), (_20631, 8), (_20630, 8), (_20629, 8), (_20628, 8), (_20627, 8), (_20626, 8), (_20625, 8), (_20624, 8), (_20623, 8), (_20622, 8), (_20621, 8), (_20620, 8), (_20619, 8), (_20618, 8), (_20617, 8), (_20616, 8), (_20615, 8), (_20614, 8), (_20613, 8), (_20612, 8), (_20611, 8), (_20610, 8), (_20609, 8), (_20608, 8), (_20607, 8), (_20606, 8), (_20960, 8), (_20959, 8), (_20958, 8), (_20957, 8), (_20956, 8), (_20955, 8), (_20954, 8), (_20953, 8), (_20952, 8), (_20951, 8), (_20950, 8), (_20949, 8), (_20948, 8), (_20947, 8), (_20946, 8), (_20945, 8), (_20944, 8), (_20943, 8), (_20942, 8), (_20941, 8), (_20940, 8), (_20939, 8), (_20938, 8), (_20937, 8), (_20936, 8), (_20935, 8), (_20934, 8), (_20933, 8), (_20932, 8), (_20931, 8), (_20930, 8), (_20929, 8), (_21283, 8), (_21282, 8), (_21281, 8), (_21280, 8), (_21279, 8), (_21278, 8), (_21277, 8), (_21276, 8), (_21275, 8), (_21274, 8), (_21273, 8), (_21272, 8), (_21271, 8), (_21270, 8), (_21269, 8), (_21268, 8), (_21267, 8), (_21266, 8), (_21265, 8), (_21264, 8), (_21263, 8), (_21262, 8), (_21261, 8), (_21260, 8), (_21259, 8), (_21258, 8), (_21257, 8), (_21256, 8), (_21255, 8), (_21254, 8), (_21253, 8), (_21252, 8), (_21606, 8), (_21605, 8), (_21604, 8), (_21603, 8), (_21602, 8), (_21601, 8), (_21600, 8), (_21599, 8), (_21598, 8), (_21597, 8), (_21596, 8), (_21595, 8), (_21594, 8), (_21593, 8), (_21592, 8), (_21591, 8), (_21590, 8), (_21589, 8), (_21588, 8), (_21587, 8), (_21586, 8), (_21585, 8), (_21584, 8), (_21583, 8), (_21582, 8), (_21581, 8), (_21580, 8), (_21579, 8), (_21578, 8), (_21577, 8), (_21576, 8), (_21575, 8), (_21929, 8), (_21928, 8), (_21927, 8), (_21926, 8), (_21925, 8), (_21924, 8), (_21923, 8), (_21922, 8), (_21921, 8), (_21920, 8), (_21919, 8), (_21918, 8), (_21917, 8), (_21916, 8), (_21915, 8), (_21914, 8), (_21913, 8), (_21912, 8), (_21911, 8), (_21910, 8), (_21909, 8), (_21908, 8), (_21907, 8), (_21906, 8), (_21905, 8), (_21904, 8), (_21903, 8), (_21902, 8), (_21901, 8), (_21900, 8), (_21899, 8), (_21898, 8), (_22252, 8), (_22251, 8), (_22250, 8), (_22249, 8), (_22248, 8), (_22247, 8), (_22246, 8), (_22245, 8), (_22244, 8), (_22243, 8), (_22242, 8), (_22241, 8), (_22240, 8), (_22239, 8), (_22238, 8), (_22237, 8), (_22236, 8), (_22235, 8), (_22234, 8), (_22233, 8), (_22232, 8), (_22231, 8), (_22230, 8), (_22229, 8), (_22228, 8), (_22227, 8), (_22226, 8), (_22225, 8), (_22224, 8), (_22223, 8), (_22222, 8), (_22221, 8), (_22575, 8), (_22574, 8), (_22573, 8), (_22572, 8), (_22571, 8), (_22570, 8), (_22569, 8), (_22568, 8), (_22567, 8), (_22566, 8), (_22565, 8), (_22564, 8), (_22563, 8), (_22562, 8), (_22561, 8), (_22560, 8), (_22559, 8), (_22558, 8), (_22557, 8), (_22556, 8), (_22555, 8), (_22554, 8), (_22553, 8), (_22552, 8), (_22551, 8), (_22550, 8), (_22549, 8), (_22548, 8), (_22547, 8), (_22546, 8), (_22545, 8), (_22544, 8), (_22898, 8), (_22897, 8), (_22896, 8), (_22895, 8), (_22894, 8), (_22893, 8), (_22892, 8), (_22891, 8), (_22890, 8), (_22889, 8), (_22888, 8), (_22887, 8), (_22886, 8), (_22885, 8), (_22884, 8), (_22883, 8), (_22882, 8), (_22881, 8), (_22880, 8), (_22879, 8), (_22878, 8), (_22877, 8), (_22876, 8), (_22875, 8), (_22874, 8), (_22873, 8), (_22872, 8), (_22871, 8), (_22870, 8), (_22869, 8), (_22868, 8), (_22867, 8), (_23221, 8), (_23220, 8), (_23219, 8), (_23218, 8), (_23217, 8), (_23216, 8), (_23215, 8), (_23214, 8), (_23213, 8), (_23212, 8), (_23211, 8), (_23210, 8), (_23209, 8), (_23208, 8), (_23207, 8), (_23206, 8), (_23205, 8), (_23204, 8), (_23203, 8), (_23202, 8), (_23201, 8), (_23200, 8), (_23199, 8), (_23198, 8), (_23197, 8), (_23196, 8), (_23195, 8), (_23194, 8), (_23193, 8), (_23192, 8), (_23191, 8), (_23190, 8), (_23544, 8), (_23543, 8), (_23542, 8), (_23541, 8), (_23540, 8), (_23539, 8), (_23538, 8), (_23537, 8), (_23536, 8), (_23535, 8), (_23534, 8), (_23533, 8), (_23532, 8), (_23531, 8), (_23530, 8), (_23529, 8), (_23528, 8), (_23527, 8), (_23526, 8), (_23525, 8), (_23524, 8), (_23523, 8), (_23522, 8), (_23521, 8), (_23520, 8), (_23519, 8), (_23518, 8), (_23517, 8), (_23516, 8), (_23515, 8), (_23514, 8), (_23513, 8), (_23867, 8), (_23866, 8), (_23865, 8), (_23864, 8), (_23863, 8), (_23862, 8), (_23861, 8), (_23860, 8), (_23859, 8), (_23858, 8), (_23857, 8), (_23856, 8), (_23855, 8), (_23854, 8), (_23853, 8), (_23852, 8), (_23851, 8), (_23850, 8), (_23849, 8), (_23848, 8), (_23847, 8), (_23846, 8), (_23845, 8), (_23844, 8), (_23843, 8), (_23842, 8), (_23841, 8), (_23840, 8), (_23839, 8), (_23838, 8), (_23837, 8), (_23836, 8), (_24190, 8), (_24189, 8), (_24188, 8), (_24187, 8), (_24186, 8), (_24185, 8), (_24184, 8), (_24183, 8), (_24182, 8), (_24181, 8), (_24180, 8), (_24179, 8), (_24178, 8), (_24177, 8), (_24176, 8), (_24175, 8), (_24174, 8), (_24173, 8), (_24172, 8), (_24171, 8), (_24170, 8), (_24169, 8), (_24168, 8), (_24167, 8), (_24166, 8), (_24165, 8), (_24164, 8), (_24163, 8), (_24162, 8), (_24161, 8), (_24160, 8), (_24159, 8), (_24513, 8), (_24512, 8), (_24511, 8), (_24510, 8), (_24509, 8), (_24508, 8), (_24507, 8), (_24506, 8), (_24505, 8), (_24504, 8), (_24503, 8), (_24502, 8), (_24501, 8), (_24500, 8), (_24499, 8), (_24498, 8), (_24497, 8), (_24496, 8), (_24495, 8), (_24494, 8), (_24493, 8), (_24492, 8), (_24491, 8), (_24490, 8), (_24489, 8), (_24488, 8), (_24487, 8), (_24486, 8), (_24485, 8), (_24484, 8), (_24483, 8), (_24482, 8), (_24836, 8), (_24835, 8), (_24834, 8), (_24833, 8), (_24832, 8), (_24831, 8), (_24830, 8), (_24829, 8), (_24828, 8), (_24827, 8), (_24826, 8), (_24825, 8), (_24824, 8), (_24823, 8), (_24822, 8), (_24821, 8), (_24820, 8), (_24819, 8), (_24818, 8), (_24817, 8), (_24816, 8), (_24815, 8), (_24814, 8), (_24813, 8), (_24812, 8), (_24811, 8), (_24810, 8), (_24809, 8), (_24808, 8), (_24807, 8), (_24806, 8), (_24805, 8), (_25159, 8), (_25158, 8), (_25157, 8), (_25156, 8), (_25155, 8), (_25154, 8), (_25153, 8), (_25152, 8), (_25151, 8), (_25150, 8), (_25149, 8), (_25148, 8), (_25147, 8), (_25146, 8), (_25145, 8), (_25144, 8), (_25143, 8), (_25142, 8), (_25141, 8), (_25140, 8), (_25139, 8), (_25138, 8), (_25137, 8), (_25136, 8), (_25135, 8), (_25134, 8), (_25133, 8), (_25132, 8), (_25131, 8), (_25130, 8), (_25129, 8), (_25128, 8), (_25482, 8), (_25481, 8), (_25480, 8), (_25479, 8), (_25478, 8), (_25477, 8), (_25476, 8), (_25475, 8), (_25474, 8), (_25473, 8), (_25472, 8), (_25471, 8), (_25470, 8), (_25469, 8), (_25468, 8), (_25467, 8), (_25466, 8), (_25465, 8), (_25464, 8), (_25463, 8), (_25462, 8), (_25461, 8), (_25460, 8), (_25459, 8), (_25458, 8), (_25457, 8), (_25456, 8), (_25455, 8), (_25454, 8), (_25453, 8), (_25452, 8), (_25451, 8), (_25805, 8), (_25804, 8), (_25803, 8), (_25802, 8), (_25801, 8), (_25800, 8), (_25799, 8), (_25798, 8), (_25797, 8), (_25796, 8), (_25795, 8), (_25794, 8), (_25793, 8), (_25792, 8), (_25791, 8), (_25790, 8), (_25789, 8), (_25788, 8), (_25787, 8), (_25786, 8), (_25785, 8), (_25784, 8), (_25783, 8), (_25782, 8), (_25781, 8), (_25780, 8), (_25779, 8), (_25778, 8), (_25777, 8), (_25776, 8), (_25775, 8), (_25774, 8), (_26128, 8), (_26127, 8), (_26126, 8), (_26125, 8), (_26124, 8), (_26123, 8), (_26122, 8), (_26121, 8), (_26120, 8), (_26119, 8), (_26118, 8), (_26117, 8), (_26116, 8), (_26115, 8), (_26114, 8), (_26113, 8), (_26112, 8), (_26111, 8), (_26110, 8), (_26109, 8), (_26108, 8), (_26107, 8), (_26106, 8), (_26105, 8), (_26104, 8), (_26103, 8), (_26102, 8), (_26101, 8), (_26100, 8), (_26099, 8), (_26098, 8), (_26097, 8), (_26451, 8), (_26450, 8), (_26449, 8), (_26448, 8), (_26447, 8), (_26446, 8), (_26445, 8), (_26444, 8), (_26443, 8), (_26442, 8), (_26441, 8), (_26440, 8), (_26439, 8), (_26438, 8), (_26437, 8), (_26436, 8), (_26435, 8), (_26434, 8), (_26433, 8), (_26432, 8), (_26431, 8), (_26430, 8), (_26429, 8), (_26428, 8), (_26427, 8), (_26426, 8), (_26425, 8), (_26424, 8), (_26423, 8), (_26422, 8), (_26421, 8), (_26420, 8), (_26774, 8), (_26773, 8), (_26772, 8), (_26771, 8), (_26770, 8), (_26769, 8), (_26768, 8), (_26767, 8), (_26766, 8), (_26765, 8), (_26764, 8), (_26763, 8), (_26762, 8), (_26761, 8), (_26760, 8), (_26759, 8), (_26758, 8), (_26757, 8), (_26756, 8), (_26755, 8), (_26754, 8), (_26753, 8), (_26752, 8), (_26751, 8), (_26750, 8), (_26749, 8), (_26748, 8), (_26747, 8), (_26746, 8), (_26745, 8), (_26744, 8), (_26743, 8), (_27097, 8), (_27096, 8), (_27095, 8), (_27094, 8), (_27093, 8), (_27092, 8), (_27091, 8), (_27090, 8), (_27089, 8), (_27088, 8), (_27087, 8), (_27086, 8), (_27085, 8), (_27084, 8), (_27083, 8), (_27082, 8), (_27081, 8), (_27080, 8), (_27079, 8), (_27078, 8), (_27077, 8), (_27076, 8), (_27075, 8), (_27074, 8), (_27073, 8), (_27072, 8), (_27071, 8), (_27070, 8), (_27069, 8), (_27068, 8), (_27067, 8), (_27066, 8), (_27420, 8), (_27419, 8), (_27418, 8), (_27417, 8), (_27416, 8), (_27415, 8), (_27414, 8), (_27413, 8), (_27412, 8), (_27411, 8), (_27410, 8), (_27409, 8), (_27408, 8), (_27407, 8), (_27406, 8), (_27405, 8), (_27404, 8), (_27403, 8), (_27402, 8), (_27401, 8), (_27400, 8), (_27399, 8), (_27398, 8), (_27397, 8), (_27396, 8), (_27395, 8), (_27394, 8), (_27393, 8), (_27392, 8), (_27391, 8), (_27390, 8), (_27389, 8), (_27743, 8), (_27742, 8), (_27741, 8), (_27740, 8), (_27739, 8), (_27738, 8), (_27737, 8), (_27736, 8), (_27735, 8), (_27734, 8), (_27733, 8), (_27732, 8), (_27731, 8), (_27730, 8), (_27729, 8), (_27728, 8), (_27727, 8), (_27726, 8), (_27725, 8), (_27724, 8), (_27723, 8), (_27722, 8), (_27721, 8), (_27720, 8), (_27719, 8), (_27718, 8), (_27717, 8), (_27716, 8), (_27715, 8), (_27714, 8), (_27713, 8), (_27712, 8), (_28066, 8), (_28065, 8), (_28064, 8), (_28063, 8), (_28062, 8), (_28061, 8), (_28060, 8), (_28059, 8), (_28058, 8), (_28057, 8), (_28056, 8), (_28055, 8), (_28054, 8), (_28053, 8), (_28052, 8), (_28051, 8), (_28050, 8), (_28049, 8), (_28048, 8), (_28047, 8), (_28046, 8), (_28045, 8), (_28044, 8), (_28043, 8), (_28042, 8), (_28041, 8), (_28040, 8), (_28039, 8), (_28038, 8), (_28037, 8), (_28036, 8), (_28035, 8), (_28389, 8), (_28388, 8), (_28387, 8), (_28386, 8), (_28385, 8), (_28384, 8), (_28383, 8), (_28382, 8), (_28381, 8), (_28380, 8), (_28379, 8), (_28378, 8), (_28377, 8), (_28376, 8), (_28375, 8), (_28374, 8), (_28373, 8), (_28372, 8), (_28371, 8), (_28370, 8), (_28369, 8), (_28368, 8), (_28367, 8), (_28366, 8), (_28365, 8), (_28364, 8), (_28363, 8), (_28362, 8), (_28361, 8), (_28360, 8), (_28359, 8), (_28358, 8), (_28712, 8), (_28711, 8), (_28710, 8), (_28709, 8), (_28708, 8), (_28707, 8), (_28706, 8), (_28705, 8), (_28704, 8), (_28703, 8), (_28702, 8), (_28701, 8), (_28700, 8), (_28699, 8), (_28698, 8), (_28697, 8), (_28696, 8), (_28695, 8), (_28694, 8), (_28693, 8), (_28692, 8), (_28691, 8), (_28690, 8), (_28689, 8), (_28688, 8), (_28687, 8), (_28686, 8), (_28685, 8), (_28684, 8), (_28683, 8), (_28682, 8), (_28681, 8), (_29035, 8), (_29034, 8), (_29033, 8), (_29032, 8), (_29031, 8), (_29030, 8), (_29029, 8), (_29028, 8), (_29027, 8), (_29026, 8), (_29025, 8), (_29024, 8), (_29023, 8), (_29022, 8), (_29021, 8), (_29020, 8), (_29019, 8), (_29018, 8), (_29017, 8), (_29016, 8), (_29015, 8), (_29014, 8), (_29013, 8), (_29012, 8), (_29011, 8), (_29010, 8), (_29009, 8), (_29008, 8), (_29007, 8), (_29006, 8), (_29005, 8), (_29004, 8), (_29358, 8), (_29357, 8), (_29356, 8), (_29355, 8), (_29354, 8), (_29353, 8), (_29352, 8), (_29351, 8), (_29350, 8), (_29349, 8), (_29348, 8), (_29347, 8), (_29346, 8), (_29345, 8), (_29344, 8), (_29343, 8), (_29342, 8), (_29341, 8), (_29340, 8), (_29339, 8), (_29338, 8), (_29337, 8), (_29336, 8), (_29335, 8), (_29334, 8), (_29333, 8), (_29332, 8), (_29331, 8), (_29330, 8), (_29329, 8), (_29328, 8), (_29327, 8), (_29681, 8), (_29680, 8), (_29679, 8), (_29678, 8), (_29677, 8), (_29676, 8), (_29675, 8), (_29674, 8), (_29673, 8), (_29672, 8), (_29671, 8), (_29670, 8), (_29669, 8), (_29668, 8), (_29667, 8), (_29666, 8), (_29665, 8), (_29664, 8), (_29663, 8), (_29662, 8), (_29661, 8), (_29660, 8), (_29659, 8), (_29658, 8), (_29657, 8), (_29656, 8), (_29655, 8), (_29654, 8), (_29653, 8), (_29652, 8), (_29651, 8), (_29650, 8), (_30004, 8), (_30003, 8), (_30002, 8), (_30001, 8), (_30000, 8), (_29999, 8), (_29998, 8), (_29997, 8), (_29996, 8), (_29995, 8), (_29994, 8), (_29993, 8), (_29992, 8), (_29991, 8), (_29990, 8), (_29989, 8), (_29988, 8), (_29987, 8), (_29986, 8), (_29985, 8), (_29984, 8), (_29983, 8), (_29982, 8), (_29981, 8), (_29980, 8), (_29979, 8), (_29978, 8), (_29977, 8), (_29976, 8), (_29975, 8), (_29974, 8), (_29973, 8), (_30327, 8), (_30326, 8), (_30325, 8), (_30324, 8), (_30323, 8), (_30322, 8), (_30321, 8), (_30320, 8), (_30319, 8), (_30318, 8), (_30317, 8), (_30316, 8), (_30315, 8), (_30314, 8), (_30313, 8), (_30312, 8), (_30311, 8), (_30310, 8), (_30309, 8), (_30308, 8), (_30307, 8), (_30306, 8), (_30305, 8), (_30304, 8), (_30303, 8), (_30302, 8), (_30301, 8), (_30300, 8), (_30299, 8), (_30298, 8), (_30297, 8), (_30296, 8), (_30650, 8), (_30649, 8), (_30648, 8), (_30647, 8), (_30646, 8), (_30645, 8), (_30644, 8), (_30643, 8), (_30642, 8), (_30641, 8), (_30640, 8), (_30639, 8), (_30638, 8), (_30637, 8), (_30636, 8), (_30635, 8), (_30634, 8), (_30633, 8), (_30632, 8), (_30631, 8), (_30630, 8), (_30629, 8), (_30628, 8), (_30627, 8), (_30626, 8), (_30625, 8), (_30624, 8), (_30623, 8), (_30622, 8), (_30621, 8), (_30620, 8), (_30619, 8), (_30973, 8), (_30972, 8), (_30971, 8), (_30970, 8), (_30969, 8), (_30968, 8), (_30967, 8), (_30966, 8), (_30965, 8), (_30964, 8), (_30963, 8), (_30962, 8), (_30961, 8), (_30960, 8), (_30959, 8), (_30958, 8), (_30957, 8), (_30956, 8), (_30955, 8), (_30954, 8), (_30953, 8), (_30952, 8), (_30951, 8), (_30950, 8), (_30949, 8), (_30948, 8), (_30947, 8), (_30946, 8), (_30945, 8), (_30944, 8), (_30943, 8), (_30942, 8), (_31296, 8), (_31295, 8), (_31294, 8), (_31293, 8), (_31292, 8), (_31291, 8), (_31290, 8), (_31289, 8), (_31288, 8), (_31287, 8), (_31286, 8), (_31285, 8), (_31284, 8), (_31283, 8), (_31282, 8), (_31281, 8), (_31280, 8), (_31279, 8), (_31278, 8), (_31277, 8), (_31276, 8), (_31275, 8), (_31274, 8), (_31273, 8), (_31272, 8), (_31271, 8), (_31270, 8), (_31269, 8), (_31268, 8), (_31267, 8), (_31266, 8), (_31265, 8), (_31619, 8), (_31618, 8), (_31617, 8), (_31616, 8), (_31615, 8), (_31614, 8), (_31613, 8), (_31612, 8), (_31611, 8), (_31610, 8), (_31609, 8), (_31608, 8), (_31607, 8), (_31606, 8), (_31605, 8), (_31604, 8), (_31603, 8), (_31602, 8), (_31601, 8), (_31600, 8), (_31599, 8), (_31598, 8), (_31597, 8), (_31596, 8), (_31595, 8), (_31594, 8), (_31593, 8), (_31592, 8), (_31591, 8), (_31590, 8), (_31589, 8), (_31588, 8), (_31942, 8), (_31941, 8), (_31940, 8), (_31939, 8), (_31938, 8), (_31937, 8), (_31936, 8), (_31935, 8), (_31934, 8), (_31933, 8), (_31932, 8), (_31931, 8), (_31930, 8), (_31929, 8), (_31928, 8), (_31927, 8), (_31926, 8), (_31925, 8), (_31924, 8), (_31923, 8), (_31922, 8), (_31921, 8), (_31920, 8), (_31919, 8), (_31918, 8), (_31917, 8), (_31916, 8), (_31915, 8), (_31914, 8), (_31913, 8), (_31912, 8), (_31911, 8), (_32265, 8), (_32264, 8), (_32263, 8), (_32262, 8), (_32261, 8), (_32260, 8), (_32259, 8), (_32258, 8), (_32257, 8), (_32256, 8), (_32255, 8), (_32254, 8), (_32253, 8), (_32252, 8), (_32251, 8), (_32250, 8), (_32249, 8), (_32248, 8), (_32247, 8), (_32246, 8), (_32245, 8), (_32244, 8), (_32243, 8), (_32242, 8), (_32241, 8), (_32240, 8), (_32239, 8), (_32238, 8), (_32237, 8), (_32236, 8), (_32235, 8), (_32234, 8), (_32588, 8), (_32587, 8), (_32586, 8), (_32585, 8), (_32584, 8), (_32583, 8), (_32582, 8), (_32581, 8), (_32580, 8), (_32579, 8), (_32578, 8), (_32577, 8), (_32576, 8), (_32575, 8), (_32574, 8), (_32573, 8), (_32572, 8), (_32571, 8), (_32570, 8), (_32569, 8), (_32568, 8), (_32567, 8), (_32566, 8), (_32565, 8), (_32564, 8), (_32563, 8), (_32562, 8), (_32561, 8), (_32560, 8), (_32559, 8), (_32558, 8), (_32557, 8), (_32911, 8), (_32910, 8), (_32909, 8), (_32908, 8), (_32907, 8), (_32906, 8), (_32905, 8), (_32904, 8), (_32903, 8), (_32902, 8), (_32901, 8), (_32900, 8), (_32899, 8), (_32898, 8), (_32897, 8), (_32896, 8), (_32895, 8), (_32894, 8), (_32893, 8), (_32892, 8), (_32891, 8), (_32890, 8), (_32889, 8), (_32888, 8), (_32887, 8), (_32886, 8), (_32885, 8), (_32884, 8), (_32883, 8), (_32882, 8), (_32881, 8), (_32880, 8), (_33234, 8), (_33233, 8), (_33232, 8), (_33231, 8), (_33230, 8), (_33229, 8), (_33228, 8), (_33227, 8), (_33226, 8), (_33225, 8), (_33224, 8), (_33223, 8), (_33222, 8), (_33221, 8), (_33220, 8), (_33219, 8), (_33218, 8), (_33217, 8), (_33216, 8), (_33215, 8), (_33214, 8), (_33213, 8), (_33212, 8), (_33211, 8), (_33210, 8), (_33209, 8), (_33208, 8), (_33207, 8), (_33206, 8), (_33205, 8), (_33204, 8), (_33203, 8), (_33557, 8), (_33556, 8), (_33555, 8), (_33554, 8), (_33553, 8), (_33552, 8), (_33551, 8), (_33550, 8), (_33549, 8), (_33548, 8), (_33547, 8), (_33546, 8), (_33545, 8), (_33544, 8), (_33543, 8), (_33542, 8), (_33541, 8), (_33540, 8), (_33539, 8), (_33538, 8), (_33537, 8), (_33536, 8), (_33535, 8), (_33534, 8), (_33533, 8), (_33532, 8), (_33531, 8), (_33530, 8), (_33529, 8), (_33528, 8), (_33527, 8), (_33526, 8), (_33880, 8), (_33879, 8), (_33878, 8), (_33877, 8), (_33876, 8), (_33875, 8), (_33874, 8), (_33873, 8), (_33872, 8), (_33871, 8), (_33870, 8), (_33869, 8), (_33868, 8), (_33867, 8), (_33866, 8), (_33865, 8), (_33864, 8), (_33863, 8), (_33862, 8), (_33861, 8), (_33860, 8), (_33859, 8), (_33858, 8), (_33857, 8), (_33856, 8), (_33855, 8), (_33854, 8), (_33853, 8), (_33852, 8), (_33851, 8), (_33850, 8), (_33849, 8), (_34203, 8), (_34202, 8), (_34201, 8), (_34200, 8), (_34199, 8), (_34198, 8), (_34197, 8), (_34196, 8), (_34195, 8), (_34194, 8), (_34193, 8), (_34192, 8), (_34191, 8), (_34190, 8), (_34189, 8), (_34188, 8), (_34187, 8), (_34186, 8), (_34185, 8), (_34184, 8), (_34183, 8), (_34182, 8), (_34181, 8), (_34180, 8), (_34179, 8), (_34178, 8), (_34177, 8), (_34176, 8), (_34175, 8), (_34174, 8), (_34173, 8), (_34172, 8), (_34526, 8), (_34525, 8), (_34524, 8), (_34523, 8), (_34522, 8), (_34521, 8), (_34520, 8), (_34519, 8), (_34518, 8), (_34517, 8), (_34516, 8), (_34515, 8), (_34514, 8), (_34513, 8), (_34512, 8), (_34511, 8), (_34510, 8), (_34509, 8), (_34508, 8), (_34507, 8), (_34506, 8), (_34505, 8), (_34504, 8), (_34503, 8), (_34502, 8), (_34501, 8), (_34500, 8), (_34499, 8), (_34498, 8), (_34497, 8), (_34496, 8), (_34495, 8), (_34849, 8), (_34848, 8), (_34847, 8), (_34846, 8), (_34845, 8), (_34844, 8), (_34843, 8), (_34842, 8), (_34841, 8), (_34840, 8), (_34839, 8), (_34838, 8), (_34837, 8), (_34836, 8), (_34835, 8), (_34834, 8), (_34833, 8), (_34832, 8), (_34831, 8), (_34830, 8), (_34829, 8), (_34828, 8), (_34827, 8), (_34826, 8), (_34825, 8), (_34824, 8), (_34823, 8), (_34822, 8), (_34821, 8), (_34820, 8), (_34819, 8), (_34818, 8), (_35172, 8), (_35171, 8), (_35170, 8), (_35169, 8), (_35168, 8), (_35167, 8), (_35166, 8), (_35165, 8), (_35164, 8), (_35163, 8), (_35162, 8), (_35161, 8), (_35160, 8), (_35159, 8), (_35158, 8), (_35157, 8), (_35156, 8), (_35155, 8), (_35154, 8), (_35153, 8), (_35152, 8), (_35151, 8), (_35150, 8), (_35149, 8), (_35148, 8), (_35147, 8), (_35146, 8), (_35145, 8), (_35144, 8), (_35143, 8), (_35142, 8), (_35141, 8), (_35495, 8), (_35494, 8), (_35493, 8), (_35492, 8), (_35491, 8), (_35490, 8), (_35489, 8), (_35488, 8), (_35487, 8), (_35486, 8), (_35485, 8), (_35484, 8), (_35483, 8), (_35482, 8), (_35481, 8), (_35480, 8), (_35479, 8), (_35478, 8), (_35477, 8), (_35476, 8), (_35475, 8), (_35474, 8), (_35473, 8), (_35472, 8), (_35471, 8), (_35470, 8), (_35469, 8), (_35468, 8), (_35467, 8), (_35466, 8), (_35465, 8), (_35464, 8), (_35818, 8), (_35817, 8), (_35816, 8), (_35815, 8), (_35814, 8), (_35813, 8), (_35812, 8), (_35811, 8), (_35810, 8), (_35809, 8), (_35808, 8), (_35807, 8), (_35806, 8), (_35805, 8), (_35804, 8), (_35803, 8), (_35802, 8), (_35801, 8), (_35800, 8), (_35799, 8), (_35798, 8), (_35797, 8), (_35796, 8), (_35795, 8), (_35794, 8), (_35793, 8), (_35792, 8), (_35791, 8), (_35790, 8), (_35789, 8), (_35788, 8), (_35787, 8), (_36141, 8), (_36140, 8), (_36139, 8), (_36138, 8), (_36137, 8), (_36136, 8), (_36135, 8), (_36134, 8), (_36133, 8), (_36132, 8), (_36131, 8), (_36130, 8), (_36129, 8), (_36128, 8), (_36127, 8), (_36126, 8), (_36125, 8), (_36124, 8), (_36123, 8), (_36122, 8), (_36121, 8), (_36120, 8), (_36119, 8), (_36118, 8), (_36117, 8), (_36116, 8), (_36115, 8), (_36114, 8), (_36113, 8), (_36112, 8), (_36111, 8), (_36110, 8), (_36464, 8), (_36463, 8), (_36462, 8), (_36461, 8), (_36460, 8), (_36459, 8), (_36458, 8), (_36457, 8), (_36456, 8), (_36455, 8), (_36454, 8), (_36453, 8), (_36452, 8), (_36451, 8), (_36450, 8), (_36449, 8), (_36448, 8), (_36447, 8), (_36446, 8), (_36445, 8), (_36444, 8), (_36443, 8), (_36442, 8), (_36441, 8), (_36440, 8), (_36439, 8), (_36438, 8), (_36437, 8), (_36436, 8), (_36435, 8), (_36434, 8), (_36433, 8), (_36787, 8), (_36786, 8), (_36785, 8), (_36784, 8), (_36783, 8), (_36782, 8), (_36781, 8), (_36780, 8), (_36779, 8), (_36778, 8), (_36777, 8), (_36776, 8), (_36775, 8), (_36774, 8), (_36773, 8), (_36772, 8), (_36771, 8), (_36770, 8), (_36769, 8), (_36768, 8), (_36767, 8), (_36766, 8), (_36765, 8), (_36764, 8), (_36763, 8), (_36762, 8), (_36761, 8), (_36760, 8), (_36759, 8), (_36758, 8), (_36757, 8), (_36756, 8), (_37110, 8), (_37109, 8), (_37108, 8), (_37107, 8), (_37106, 8), (_37105, 8), (_37104, 8), (_37103, 8), (_37102, 8), (_37101, 8), (_37100, 8), (_37099, 8), (_37098, 8), (_37097, 8), (_37096, 8), (_37095, 8), (_37094, 8), (_37093, 8), (_37092, 8), (_37091, 8), (_37090, 8), (_37089, 8), (_37088, 8), (_37087, 8), (_37086, 8), (_37085, 8), (_37084, 8), (_37083, 8), (_37082, 8), (_37081, 8), (_37080, 8), (_37079, 8), (_37433, 8), (_37432, 8), (_37431, 8), (_37430, 8), (_37429, 8), (_37428, 8), (_37427, 8), (_37426, 8), (_37425, 8), (_37424, 8), (_37423, 8), (_37422, 8), (_37421, 8), (_37420, 8), (_37419, 8), (_37418, 8), (_37417, 8), (_37416, 8), (_37415, 8), (_37414, 8), (_37413, 8), (_37412, 8), (_37411, 8), (_37410, 8), (_37409, 8), (_37408, 8), (_37407, 8), (_37406, 8), (_37405, 8), (_37404, 8), (_37403, 8), (_37402, 8), (_37756, 8), (_37755, 8), (_37754, 8), (_37753, 8), (_37752, 8), (_37751, 8), (_37750, 8), (_37749, 8), (_37748, 8), (_37747, 8), (_37746, 8), (_37745, 8), (_37744, 8), (_37743, 8), (_37742, 8), (_37741, 8), (_37740, 8), (_37739, 8), (_37738, 8), (_37737, 8), (_37736, 8), (_37735, 8), (_37734, 8), (_37733, 8), (_37732, 8), (_37731, 8), (_37730, 8), (_37729, 8), (_37728, 8), (_37727, 8), (_37726, 8), (_37725, 8), (_38079, 8), (_38078, 8), (_38077, 8), (_38076, 8), (_38075, 8), (_38074, 8), (_38073, 8), (_38072, 8), (_38071, 8), (_38070, 8), (_38069, 8), (_38068, 8), (_38067, 8), (_38066, 8), (_38065, 8), (_38064, 8), (_38063, 8), (_38062, 8), (_38061, 8), (_38060, 8), (_38059, 8), (_38058, 8), (_38057, 8), (_38056, 8), (_38055, 8), (_38054, 8), (_38053, 8), (_38052, 8), (_38051, 8), (_38050, 8), (_38049, 8), (_38048, 8), (_38402, 8), (_38401, 8), (_38400, 8), (_38399, 8), (_38398, 8), (_38397, 8), (_38396, 8), (_38395, 8), (_38394, 8), (_38393, 8), (_38392, 8), (_38391, 8), (_38390, 8), (_38389, 8), (_38388, 8), (_38387, 8), (_38386, 8), (_38385, 8), (_38384, 8), (_38383, 8), (_38382, 8), (_38381, 8), (_38380, 8), (_38379, 8), (_38378, 8), (_38377, 8), (_38376, 8), (_38375, 8), (_38374, 8), (_38373, 8), (_38372, 8), (_38371, 8), (_38725, 8), (_38724, 8), (_38723, 8), (_38722, 8), (_38721, 8), (_38720, 8), (_38719, 8), (_38718, 8), (_38717, 8), (_38716, 8), (_38715, 8), (_38714, 8), (_38713, 8), (_38712, 8), (_38711, 8), (_38710, 8), (_38709, 8), (_38708, 8), (_38707, 8), (_38706, 8), (_38705, 8), (_38704, 8), (_38703, 8), (_38702, 8), (_38701, 8), (_38700, 8), (_38699, 8), (_38698, 8), (_38697, 8), (_38696, 8), (_38695, 8), (_38694, 8), (_39048, 8), (_39047, 8), (_39046, 8), (_39045, 8), (_39044, 8), (_39043, 8), (_39042, 8), (_39041, 8), (_39040, 8), (_39039, 8), (_39038, 8), (_39037, 8), (_39036, 8), (_39035, 8), (_39034, 8), (_39033, 8), (_39032, 8), (_39031, 8), (_39030, 8), (_39029, 8), (_39028, 8), (_39027, 8), (_39026, 8), (_39025, 8), (_39024, 8), (_39023, 8), (_39022, 8), (_39021, 8), (_39020, 8), (_39019, 8), (_39018, 8), (_39017, 8), (_39371, 8), (_39370, 8), (_39369, 8), (_39368, 8), (_39367, 8), (_39366, 8), (_39365, 8), (_39364, 8), (_39363, 8), (_39362, 8), (_39361, 8), (_39360, 8), (_39359, 8), (_39358, 8), (_39357, 8), (_39356, 8), (_39355, 8), (_39354, 8), (_39353, 8), (_39352, 8), (_39351, 8), (_39350, 8), (_39349, 8), (_39348, 8), (_39347, 8), (_39346, 8), (_39345, 8), (_39344, 8), (_39343, 8), (_39342, 8), (_39341, 8), (_39340, 8), (_39694, 8), (_39693, 8), (_39692, 8), (_39691, 8), (_39690, 8), (_39689, 8), (_39688, 8), (_39687, 8), (_39686, 8), (_39685, 8), (_39684, 8), (_39683, 8), (_39682, 8), (_39681, 8), (_39680, 8), (_39679, 8), (_39678, 8), (_39677, 8), (_39676, 8), (_39675, 8), (_39674, 8), (_39673, 8), (_39672, 8), (_39671, 8), (_39670, 8), (_39669, 8), (_39668, 8), (_39667, 8), (_39666, 8), (_39665, 8), (_39664, 8), (_39663, 8), (_40017, 8), (_40016, 8), (_40015, 8), (_40014, 8), (_40013, 8), (_40012, 8), (_40011, 8), (_40010, 8), (_40009, 8), (_40008, 8), (_40007, 8), (_40006, 8), (_40005, 8), (_40004, 8), (_40003, 8), (_40002, 8), (_40001, 8), (_40000, 8), (_39999, 8), (_39998, 8), (_39997, 8), (_39996, 8), (_39995, 8), (_39994, 8), (_39993, 8), (_39992, 8), (_39991, 8), (_39990, 8), (_39989, 8), (_39988, 8), (_39987, 8), (_39986, 8), (_40340, 8), (_40339, 8), (_40338, 8), (_40337, 8), (_40336, 8), (_40335, 8), (_40334, 8), (_40333, 8), (_40332, 8), (_40331, 8), (_40330, 8), (_40329, 8), (_40328, 8), (_40327, 8), (_40326, 8), (_40325, 8), (_40324, 8), (_40323, 8), (_40322, 8), (_40321, 8), (_40320, 8), (_40319, 8), (_40318, 8), (_40317, 8), (_40316, 8), (_40315, 8), (_40314, 8), (_40313, 8), (_40312, 8), (_40311, 8), (_40310, 8), (_40309, 8), (_40663, 8), (_40662, 8), (_40661, 8), (_40660, 8), (_40659, 8), (_40658, 8), (_40657, 8), (_40656, 8), (_40655, 8), (_40654, 8), (_40653, 8), (_40652, 8), (_40651, 8), (_40650, 8), (_40649, 8), (_40648, 8), (_40647, 8), (_40646, 8), (_40645, 8), (_40644, 8), (_40643, 8), (_40642, 8), (_40641, 8), (_40640, 8), (_40639, 8), (_40638, 8), (_40637, 8), (_40636, 8), (_40635, 8), (_40634, 8), (_40633, 8), (_40632, 8), (_40986, 8), (_40985, 8), (_40984, 8), (_40983, 8), (_40982, 8), (_40981, 8), (_40980, 8), (_40979, 8), (_40978, 8), (_40977, 8), (_40976, 8), (_40975, 8), (_40974, 8), (_40973, 8), (_40972, 8), (_40971, 8), (_40970, 8), (_40969, 8), (_40968, 8), (_40967, 8), (_40966, 8), (_40965, 8), (_40964, 8), (_40963, 8), (_40962, 8), (_40961, 8), (_40960, 8), (_40959, 8), (_40958, 8), (_40957, 8), (_40956, 8), (_40955, 8), (_41309, 8), (_41308, 8), (_41307, 8), (_41306, 8), (_41305, 8), (_41304, 8), (_41303, 8), (_41302, 8), (_41301, 8), (_41300, 8), (_41299, 8), (_41298, 8), (_41297, 8), (_41296, 8), (_41295, 8), (_41294, 8), (_41293, 8), (_41292, 8), (_41291, 8), (_41290, 8), (_41289, 8), (_41288, 8), (_41287, 8), (_41286, 8), (_41285, 8), (_41284, 8), (_41283, 8), (_41282, 8), (_41281, 8), (_41280, 8), (_41279, 8), (_41278, 8), (_41632, 8), (_41631, 8), (_41630, 8), (_41629, 8), (_41628, 8), (_41627, 8), (_41626, 8), (_41625, 8), (_41624, 8), (_41623, 8), (_41622, 8), (_41621, 8), (_41620, 8), (_41619, 8), (_41618, 8), (_41617, 8), (_41616, 8), (_41615, 8), (_41614, 8), (_41613, 8), (_41612, 8), (_41611, 8), (_41610, 8), (_41609, 8), (_41608, 8), (_41607, 8), (_41606, 8), (_41605, 8), (_41604, 8), (_41603, 8), (_41602, 8), (_41601, 8), (_41955, 8), (_41954, 8), (_41953, 8), (_41952, 8), (_41951, 8), (_41950, 8), (_41949, 8), (_41948, 8), (_41947, 8), (_41946, 8), (_41945, 8), (_41944, 8), (_41943, 8), (_41942, 8), (_41941, 8), (_41940, 8), (_41939, 8), (_41938, 8), (_41937, 8), (_41936, 8), (_41935, 8), (_41934, 8), (_41933, 8), (_41932, 8), (_41931, 8), (_41930, 8), (_41929, 8), (_41928, 8), (_41927, 8), (_41926, 8), (_41925, 8), (_41924, 8), (_42278, 8), (_42277, 8), (_42276, 8), (_42275, 8), (_42274, 8), (_42273, 8), (_42272, 8), (_42271, 8), (_42270, 8), (_42269, 8), (_42268, 8), (_42267, 8), (_42266, 8), (_42265, 8), (_42264, 8), (_42263, 8), (_42262, 8), (_42261, 8), (_42260, 8), (_42259, 8), (_42258, 8), (_42257, 8), (_42256, 8), (_42255, 8), (_42254, 8), (_42253, 8), (_42252, 8), (_42251, 8), (_42250, 8), (_42249, 8), (_42248, 8), (_42247, 8), (_42601, 8), (_42600, 8), (_42599, 8), (_42598, 8), (_42597, 8), (_42596, 8), (_42595, 8), (_42594, 8), (_42593, 8), (_42592, 8), (_42591, 8), (_42590, 8), (_42589, 8), (_42588, 8), (_42587, 8), (_42586, 8), (_42585, 8), (_42584, 8), (_42583, 8), (_42582, 8), (_42581, 8), (_42580, 8), (_42579, 8), (_42578, 8), (_42577, 8), (_42576, 8), (_42575, 8), (_42574, 8), (_42573, 8), (_42572, 8), (_42571, 8), (_42570, 8), (_42924, 8), (_42923, 8), (_42922, 8), (_42921, 8), (_42920, 8), (_42919, 8), (_42918, 8), (_42917, 8), (_42916, 8), (_42915, 8), (_42914, 8), (_42913, 8), (_42912, 8), (_42911, 8), (_42910, 8), (_42909, 8), (_42908, 8), (_42907, 8), (_42906, 8), (_42905, 8), (_42904, 8), (_42903, 8), (_42902, 8), (_42901, 8), (_42900, 8), (_42899, 8), (_42898, 8), (_42897, 8), (_42896, 8), (_42895, 8), (_42894, 8), (_42893, 8), (_43247, 8), (_43246, 8), (_43245, 8), (_43244, 8), (_43243, 8), (_43242, 8), (_43241, 8), (_43240, 8), (_43239, 8), (_43238, 8), (_43237, 8), (_43236, 8), (_43235, 8), (_43234, 8), (_43233, 8), (_43232, 8), (_43231, 8), (_43230, 8), (_43229, 8), (_43228, 8), (_43227, 8), (_43226, 8), (_43225, 8), (_43224, 8), (_43223, 8), (_43222, 8), (_43221, 8), (_43220, 8), (_43219, 8), (_43218, 8), (_43217, 8), (_43216, 8), (_43570, 8), (_43569, 8), (_43568, 8), (_43567, 8), (_43566, 8), (_43565, 8), (_43564, 8), (_43563, 8), (_43562, 8), (_43561, 8), (_43560, 8), (_43559, 8), (_43558, 8), (_43557, 8), (_43556, 8), (_43555, 8), (_43554, 8), (_43553, 8), (_43552, 8), (_43551, 8), (_43550, 8), (_43549, 8), (_43548, 8), (_43547, 8), (_43546, 8), (_43545, 8), (_43544, 8), (_43543, 8), (_43542, 8), (_43541, 8), (_43540, 8), (_43539, 8), (_43893, 8), (_43892, 8), (_43891, 8), (_43890, 8), (_43889, 8), (_43888, 8), (_43887, 8), (_43886, 8), (_43885, 8), (_43884, 8), (_43883, 8), (_43882, 8), (_43881, 8), (_43880, 8), (_43879, 8), (_43878, 8), (_43877, 8), (_43876, 8), (_43875, 8), (_43874, 8), (_43873, 8), (_43872, 8), (_43871, 8), (_43870, 8), (_43869, 8), (_43868, 8), (_43867, 8), (_43866, 8), (_43865, 8), (_43864, 8), (_43863, 8), (_43862, 8), (_44216, 8), (_44215, 8), (_44214, 8), (_44213, 8), (_44212, 8), (_44211, 8), (_44210, 8), (_44209, 8), (_44208, 8), (_44207, 8), (_44206, 8), (_44205, 8), (_44204, 8), (_44203, 8), (_44202, 8), (_44201, 8), (_44200, 8), (_44199, 8), (_44198, 8), (_44197, 8), (_44196, 8), (_44195, 8), (_44194, 8), (_44193, 8), (_44192, 8), (_44191, 8), (_44190, 8), (_44189, 8), (_44188, 8), (_44187, 8), (_44186, 8), (_44185, 8), (_44539, 8), (_44538, 8), (_44537, 8), (_44536, 8), (_44535, 8), (_44534, 8), (_44533, 8), (_44532, 8), (_44531, 8), (_44530, 8), (_44529, 8), (_44528, 8), (_44527, 8), (_44526, 8), (_44525, 8), (_44524, 8), (_44523, 8), (_44522, 8), (_44521, 8), (_44520, 8), (_44519, 8), (_44518, 8), (_44517, 8), (_44516, 8), (_44515, 8), (_44514, 8), (_44513, 8), (_44512, 8), (_44511, 8), (_44510, 8), (_44509, 8), (_44508, 8), (_44862, 8), (_44861, 8), (_44860, 8), (_44859, 8), (_44858, 8), (_44857, 8), (_44856, 8), (_44855, 8), (_44854, 8), (_44853, 8), (_44852, 8), (_44851, 8), (_44850, 8), (_44849, 8), (_44848, 8), (_44847, 8), (_44846, 8), (_44845, 8), (_44844, 8), (_44843, 8), (_44842, 8), (_44841, 8), (_44840, 8), (_44839, 8), (_44838, 8), (_44837, 8), (_44836, 8), (_44835, 8), (_44834, 8), (_44833, 8), (_44832, 8), (_44831, 8), (_45185, 8), (_45184, 8), (_45183, 8), (_45182, 8), (_45181, 8), (_45180, 8), (_45179, 8), (_45178, 8), (_45177, 8), (_45176, 8), (_45175, 8), (_45174, 8), (_45173, 8), (_45172, 8), (_45171, 8), (_45170, 8), (_45169, 8), (_45168, 8), (_45167, 8), (_45166, 8), (_45165, 8), (_45164, 8), (_45163, 8), (_45162, 8), (_45161, 8), (_45160, 8), (_45159, 8), (_45158, 8), (_45157, 8), (_45156, 8), (_45155, 8), (_45154, 8), (_45508, 8), (_45507, 8), (_45506, 8), (_45505, 8), (_45504, 8), (_45503, 8), (_45502, 8), (_45501, 8), (_45500, 8), (_45499, 8), (_45498, 8), (_45497, 8), (_45496, 8), (_45495, 8), (_45494, 8), (_45493, 8), (_45492, 8), (_45491, 8), (_45490, 8), (_45489, 8), (_45488, 8), (_45487, 8), (_45486, 8), (_45485, 8), (_45484, 8), (_45483, 8), (_45482, 8), (_45481, 8), (_45480, 8), (_45479, 8), (_45478, 8), (_45477, 8), (_45831, 8), (_45830, 8), (_45829, 8), (_45828, 8), (_45827, 8), (_45826, 8), (_45825, 8), (_45824, 8), (_45823, 8), (_45822, 8), (_45821, 8), (_45820, 8), (_45819, 8), (_45818, 8), (_45817, 8), (_45816, 8), (_45815, 8), (_45814, 8), (_45813, 8), (_45812, 8), (_45811, 8), (_45810, 8), (_45809, 8), (_45808, 8), (_45807, 8), (_45806, 8), (_45805, 8), (_45804, 8), (_45803, 8), (_45802, 8), (_45801, 8), (_45800, 8), (_46154, 8), (_46153, 8), (_46152, 8), (_46151, 8), (_46150, 8), (_46149, 8), (_46148, 8), (_46147, 8), (_46146, 8), (_46145, 8), (_46144, 8), (_46143, 8), (_46142, 8), (_46141, 8), (_46140, 8), (_46139, 8), (_46138, 8), (_46137, 8), (_46136, 8), (_46135, 8), (_46134, 8), (_46133, 8), (_46132, 8), (_46131, 8), (_46130, 8), (_46129, 8), (_46128, 8), (_46127, 8), (_46126, 8), (_46125, 8), (_46124, 8), (_46123, 8), (_46477, 8), (_46476, 8), (_46475, 8), (_46474, 8), (_46473, 8), (_46472, 8), (_46471, 8), (_46470, 8), (_46469, 8), (_46468, 8), (_46467, 8), (_46466, 8), (_46465, 8), (_46464, 8), (_46463, 8), (_46462, 8), (_46461, 8), (_46460, 8), (_46459, 8), (_46458, 8), (_46457, 8), (_46456, 8), (_46455, 8), (_46454, 8), (_46453, 8), (_46452, 8), (_46451, 8), (_46450, 8), (_46449, 8), (_46448, 8), (_46447, 8), (_46446, 8), (_46800, 8), (_46799, 8), (_46798, 8), (_46797, 8), (_46796, 8), (_46795, 8), (_46794, 8), (_46793, 8), (_46792, 8), (_46791, 8), (_46790, 8), (_46789, 8), (_46788, 8), (_46787, 8), (_46786, 8), (_46785, 8), (_46784, 8), (_46783, 8), (_46782, 8), (_46781, 8), (_46780, 8), (_46779, 8), (_46778, 8), (_46777, 8), (_46776, 8), (_46775, 8), (_46774, 8), (_46773, 8), (_46772, 8), (_46771, 8), (_46770, 8), (_46769, 8), (_47123, 8), (_47122, 8), (_47121, 8), (_47120, 8), (_47119, 8), (_47118, 8), (_47117, 8), (_47116, 8), (_47115, 8), (_47114, 8), (_47113, 8), (_47112, 8), (_47111, 8), (_47110, 8), (_47109, 8), (_47108, 8), (_47107, 8), (_47106, 8), (_47105, 8), (_47104, 8), (_47103, 8), (_47102, 8), (_47101, 8), (_47100, 8), (_47099, 8), (_47098, 8), (_47097, 8), (_47096, 8), (_47095, 8), (_47094, 8), (_47093, 8), (_47092, 8), (_47446, 8), (_47445, 8), (_47444, 8), (_47443, 8), (_47442, 8), (_47441, 8), (_47440, 8), (_47439, 8), (_47438, 8), (_47437, 8), (_47436, 8), (_47435, 8), (_47434, 8), (_47433, 8), (_47432, 8), (_47431, 8), (_47430, 8), (_47429, 8), (_47428, 8), (_47427, 8), (_47426, 8), (_47425, 8), (_47424, 8), (_47423, 8), (_47422, 8), (_47421, 8), (_47420, 8), (_47419, 8), (_47418, 8), (_47417, 8), (_47416, 8), (_47415, 8), (_47769, 8), (_47768, 8), (_47767, 8), (_47766, 8), (_47765, 8), (_47764, 8), (_47763, 8), (_47762, 8), (_47761, 8), (_47760, 8), (_47759, 8), (_47758, 8), (_47757, 8), (_47756, 8), (_47755, 8), (_47754, 8), (_47753, 8), (_47752, 8), (_47751, 8), (_47750, 8), (_47749, 8), (_47748, 8), (_47747, 8), (_47746, 8), (_47745, 8), (_47744, 8), (_47743, 8), (_47742, 8), (_47741, 8), (_47740, 8), (_47739, 8), (_47738, 8), (_48092, 8), (_48091, 8), (_48090, 8), (_48089, 8), (_48088, 8), (_48087, 8), (_48086, 8), (_48085, 8), (_48084, 8), (_48083, 8), (_48082, 8), (_48081, 8), (_48080, 8), (_48079, 8), (_48078, 8), (_48077, 8), (_48076, 8), (_48075, 8), (_48074, 8), (_48073, 8), (_48072, 8), (_48071, 8), (_48070, 8), (_48069, 8), (_48068, 8), (_48067, 8), (_48066, 8), (_48065, 8), (_48064, 8), (_48063, 8), (_48062, 8), (_48061, 8), (_48415, 8), (_48414, 8), (_48413, 8), (_48412, 8), (_48411, 8), (_48410, 8), (_48409, 8), (_48408, 8), (_48407, 8), (_48406, 8), (_48405, 8), (_48404, 8), (_48403, 8), (_48402, 8), (_48401, 8), (_48400, 8), (_48399, 8), (_48398, 8), (_48397, 8), (_48396, 8), (_48395, 8), (_48394, 8), (_48393, 8), (_48392, 8), (_48391, 8), (_48390, 8), (_48389, 8), (_48388, 8), (_48387, 8), (_48386, 8), (_48385, 8), (_48384, 8), (_48738, 8), (_48737, 8), (_48736, 8), (_48735, 8), (_48734, 8), (_48733, 8), (_48732, 8), (_48731, 8), (_48730, 8), (_48729, 8), (_48728, 8), (_48727, 8), (_48726, 8), (_48725, 8), (_48724, 8), (_48723, 8), (_48722, 8), (_48721, 8), (_48720, 8), (_48719, 8), (_48718, 8), (_48717, 8), (_48716, 8), (_48715, 8), (_48714, 8), (_48713, 8), (_48712, 8), (_48711, 8), (_48710, 8), (_48709, 8), (_48708, 8), (_48707, 8), (_49061, 8), (_49060, 8), (_49059, 8), (_49058, 8), (_49057, 8), (_49056, 8), (_49055, 8), (_49054, 8), (_49053, 8), (_49052, 8), (_49051, 8), (_49050, 8), (_49049, 8), (_49048, 8), (_49047, 8), (_49046, 8), (_49045, 8), (_49044, 8), (_49043, 8), (_49042, 8), (_49041, 8), (_49040, 8), (_49039, 8), (_49038, 8), (_49037, 8), (_49036, 8), (_49035, 8), (_49034, 8), (_49033, 8), (_49032, 8), (_49031, 8), (_49030, 8), (_49384, 8), (_49383, 8), (_49382, 8), (_49381, 8), (_49380, 8), (_49379, 8), (_49378, 8), (_49377, 8), (_49376, 8), (_49375, 8), (_49374, 8), (_49373, 8), (_49372, 8), (_49371, 8), (_49370, 8), (_49369, 8), (_49368, 8), (_49367, 8), (_49366, 8), (_49365, 8), (_49364, 8), (_49363, 8), (_49362, 8), (_49361, 8), (_49360, 8), (_49359, 8), (_49358, 8), (_49357, 8), (_49356, 8), (_49355, 8), (_49354, 8), (_49353, 8), (_49707, 8), (_49706, 8), (_49705, 8), (_49704, 8), (_49703, 8), (_49702, 8), (_49701, 8), (_49700, 8), (_49699, 8), (_49698, 8), (_49697, 8), (_49696, 8), (_49695, 8), (_49694, 8), (_49693, 8), (_49692, 8), (_49691, 8), (_49690, 8), (_49689, 8), (_49688, 8), (_49687, 8), (_49686, 8), (_49685, 8), (_49684, 8), (_49683, 8), (_49682, 8), (_49681, 8), (_49680, 8), (_49679, 8), (_49678, 8), (_49677, 8), (_49676, 8), (_50030, 8), (_50029, 8), (_50028, 8), (_50027, 8), (_50026, 8), (_50025, 8), (_50024, 8), (_50023, 8), (_50022, 8), (_50021, 8), (_50020, 8), (_50019, 8), (_50018, 8), (_50017, 8), (_50016, 8), (_50015, 8), (_50014, 8), (_50013, 8), (_50012, 8), (_50011, 8), (_50010, 8), (_50009, 8), (_50008, 8), (_50007, 8), (_50006, 8), (_50005, 8), (_50004, 8), (_50003, 8), (_50002, 8), (_50001, 8), (_50000, 8), (_49999, 8), (_50353, 8), (_50352, 8), (_50351, 8), (_50350, 8), (_50349, 8), (_50348, 8), (_50347, 8), (_50346, 8), (_50345, 8), (_50344, 8), (_50343, 8), (_50342, 8), (_50341, 8), (_50340, 8), (_50339, 8), (_50338, 8), (_50337, 8), (_50336, 8), (_50335, 8), (_50334, 8), (_50333, 8), (_50332, 8), (_50331, 8), (_50330, 8), (_50329, 8), (_50328, 8), (_50327, 8), (_50326, 8), (_50325, 8), (_50324, 8), (_50323, 8), (_50322, 8), (_50676, 8), (_50675, 8), (_50674, 8), (_50673, 8), (_50672, 8), (_50671, 8), (_50670, 8), (_50669, 8), (_50668, 8), (_50667, 8), (_50666, 8), (_50665, 8), (_50664, 8), (_50663, 8), (_50662, 8), (_50661, 8), (_50660, 8), (_50659, 8), (_50658, 8), (_50657, 8), (_50656, 8), (_50655, 8), (_50654, 8), (_50653, 8), (_50652, 8), (_50651, 8), (_50650, 8), (_50649, 8), (_50648, 8), (_50647, 8), (_50646, 8), (_50645, 8), (_50999, 8), (_50998, 8), (_50997, 8), (_50996, 8), (_50995, 8), (_50994, 8), (_50993, 8), (_50992, 8), (_50991, 8), (_50990, 8), (_50989, 8), (_50988, 8), (_50987, 8), (_50986, 8), (_50985, 8), (_50984, 8), (_50983, 8), (_50982, 8), (_50981, 8), (_50980, 8), (_50979, 8), (_50978, 8), (_50977, 8), (_50976, 8), (_50975, 8), (_50974, 8), (_50973, 8), (_50972, 8), (_50971, 8), (_50970, 8), (_50969, 8), (_50968, 8), (_51322, 8), (_51321, 8), (_51320, 8), (_51319, 8), (_51318, 8), (_51317, 8), (_51316, 8), (_51315, 8), (_51314, 8), (_51313, 8), (_51312, 8), (_51311, 8), (_51310, 8), (_51309, 8), (_51308, 8), (_51307, 8), (_51306, 8), (_51305, 8), (_51304, 8), (_51303, 8), (_51302, 8), (_51301, 8), (_51300, 8), (_51299, 8), (_51298, 8), (_51297, 8), (_51296, 8), (_51295, 8), (_51294, 8), (_51293, 8), (_51292, 8), (_51291, 8), (_51645, 8), (_51644, 8), (_51643, 8), (_51642, 8), (_51641, 8), (_51640, 8), (_51639, 8), (_51638, 8), (_51637, 8), (_51636, 8), (_51635, 8), (_51634, 8), (_51633, 8), (_51632, 8), (_51631, 8), (_51630, 8), (_51629, 8), (_51628, 8), (_51627, 8), (_51626, 8), (_51625, 8), (_51624, 8), (_51623, 8), (_51622, 8), (_51621, 8), (_51620, 8), (_51619, 8), (_51618, 8), (_51617, 8), (_51616, 8), (_51615, 8), (_51614, 8), (_51968, 8), (_51967, 8), (_51966, 8), (_51965, 8), (_51964, 8), (_51963, 8), (_51962, 8), (_51961, 8), (_51960, 8), (_51959, 8), (_51958, 8), (_51957, 8), (_51956, 8), (_51955, 8), (_51954, 8), (_51953, 8), (_51952, 8), (_51951, 8), (_51950, 8), (_51949, 8), (_51948, 8), (_51947, 8), (_51946, 8), (_51945, 8), (_51944, 8), (_51943, 8), (_51942, 8), (_51941, 8), (_51940, 8), (_51939, 8), (_51938, 8), (_51937, 8), (_52291, 8), (_52290, 8), (_52289, 8), (_52288, 8), (_52287, 8), (_52286, 8), (_52285, 8), (_52284, 8), (_52283, 8), (_52282, 8), (_52281, 8), (_52280, 8), (_52279, 8), (_52278, 8), (_52277, 8), (_52276, 8), (_52275, 8), (_52274, 8), (_52273, 8), (_52272, 8), (_52271, 8), (_52270, 8), (_52269, 8), (_52268, 8), (_52267, 8), (_52266, 8), (_52265, 8), (_52264, 8), (_52263, 8), (_52262, 8), (_52261, 8), (_52260, 8), (_52614, 8), (_52613, 8), (_52612, 8), (_52611, 8), (_52610, 8), (_52609, 8), (_52608, 8), (_52607, 8), (_52606, 8), (_52605, 8), (_52604, 8), (_52603, 8), (_52602, 8), (_52601, 8), (_52600, 8), (_52599, 8), (_52598, 8), (_52597, 8), (_52596, 8), (_52595, 8), (_52594, 8), (_52593, 8), (_52592, 8), (_52591, 8), (_52590, 8), (_52589, 8), (_52588, 8), (_52587, 8), (_52586, 8), (_52585, 8), (_52584, 8), (_52583, 8), (_52937, 8), (_52936, 8), (_52935, 8), (_52934, 8), (_52933, 8), (_52932, 8), (_52931, 8), (_52930, 8), (_52929, 8), (_52928, 8), (_52927, 8), (_52926, 8), (_52925, 8), (_52924, 8), (_52923, 8), (_52922, 8), (_52921, 8), (_52920, 8), (_52919, 8), (_52918, 8), (_52917, 8), (_52916, 8), (_52915, 8), (_52914, 8), (_52913, 8), (_52912, 8), (_52911, 8), (_52910, 8), (_52909, 8), (_52908, 8), (_52907, 8), (_52906, 8), (_53260, 8), (_53259, 8), (_53258, 8), (_53257, 8), (_53256, 8), (_53255, 8), (_53254, 8), (_53253, 8), (_53252, 8), (_53251, 8), (_53250, 8), (_53249, 8), (_53248, 8), (_53247, 8), (_53246, 8), (_53245, 8), (_53244, 8), (_53243, 8), (_53242, 8), (_53241, 8), (_53240, 8), (_53239, 8), (_53238, 8), (_53237, 8), (_53236, 8), (_53235, 8), (_53234, 8), (_53233, 8), (_53232, 8), (_53231, 8), (_53230, 8), (_53229, 8), (_53583, 8), (_53582, 8), (_53581, 8), (_53580, 8), (_53579, 8), (_53578, 8), (_53577, 8), (_53576, 8), (_53575, 8), (_53574, 8), (_53573, 8), (_53572, 8), (_53571, 8), (_53570, 8), (_53569, 8), (_53568, 8), (_53567, 8), (_53566, 8), (_53565, 8), (_53564, 8), (_53563, 8), (_53562, 8), (_53561, 8), (_53560, 8), (_53559, 8), (_53558, 8), (_53557, 8), (_53556, 8), (_53555, 8), (_53554, 8), (_53553, 8), (_53552, 8), (_53906, 8), (_53905, 8), (_53904, 8), (_53903, 8), (_53902, 8), (_53901, 8), (_53900, 8), (_53899, 8), (_53898, 8), (_53897, 8), (_53896, 8), (_53895, 8), (_53894, 8), (_53893, 8), (_53892, 8), (_53891, 8), (_53890, 8), (_53889, 8), (_53888, 8), (_53887, 8), (_53886, 8), (_53885, 8), (_53884, 8), (_53883, 8), (_53882, 8), (_53881, 8), (_53880, 8), (_53879, 8), (_53878, 8), (_53877, 8), (_53876, 8), (_53875, 8), (_54229, 8), (_54228, 8), (_54227, 8), (_54226, 8), (_54225, 8), (_54224, 8), (_54223, 8), (_54222, 8), (_54221, 8), (_54220, 8), (_54219, 8), (_54218, 8), (_54217, 8), (_54216, 8), (_54215, 8), (_54214, 8), (_54213, 8), (_54212, 8), (_54211, 8), (_54210, 8), (_54209, 8), (_54208, 8), (_54207, 8), (_54206, 8), (_54205, 8), (_54204, 8), (_54203, 8), (_54202, 8), (_54201, 8), (_54200, 8), (_54199, 8), (_54198, 8), (_54552, 8), (_54551, 8), (_54550, 8), (_54549, 8), (_54548, 8), (_54547, 8), (_54546, 8), (_54545, 8), (_54544, 8), (_54543, 8), (_54542, 8), (_54541, 8), (_54540, 8), (_54539, 8), (_54538, 8), (_54537, 8), (_54536, 8), (_54535, 8), (_54534, 8), (_54533, 8), (_54532, 8), (_54531, 8), (_54530, 8), (_54529, 8), (_54528, 8), (_54527, 8), (_54526, 8), (_54525, 8), (_54524, 8), (_54523, 8), (_54522, 8), (_54521, 8), (_54875, 8), (_54874, 8), (_54873, 8), (_54872, 8), (_54871, 8), (_54870, 8), (_54869, 8), (_54868, 8), (_54867, 8), (_54866, 8), (_54865, 8), (_54864, 8), (_54863, 8), (_54862, 8), (_54861, 8), (_54860, 8), (_54859, 8), (_54858, 8), (_54857, 8), (_54856, 8), (_54855, 8), (_54854, 8), (_54853, 8), (_54852, 8), (_54851, 8), (_54850, 8), (_54849, 8), (_54848, 8), (_54847, 8), (_54846, 8), (_54845, 8), (_54844, 8), (_55198, 8), (_55197, 8), (_55196, 8), (_55195, 8), (_55194, 8), (_55193, 8), (_55192, 8), (_55191, 8), (_55190, 8), (_55189, 8), (_55188, 8), (_55187, 8), (_55186, 8), (_55185, 8), (_55184, 8), (_55183, 8), (_55182, 8), (_55181, 8), (_55180, 8), (_55179, 8), (_55178, 8), (_55177, 8), (_55176, 8), (_55175, 8), (_55174, 8), (_55173, 8), (_55172, 8), (_55171, 8), (_55170, 8), (_55169, 8), (_55168, 8), (_55167, 8), (_55521, 8), (_55520, 8), (_55519, 8), (_55518, 8), (_55517, 8), (_55516, 8), (_55515, 8), (_55514, 8), (_55513, 8), (_55512, 8), (_55511, 8), (_55510, 8), (_55509, 8), (_55508, 8), (_55507, 8), (_55506, 8), (_55505, 8), (_55504, 8), (_55503, 8), (_55502, 8), (_55501, 8), (_55500, 8), (_55499, 8), (_55498, 8), (_55497, 8), (_55496, 8), (_55495, 8), (_55494, 8), (_55493, 8), (_55492, 8), (_55491, 8), (_55490, 8), (_55844, 8), (_55843, 8), (_55842, 8), (_55841, 8), (_55840, 8), (_55839, 8), (_55838, 8), (_55837, 8), (_55836, 8), (_55835, 8), (_55834, 8), (_55833, 8), (_55832, 8), (_55831, 8), (_55830, 8), (_55829, 8), (_55828, 8), (_55827, 8), (_55826, 8), (_55825, 8), (_55824, 8), (_55823, 8), (_55822, 8), (_55821, 8), (_55820, 8), (_55819, 8), (_55818, 8), (_55817, 8), (_55816, 8), (_55815, 8), (_55814, 8), (_55813, 8), (_56167, 8), (_56166, 8), (_56165, 8), (_56164, 8), (_56163, 8), (_56162, 8), (_56161, 8), (_56160, 8), (_56159, 8), (_56158, 8), (_56157, 8), (_56156, 8), (_56155, 8), (_56154, 8), (_56153, 8), (_56152, 8), (_56151, 8), (_56150, 8), (_56149, 8), (_56148, 8), (_56147, 8), (_56146, 8), (_56145, 8), (_56144, 8), (_56143, 8), (_56142, 8), (_56141, 8), (_56140, 8), (_56139, 8), (_56138, 8), (_56137, 8), (_56136, 8), (_56490, 8), (_56489, 8), (_56488, 8), (_56487, 8), (_56486, 8), (_56485, 8), (_56484, 8), (_56483, 8), (_56482, 8), (_56481, 8), (_56480, 8), (_56479, 8), (_56478, 8), (_56477, 8), (_56476, 8), (_56475, 8), (_56474, 8), (_56473, 8), (_56472, 8), (_56471, 8), (_56470, 8), (_56469, 8), (_56468, 8), (_56467, 8), (_56466, 8), (_56465, 8), (_56464, 8), (_56463, 8), (_56462, 8), (_56461, 8), (_56460, 8), (_56459, 8), (_56813, 8), (_56812, 8), (_56811, 8), (_56810, 8), (_56809, 8), (_56808, 8), (_56807, 8), (_56806, 8), (_56805, 8), (_56804, 8), (_56803, 8), (_56802, 8), (_56801, 8), (_56800, 8), (_56799, 8), (_56798, 8), (_56797, 8), (_56796, 8), (_56795, 8), (_56794, 8), (_56793, 8), (_56792, 8), (_56791, 8), (_56790, 8), (_56789, 8), (_56788, 8), (_56787, 8), (_56786, 8), (_56785, 8), (_56784, 8), (_56783, 8), (_56782, 8), (_57136, 8), (_57135, 8), (_57134, 8), (_57133, 8), (_57132, 8), (_57131, 8), (_57130, 8), (_57129, 8), (_57128, 8), (_57127, 8), (_57126, 8), (_57125, 8), (_57124, 8), (_57123, 8), (_57122, 8), (_57121, 8), (_57120, 8), (_57119, 8), (_57118, 8), (_57117, 8), (_57116, 8), (_57115, 8), (_57114, 8), (_57113, 8), (_57112, 8), (_57111, 8), (_57110, 8), (_57109, 8), (_57108, 8), (_57107, 8), (_57106, 8), (_57105, 8), (_57459, 8), (_57458, 8), (_57457, 8), (_57456, 8), (_57455, 8), (_57454, 8), (_57453, 8), (_57452, 8), (_57451, 8), (_57450, 8), (_57449, 8), (_57448, 8), (_57447, 8), (_57446, 8), (_57445, 8), (_57444, 8), (_57443, 8), (_57442, 8), (_57441, 8), (_57440, 8), (_57439, 8), (_57438, 8), (_57437, 8), (_57436, 8), (_57435, 8), (_57434, 8), (_57433, 8), (_57432, 8), (_57431, 8), (_57430, 8), (_57429, 8), (_57428, 8), (_57782, 8), (_57781, 8), (_57780, 8), (_57779, 8), (_57778, 8), (_57777, 8), (_57776, 8), (_57775, 8), (_57774, 8), (_57773, 8), (_57772, 8), (_57771, 8), (_57770, 8), (_57769, 8), (_57768, 8), (_57767, 8), (_57766, 8), (_57765, 8), (_57764, 8), (_57763, 8), (_57762, 8), (_57761, 8), (_57760, 8), (_57759, 8), (_57758, 8), (_57757, 8), (_57756, 8), (_57755, 8), (_57754, 8), (_57753, 8), (_57752, 8), (_57751, 8), (_58105, 8), (_58104, 8), (_58103, 8), (_58102, 8), (_58101, 8), (_58100, 8), (_58099, 8), (_58098, 8), (_58097, 8), (_58096, 8), (_58095, 8), (_58094, 8), (_58093, 8), (_58092, 8), (_58091, 8), (_58090, 8), (_58089, 8), (_58088, 8), (_58087, 8), (_58086, 8), (_58085, 8), (_58084, 8), (_58083, 8), (_58082, 8), (_58081, 8), (_58080, 8), (_58079, 8), (_58078, 8), (_58077, 8), (_58076, 8), (_58075, 8), (_58074, 8), (_58428, 8), (_58427, 8), (_58426, 8), (_58425, 8), (_58424, 8), (_58423, 8), (_58422, 8), (_58421, 8), (_58420, 8), (_58419, 8), (_58418, 8), (_58417, 8), (_58416, 8), (_58415, 8), (_58414, 8), (_58413, 8), (_58412, 8), (_58411, 8), (_58410, 8), (_58409, 8), (_58408, 8), (_58407, 8), (_58406, 8), (_58405, 8), (_58404, 8), (_58403, 8), (_58402, 8), (_58401, 8), (_58400, 8), (_58399, 8), (_58398, 8), (_58397, 8), (_58751, 8), (_58750, 8), (_58749, 8), (_58748, 8), (_58747, 8), (_58746, 8), (_58745, 8), (_58744, 8), (_58743, 8), (_58742, 8), (_58741, 8), (_58740, 8), (_58739, 8), (_58738, 8), (_58737, 8), (_58736, 8), (_58735, 8), (_58734, 8), (_58733, 8), (_58732, 8), (_58731, 8), (_58730, 8), (_58729, 8), (_58728, 8), (_58727, 8), (_58726, 8), (_58725, 8), (_58724, 8), (_58723, 8), (_58722, 8), (_58721, 8), (_58720, 8), (_59074, 8), (_59073, 8), (_59072, 8), (_59071, 8), (_59070, 8), (_59069, 8), (_59068, 8), (_59067, 8), (_59066, 8), (_59065, 8), (_59064, 8), (_59063, 8), (_59062, 8), (_59061, 8), (_59060, 8), (_59059, 8), (_59058, 8), (_59057, 8), (_59056, 8), (_59055, 8), (_59054, 8), (_59053, 8), (_59052, 8), (_59051, 8), (_59050, 8), (_59049, 8), (_59048, 8), (_59047, 8), (_59046, 8), (_59045, 8), (_59044, 8), (_59043, 8), (_59397, 8), (_59396, 8), (_59395, 8), (_59394, 8), (_59393, 8), (_59392, 8), (_59391, 8), (_59390, 8), (_59389, 8), (_59388, 8), (_59387, 8), (_59386, 8), (_59385, 8), (_59384, 8), (_59383, 8), (_59382, 8), (_59381, 8), (_59380, 8), (_59379, 8), (_59378, 8), (_59377, 8), (_59376, 8), (_59375, 8), (_59374, 8), (_59373, 8), (_59372, 8), (_59371, 8), (_59370, 8), (_59369, 8), (_59368, 8), (_59367, 8), (_59366, 8), (_59720, 8), (_59719, 8), (_59718, 8), (_59717, 8), (_59716, 8), (_59715, 8), (_59714, 8), (_59713, 8), (_59712, 8), (_59711, 8), (_59710, 8), (_59709, 8), (_59708, 8), (_59707, 8), (_59706, 8), (_59705, 8), (_59704, 8), (_59703, 8), (_59702, 8), (_59701, 8), (_59700, 8), (_59699, 8), (_59698, 8), (_59697, 8), (_59696, 8), (_59695, 8), (_59694, 8), (_59693, 8), (_59692, 8), (_59691, 8), (_59690, 8), (_59689, 8), (_60043, 8), (_60042, 8), (_60041, 8), (_60040, 8), (_60039, 8), (_60038, 8), (_60037, 8), (_60036, 8), (_60035, 8), (_60034, 8), (_60033, 8), (_60032, 8), (_60031, 8), (_60030, 8), (_60029, 8), (_60028, 8), (_60027, 8), (_60026, 8), (_60025, 8), (_60024, 8), (_60023, 8), (_60022, 8), (_60021, 8), (_60020, 8), (_60019, 8), (_60018, 8), (_60017, 8), (_60016, 8), (_60015, 8), (_60014, 8), (_60013, 8), (_60012, 8), (_60366, 8), (_60365, 8), (_60364, 8), (_60363, 8), (_60362, 8), (_60361, 8), (_60360, 8), (_60359, 8), (_60358, 8), (_60357, 8), (_60356, 8), (_60355, 8), (_60354, 8), (_60353, 8), (_60352, 8), (_60351, 8), (_60350, 8), (_60349, 8), (_60348, 8), (_60347, 8), (_60346, 8), (_60345, 8), (_60344, 8), (_60343, 8), (_60342, 8), (_60341, 8), (_60340, 8), (_60339, 8), (_60338, 8), (_60337, 8), (_60336, 8), (_60335, 8), (_60689, 8), (_60688, 8), (_60687, 8), (_60686, 8), (_60685, 8), (_60684, 8), (_60683, 8), (_60682, 8), (_60681, 8), (_60680, 8), (_60679, 8), (_60678, 8), (_60677, 8), (_60676, 8), (_60675, 8), (_60674, 8), (_60673, 8), (_60672, 8), (_60671, 8), (_60670, 8), (_60669, 8), (_60668, 8), (_60667, 8), (_60666, 8), (_60665, 8), (_60664, 8), (_60663, 8), (_60662, 8), (_60661, 8), (_60660, 8), (_60659, 8), (_60658, 8), (_61012, 8), (_61011, 8), (_61010, 8), (_61009, 8), (_61008, 8), (_61007, 8), (_61006, 8), (_61005, 8), (_61004, 8), (_61003, 8), (_61002, 8), (_61001, 8), (_61000, 8), (_60999, 8), (_60998, 8), (_60997, 8), (_60996, 8), (_60995, 8), (_60994, 8), (_60993, 8), (_60992, 8), (_60991, 8), (_60990, 8), (_60989, 8), (_60988, 8), (_60987, 8), (_60986, 8), (_60985, 8), (_60984, 8), (_60983, 8), (_60982, 8), (_60981, 8), (_61335, 8), (_61334, 8), (_61333, 8), (_61332, 8), (_61331, 8), (_61330, 8), (_61329, 8), (_61328, 8), (_61327, 8), (_61326, 8), (_61325, 8), (_61324, 8), (_61323, 8), (_61322, 8), (_61321, 8), (_61320, 8), (_61319, 8), (_61318, 8), (_61317, 8), (_61316, 8), (_61315, 8), (_61314, 8), (_61313, 8), (_61312, 8), (_61311, 8), (_61310, 8), (_61309, 8), (_61308, 8), (_61307, 8), (_61306, 8), (_61305, 8), (_61304, 8), (_61658, 8), (_61657, 8), (_61656, 8), (_61655, 8), (_61654, 8), (_61653, 8), (_61652, 8), (_61651, 8), (_61650, 8), (_61649, 8), (_61648, 8), (_61647, 8), (_61646, 8), (_61645, 8), (_61644, 8), (_61643, 8), (_61642, 8), (_61641, 8), (_61640, 8), (_61639, 8), (_61638, 8), (_61637, 8), (_61636, 8), (_61635, 8), (_61634, 8), (_61633, 8), (_61632, 8), (_61631, 8), (_61630, 8), (_61629, 8), (_61628, 8), (_61627, 8), (_61981, 8), (_61980, 8), (_61979, 8), (_61978, 8), (_61977, 8), (_61976, 8), (_61975, 8), (_61974, 8), (_61973, 8), (_61972, 8), (_61971, 8), (_61970, 8), (_61969, 8), (_61968, 8), (_61967, 8), (_61966, 8), (_61965, 8), (_61964, 8), (_61963, 8), (_61962, 8), (_61961, 8), (_61960, 8), (_61959, 8), (_61958, 8), (_61957, 8), (_61956, 8), (_61955, 8), (_61954, 8), (_61953, 8), (_61952, 8), (_61951, 8), (_61950, 8), (_62304, 8), (_62303, 8), (_62302, 8), (_62301, 8), (_62300, 8), (_62299, 8), (_62298, 8), (_62297, 8), (_62296, 8), (_62295, 8), (_62294, 8), (_62293, 8), (_62292, 8), (_62291, 8), (_62290, 8), (_62289, 8), (_62288, 8), (_62287, 8), (_62286, 8), (_62285, 8), (_62284, 8), (_62283, 8), (_62282, 8), (_62281, 8), (_62280, 8), (_62279, 8), (_62278, 8), (_62277, 8), (_62276, 8), (_62275, 8), (_62274, 8), (_62273, 8), (_62627, 8), (_62626, 8), (_62625, 8), (_62624, 8), (_62623, 8), (_62622, 8), (_62621, 8), (_62620, 8), (_62619, 8), (_62618, 8), (_62617, 8), (_62616, 8), (_62615, 8), (_62614, 8), (_62613, 8), (_62612, 8), (_62611, 8), (_62610, 8), (_62609, 8), (_62608, 8), (_62607, 8), (_62606, 8), (_62605, 8), (_62604, 8), (_62603, 8), (_62602, 8), (_62601, 8), (_62600, 8), (_62599, 8), (_62598, 8), (_62597, 8), (_62596, 8), (_62950, 8), (_62949, 8), (_62948, 8), (_62947, 8), (_62946, 8), (_62945, 8), (_62944, 8), (_62943, 8), (_62942, 8), (_62941, 8), (_62940, 8), (_62939, 8), (_62938, 8), (_62937, 8), (_62936, 8), (_62935, 8), (_62934, 8), (_62933, 8), (_62932, 8), (_62931, 8), (_62930, 8), (_62929, 8), (_62928, 8), (_62927, 8), (_62926, 8), (_62925, 8), (_62924, 8), (_62923, 8), (_62922, 8), (_62921, 8), (_62920, 8), (_62919, 8), (_63273, 8), (_63272, 8), (_63271, 8), (_63270, 8), (_63269, 8), (_63268, 8), (_63267, 8), (_63266, 8), (_63265, 8), (_63264, 8), (_63263, 8), (_63262, 8), (_63261, 8), (_63260, 8), (_63259, 8), (_63258, 8), (_63257, 8), (_63256, 8), (_63255, 8), (_63254, 8), (_63253, 8), (_63252, 8), (_63251, 8), (_63250, 8), (_63249, 8), (_63248, 8), (_63247, 8), (_63246, 8), (_63245, 8), (_63244, 8), (_63243, 8), (_63242, 8), (_63596, 8), (_63595, 8), (_63594, 8), (_63593, 8), (_63592, 8), (_63591, 8), (_63590, 8), (_63589, 8), (_63588, 8), (_63587, 8), (_63586, 8), (_63585, 8), (_63584, 8), (_63583, 8), (_63582, 8), (_63581, 8), (_63580, 8), (_63579, 8), (_63578, 8), (_63577, 8), (_63576, 8), (_63575, 8), (_63574, 8), (_63573, 8), (_63572, 8), (_63571, 8), (_63570, 8), (_63569, 8), (_63568, 8), (_63567, 8), (_63566, 8), (_63565, 8), (_63919, 8), (_63918, 8), (_63917, 8), (_63916, 8), (_63915, 8), (_63914, 8), (_63913, 8), (_63912, 8), (_63911, 8), (_63910, 8), (_63909, 8), (_63908, 8), (_63907, 8), (_63906, 8), (_63905, 8), (_63904, 8), (_63903, 8), (_63902, 8), (_63901, 8), (_63900, 8), (_63899, 8), (_63898, 8), (_63897, 8), (_63896, 8), (_63895, 8), (_63894, 8), (_63893, 8), (_63892, 8), (_63891, 8), (_63890, 8), (_63889, 8), (_63888, 8), (_64242, 8), (_64241, 8), (_64240, 8), (_64239, 8), (_64238, 8), (_64237, 8), (_64236, 8), (_64235, 8), (_64234, 8), (_64233, 8), (_64232, 8), (_64231, 8), (_64230, 8), (_64229, 8), (_64228, 8), (_64227, 8), (_64226, 8), (_64225, 8), (_64224, 8), (_64223, 8), (_64222, 8), (_64221, 8), (_64220, 8), (_64219, 8), (_64218, 8), (_64217, 8), (_64216, 8), (_64215, 8), (_64214, 8), (_64213, 8), (_64212, 8), (_64211, 8), (_64565, 8), (_64564, 8), (_64563, 8), (_64562, 8), (_64561, 8), (_64560, 8), (_64559, 8), (_64558, 8), (_64557, 8), (_64556, 8), (_64555, 8), (_64554, 8), (_64553, 8), (_64552, 8), (_64551, 8), (_64550, 8), (_64549, 8), (_64548, 8), (_64547, 8), (_64546, 8), (_64545, 8), (_64544, 8), (_64543, 8), (_64542, 8), (_64541, 8), (_64540, 8), (_64539, 8), (_64538, 8), (_64537, 8), (_64536, 8), (_64535, 8), (_64534, 8), (_64888, 8), (_64887, 8), (_64886, 8), (_64885, 8), (_64884, 8), (_64883, 8), (_64882, 8), (_64881, 8), (_64880, 8), (_64879, 8), (_64878, 8), (_64877, 8), (_64876, 8), (_64875, 8), (_64874, 8), (_64873, 8), (_64872, 8), (_64871, 8), (_64870, 8), (_64869, 8), (_64868, 8), (_64867, 8), (_64866, 8), (_64865, 8), (_64864, 8), (_64863, 8), (_64862, 8), (_64861, 8), (_64860, 8), (_64859, 8), (_64858, 8), (_64857, 8), (_65211, 8), (_65210, 8), (_65209, 8), (_65208, 8), (_65207, 8), (_65206, 8), (_65205, 8), (_65204, 8), (_65203, 8), (_65202, 8), (_65201, 8), (_65200, 8), (_65199, 8), (_65198, 8), (_65197, 8), (_65196, 8), (_65195, 8), (_65194, 8), (_65193, 8), (_65192, 8), (_65191, 8), (_65190, 8), (_65189, 8), (_65188, 8), (_65187, 8), (_65186, 8), (_65185, 8), (_65184, 8), (_65183, 8), (_65182, 8), (_65181, 8), (_65180, 8), (_65534, 8), (_65533, 8), (_65532, 8), (_65531, 8), (_65530, 8), (_65529, 8), (_65528, 8), (_65527, 8), (_65526, 8), (_65525, 8), (_65524, 8), (_65523, 8), (_65522, 8), (_65521, 8), (_65520, 8), (_65519, 8), (_65518, 8), (_65517, 8), (_65516, 8), (_65515, 8), (_65514, 8), (_65513, 8), (_65512, 8), (_65511, 8), (_65510, 8), (_65509, 8), (_65508, 8), (_65507, 8), (_65506, 8), (_65505, 8), (_65504, 8), (_65503, 8), (_65857, 8), (_65856, 8), (_65855, 8), (_65854, 8), (_65853, 8), (_65852, 8), (_65851, 8), (_65850, 8), (_65849, 8), (_65848, 8), (_65847, 8), (_65846, 8), (_65845, 8), (_65844, 8), (_65843, 8), (_65842, 8), (_65841, 8), (_65840, 8), (_65839, 8), (_65838, 8), (_65837, 8), (_65836, 8), (_65835, 8), (_65834, 8), (_65833, 8), (_65832, 8), (_65831, 8), (_65830, 8), (_65829, 8), (_65828, 8), (_65827, 8), (_65826, 8), (_66180, 8), (_66179, 8), (_66178, 8), (_66177, 8), (_66176, 8), (_66175, 8), (_66174, 8), (_66173, 8), (_66172, 8), (_66171, 8), (_66170, 8), (_66169, 8), (_66168, 8), (_66167, 8), (_66166, 8), (_66165, 8), (_66164, 8), (_66163, 8), (_66162, 8), (_66161, 8), (_66160, 8), (_66159, 8), (_66158, 8), (_66157, 8), (_66156, 8), (_66155, 8), (_66154, 8), (_66153, 8), (_66152, 8), (_66151, 8), (_66150, 8), (_66149, 8), (_66503, 8), (_66502, 8), (_66501, 8), (_66500, 8), (_66499, 8), (_66498, 8), (_66497, 8), (_66496, 8), (_66495, 8), (_66494, 8), (_66493, 8), (_66492, 8), (_66491, 8), (_66490, 8), (_66489, 8), (_66488, 8), (_66487, 8), (_66486, 8), (_66485, 8), (_66484, 8), (_66483, 8), (_66482, 8), (_66481, 8), (_66480, 8), (_66479, 8), (_66478, 8), (_66477, 8), (_66476, 8), (_66475, 8), (_66474, 8), (_66473, 8), (_66472, 8), (_66826, 8), (_66825, 8), (_66824, 8), (_66823, 8), (_66822, 8), (_66821, 8), (_66820, 8), (_66819, 8), (_66818, 8), (_66817, 8), (_66816, 8), (_66815, 8), (_66814, 8), (_66813, 8), (_66812, 8), (_66811, 8), (_66810, 8), (_66809, 8), (_66808, 8), (_66807, 8), (_66806, 8), (_66805, 8), (_66804, 8), (_66803, 8), (_66802, 8), (_66801, 8), (_66800, 8), (_66799, 8), (_66798, 8), (_66797, 8), (_66796, 8), (_66795, 8), (_67149, 8), (_67148, 8), (_67147, 8), (_67146, 8), (_67145, 8), (_67144, 8), (_67143, 8), (_67142, 8), (_67141, 8), (_67140, 8), (_67139, 8), (_67138, 8), (_67137, 8), (_67136, 8), (_67135, 8), (_67134, 8), (_67133, 8), (_67132, 8), (_67131, 8), (_67130, 8), (_67129, 8), (_67128, 8), (_67127, 8), (_67126, 8), (_67125, 8), (_67124, 8), (_67123, 8), (_67122, 8), (_67121, 8), (_67120, 8), (_67119, 8), (_67118, 8), (_67472, 8), (_67471, 8), (_67470, 8), (_67469, 8), (_67468, 8), (_67467, 8), (_67466, 8), (_67465, 8), (_67464, 8), (_67463, 8), (_67462, 8), (_67461, 8), (_67460, 8), (_67459, 8), (_67458, 8), (_67457, 8), (_67456, 8), (_67455, 8), (_67454, 8), (_67453, 8), (_67452, 8), (_67451, 8), (_67450, 8), (_67449, 8), (_67448, 8), (_67447, 8), (_67446, 8), (_67445, 8), (_67444, 8), (_67443, 8), (_67442, 8), (_67441, 8), (_67795, 8), (_67794, 8), (_67793, 8), (_67792, 8), (_67791, 8), (_67790, 8), (_67789, 8), (_67788, 8), (_67787, 8), (_67786, 8), (_67785, 8), (_67784, 8), (_67783, 8), (_67782, 8), (_67781, 8), (_67780, 8), (_67779, 8), (_67778, 8), (_67777, 8), (_67776, 8), (_67775, 8), (_67774, 8), (_67773, 8), (_67772, 8), (_67771, 8), (_67770, 8), (_67769, 8), (_67768, 8), (_67767, 8), (_67766, 8), (_67765, 8), (_67764, 8), (_68118, 8), (_68117, 8), (_68116, 8), (_68115, 8), (_68114, 8), (_68113, 8), (_68112, 8), (_68111, 8), (_68110, 8), (_68109, 8), (_68108, 8), (_68107, 8), (_68106, 8), (_68105, 8), (_68104, 8), (_68103, 8), (_68102, 8), (_68101, 8), (_68100, 8), (_68099, 8), (_68098, 8), (_68097, 8), (_68096, 8), (_68095, 8), (_68094, 8), (_68093, 8), (_68092, 8), (_68091, 8), (_68090, 8), (_68089, 8), (_68088, 8), (_68087, 8), (_68441, 8), (_68440, 8), (_68439, 8), (_68438, 8), (_68437, 8), (_68436, 8), (_68435, 8), (_68434, 8), (_68433, 8), (_68432, 8), (_68431, 8), (_68430, 8), (_68429, 8), (_68428, 8), (_68427, 8), (_68426, 8), (_68425, 8), (_68424, 8), (_68423, 8), (_68422, 8), (_68421, 8), (_68420, 8), (_68419, 8), (_68418, 8), (_68417, 8), (_68416, 8), (_68415, 8), (_68414, 8), (_68413, 8), (_68412, 8), (_68411, 8), (_68410, 8), (_68764, 8), (_68763, 8), (_68762, 8), (_68761, 8), (_68760, 8), (_68759, 8), (_68758, 8), (_68757, 8), (_68756, 8), (_68755, 8), (_68754, 8), (_68753, 8), (_68752, 8), (_68751, 8), (_68750, 8), (_68749, 8), (_68748, 8), (_68747, 8), (_68746, 8), (_68745, 8), (_68744, 8), (_68743, 8), (_68742, 8), (_68741, 8), (_68740, 8), (_68739, 8), (_68738, 8), (_68737, 8), (_68736, 8), (_68735, 8), (_68734, 8), (_68733, 8), (_69087, 8), (_69086, 8), (_69085, 8), (_69084, 8), (_69083, 8), (_69082, 8), (_69081, 8), (_69080, 8), (_69079, 8), (_69078, 8), (_69077, 8), (_69076, 8), (_69075, 8), (_69074, 8), (_69073, 8), (_69072, 8), (_69071, 8), (_69070, 8), (_69069, 8), (_69068, 8), (_69067, 8), (_69066, 8), (_69065, 8), (_69064, 8), (_69063, 8), (_69062, 8), (_69061, 8), (_69060, 8), (_69059, 8), (_69058, 8), (_69057, 8), (_69056, 8), (_69410, 8), (_69409, 8), (_69408, 8), (_69407, 8), (_69406, 8), (_69405, 8), (_69404, 8), (_69403, 8), (_69402, 8), (_69401, 8), (_69400, 8), (_69399, 8), (_69398, 8), (_69397, 8), (_69396, 8), (_69395, 8), (_69394, 8), (_69393, 8), (_69392, 8), (_69391, 8), (_69390, 8), (_69389, 8), (_69388, 8), (_69387, 8), (_69386, 8), (_69385, 8), (_69384, 8), (_69383, 8), (_69382, 8), (_69381, 8), (_69380, 8), (_69379, 8), (_69733, 8), (_69732, 8), (_69731, 8), (_69730, 8), (_69729, 8), (_69728, 8), (_69727, 8), (_69726, 8), (_69725, 8), (_69724, 8), (_69723, 8), (_69722, 8), (_69721, 8), (_69720, 8), (_69719, 8), (_69718, 8), (_69717, 8), (_69716, 8), (_69715, 8), (_69714, 8), (_69713, 8), (_69712, 8), (_69711, 8), (_69710, 8), (_69709, 8), (_69708, 8), (_69707, 8), (_69706, 8), (_69705, 8), (_69704, 8), (_69703, 8), (_69702, 8), (_70056, 8), (_70055, 8), (_70054, 8), (_70053, 8), (_70052, 8), (_70051, 8), (_70050, 8), (_70049, 8), (_70048, 8), (_70047, 8), (_70046, 8), (_70045, 8), (_70044, 8), (_70043, 8), (_70042, 8), (_70041, 8), (_70040, 8), (_70039, 8), (_70038, 8), (_70037, 8), (_70036, 8), (_70035, 8), (_70034, 8), (_70033, 8), (_70032, 8), (_70031, 8), (_70030, 8), (_70029, 8), (_70028, 8), (_70027, 8), (_70026, 8), (_70025, 8), (_70379, 8), (_70378, 8), (_70377, 8), (_70376, 8), (_70375, 8), (_70374, 8), (_70373, 8), (_70372, 8), (_70371, 8), (_70370, 8), (_70369, 8), (_70368, 8), (_70367, 8), (_70366, 8), (_70365, 8), (_70364, 8), (_70363, 8), (_70362, 8), (_70361, 8), (_70360, 8), (_70359, 8), (_70358, 8), (_70357, 8), (_70356, 8), (_70355, 8), (_70354, 8), (_70353, 8), (_70352, 8), (_70351, 8), (_70350, 8), (_70349, 8), (_70348, 8), (_70702, 8), (_70701, 8), (_70700, 8), (_70699, 8), (_70698, 8), (_70697, 8), (_70696, 8), (_70695, 8), (_70694, 8), (_70693, 8), (_70692, 8), (_70691, 8), (_70690, 8), (_70689, 8), (_70688, 8), (_70687, 8), (_70686, 8), (_70685, 8), (_70684, 8), (_70683, 8), (_70682, 8), (_70681, 8), (_70680, 8), (_70679, 8), (_70678, 8), (_70677, 8), (_70676, 8), (_70675, 8), (_70674, 8), (_70673, 8), (_70672, 8), (_70671, 8), (_71025, 8), (_71024, 8), (_71023, 8), (_71022, 8), (_71021, 8), (_71020, 8), (_71019, 8), (_71018, 8), (_71017, 8), (_71016, 8), (_71015, 8), (_71014, 8), (_71013, 8), (_71012, 8), (_71011, 8), (_71010, 8), (_71009, 8), (_71008, 8), (_71007, 8), (_71006, 8), (_71005, 8), (_71004, 8), (_71003, 8), (_71002, 8), (_71001, 8), (_71000, 8), (_70999, 8), (_70998, 8), (_70997, 8), (_70996, 8), (_70995, 8), (_70994, 8), (_71348, 8), (_71347, 8), (_71346, 8), (_71345, 8), (_71344, 8), (_71343, 8), (_71342, 8), (_71341, 8), (_71340, 8), (_71339, 8), (_71338, 8), (_71337, 8), (_71336, 8), (_71335, 8), (_71334, 8), (_71333, 8), (_71332, 8), (_71331, 8), (_71330, 8), (_71329, 8), (_71328, 8), (_71327, 8), (_71326, 8), (_71325, 8), (_71324, 8), (_71323, 8), (_71322, 8), (_71321, 8), (_71320, 8), (_71319, 8), (_71318, 8), (_71317, 8), (_71671, 8), (_71670, 8), (_71669, 8), (_71668, 8), (_71667, 8), (_71666, 8), (_71665, 8), (_71664, 8), (_71663, 8), (_71662, 8), (_71661, 8), (_71660, 8), (_71659, 8), (_71658, 8), (_71657, 8), (_71656, 8), (_71655, 8), (_71654, 8), (_71653, 8), (_71652, 8), (_71651, 8), (_71650, 8), (_71649, 8), (_71648, 8), (_71647, 8), (_71646, 8), (_71645, 8), (_71644, 8), (_71643, 8), (_71642, 8), (_71641, 8), (_71640, 8), (_71994, 8), (_71993, 8), (_71992, 8), (_71991, 8), (_71990, 8), (_71989, 8), (_71988, 8), (_71987, 8), (_71986, 8), (_71985, 8), (_71984, 8), (_71983, 8), (_71982, 8), (_71981, 8), (_71980, 8), (_71979, 8), (_71978, 8), (_71977, 8), (_71976, 8), (_71975, 8), (_71974, 8), (_71973, 8), (_71972, 8), (_71971, 8), (_71970, 8), (_71969, 8), (_71968, 8), (_71967, 8), (_71966, 8), (_71965, 8), (_71964, 8), (_71963, 8), (_72317, 8), (_72316, 8), (_72315, 8), (_72314, 8), (_72313, 8), (_72312, 8), (_72311, 8), (_72310, 8), (_72309, 8), (_72308, 8), (_72307, 8), (_72306, 8), (_72305, 8), (_72304, 8), (_72303, 8), (_72302, 8), (_72301, 8), (_72300, 8), (_72299, 8), (_72298, 8), (_72297, 8), (_72296, 8), (_72295, 8), (_72294, 8), (_72293, 8), (_72292, 8), (_72291, 8), (_72290, 8), (_72289, 8), (_72288, 8), (_72287, 8), (_72286, 8), (_72640, 8), (_72639, 8), (_72638, 8), (_72637, 8), (_72636, 8), (_72635, 8), (_72634, 8), (_72633, 8), (_72632, 8), (_72631, 8), (_72630, 8), (_72629, 8), (_72628, 8), (_72627, 8), (_72626, 8), (_72625, 8), (_72624, 8), (_72623, 8), (_72622, 8), (_72621, 8), (_72620, 8), (_72619, 8), (_72618, 8), (_72617, 8), (_72616, 8), (_72615, 8), (_72614, 8), (_72613, 8), (_72612, 8), (_72611, 8), (_72610, 8), (_72609, 8), (_72963, 8), (_72962, 8), (_72961, 8), (_72960, 8), (_72959, 8), (_72958, 8), (_72957, 8), (_72956, 8), (_72955, 8), (_72954, 8), (_72953, 8), (_72952, 8), (_72951, 8), (_72950, 8), (_72949, 8), (_72948, 8), (_72947, 8), (_72946, 8), (_72945, 8), (_72944, 8), (_72943, 8), (_72942, 8), (_72941, 8), (_72940, 8), (_72939, 8), (_72938, 8), (_72937, 8), (_72936, 8), (_72935, 8), (_72934, 8), (_72933, 8), (_72932, 8), (_73286, 8), (_73285, 8), (_73284, 8), (_73283, 8), (_73282, 8), (_73281, 8), (_73280, 8), (_73279, 8), (_73278, 8), (_73277, 8), (_73276, 8), (_73275, 8), (_73274, 8), (_73273, 8), (_73272, 8), (_73271, 8), (_73270, 8), (_73269, 8), (_73268, 8), (_73267, 8), (_73266, 8), (_73265, 8), (_73264, 8), (_73263, 8), (_73262, 8), (_73261, 8), (_73260, 8), (_73259, 8), (_73258, 8), (_73257, 8), (_73256, 8), (_73255, 8), (_73609, 8), (_73608, 8), (_73607, 8), (_73606, 8), (_73605, 8), (_73604, 8), (_73603, 8), (_73602, 8), (_73601, 8), (_73600, 8), (_73599, 8), (_73598, 8), (_73597, 8), (_73596, 8), (_73595, 8), (_73594, 8), (_73593, 8), (_73592, 8), (_73591, 8), (_73590, 8), (_73589, 8), (_73588, 8), (_73587, 8), (_73586, 8), (_73585, 8), (_73584, 8), (_73583, 8), (_73582, 8), (_73581, 8), (_73580, 8), (_73579, 8), (_73578, 8), (_73932, 8), (_73931, 8), (_73930, 8), (_73929, 8), (_73928, 8), (_73927, 8), (_73926, 8), (_73925, 8), (_73924, 8), (_73923, 8), (_73922, 8), (_73921, 8), (_73920, 8), (_73919, 8), (_73918, 8), (_73917, 8), (_73916, 8), (_73915, 8), (_73914, 8), (_73913, 8), (_73912, 8), (_73911, 8), (_73910, 8), (_73909, 8), (_73908, 8), (_73907, 8), (_73906, 8), (_73905, 8), (_73904, 8), (_73903, 8), (_73902, 8), (_73901, 8), (_74255, 8), (_74254, 8), (_74253, 8), (_74252, 8), (_74251, 8), (_74250, 8), (_74249, 8), (_74248, 8), (_74247, 8), (_74246, 8), (_74245, 8), (_74244, 8), (_74243, 8), (_74242, 8), (_74241, 8), (_74240, 8), (_74239, 8), (_74238, 8), (_74237, 8), (_74236, 8), (_74235, 8), (_74234, 8), (_74233, 8), (_74232, 8), (_74231, 8), (_74230, 8), (_74229, 8), (_74228, 8), (_74227, 8), (_74226, 8), (_74225, 8), (_74224, 8), (_74578, 8), (_74577, 8), (_74576, 8), (_74575, 8), (_74574, 8), (_74573, 8), (_74572, 8), (_74571, 8), (_74570, 8), (_74569, 8), (_74568, 8), (_74567, 8), (_74566, 8), (_74565, 8), (_74564, 8), (_74563, 8), (_74562, 8), (_74561, 8), (_74560, 8), (_74559, 8), (_74558, 8), (_74557, 8), (_74556, 8), (_74555, 8), (_74554, 8), (_74553, 8), (_74552, 8), (_74551, 8), (_74550, 8), (_74549, 8), (_74548, 8), (_74547, 8), (_74901, 8), (_74900, 8), (_74899, 8), (_74898, 8), (_74897, 8), (_74896, 8), (_74895, 8), (_74894, 8), (_74893, 8), (_74892, 8), (_74891, 8), (_74890, 8), (_74889, 8), (_74888, 8), (_74887, 8), (_74886, 8), (_74885, 8), (_74884, 8), (_74883, 8), (_74882, 8), (_74881, 8), (_74880, 8), (_74879, 8), (_74878, 8), (_74877, 8), (_74876, 8), (_74875, 8), (_74874, 8), (_74873, 8), (_74872, 8), (_74871, 8), (_74870, 8), (_75224, 8), (_75223, 8), (_75222, 8), (_75221, 8), (_75220, 8), (_75219, 8), (_75218, 8), (_75217, 8), (_75216, 8), (_75215, 8), (_75214, 8), (_75213, 8), (_75212, 8), (_75211, 8), (_75210, 8), (_75209, 8), (_75208, 8), (_75207, 8), (_75206, 8), (_75205, 8), (_75204, 8), (_75203, 8), (_75202, 8), (_75201, 8), (_75200, 8), (_75199, 8), (_75198, 8), (_75197, 8), (_75196, 8), (_75195, 8), (_75194, 8), (_75193, 8), (_75547, 8), (_75546, 8), (_75545, 8), (_75544, 8), (_75543, 8), (_75542, 8), (_75541, 8), (_75540, 8), (_75539, 8), (_75538, 8), (_75537, 8), (_75536, 8), (_75535, 8), (_75534, 8), (_75533, 8), (_75532, 8), (_75531, 8), (_75530, 8), (_75529, 8), (_75528, 8), (_75527, 8), (_75526, 8), (_75525, 8), (_75524, 8), (_75523, 8), (_75522, 8), (_75521, 8), (_75520, 8), (_75519, 8), (_75518, 8), (_75517, 8), (_75516, 8), (_75870, 8), (_75869, 8), (_75868, 8), (_75867, 8), (_75866, 8), (_75865, 8), (_75864, 8), (_75863, 8), (_75862, 8), (_75861, 8), (_75860, 8), (_75859, 8), (_75858, 8), (_75857, 8), (_75856, 8), (_75855, 8), (_75854, 8), (_75853, 8), (_75852, 8), (_75851, 8), (_75850, 8), (_75849, 8), (_75848, 8), (_75847, 8), (_75846, 8), (_75845, 8), (_75844, 8), (_75843, 8), (_75842, 8), (_75841, 8), (_75840, 8), (_75839, 8), (_76193, 8), (_76192, 8), (_76191, 8), (_76190, 8), (_76189, 8), (_76188, 8), (_76187, 8), (_76186, 8), (_76185, 8), (_76184, 8), (_76183, 8), (_76182, 8), (_76181, 8), (_76180, 8), (_76179, 8), (_76178, 8), (_76177, 8), (_76176, 8), (_76175, 8), (_76174, 8), (_76173, 8), (_76172, 8), (_76171, 8), (_76170, 8), (_76169, 8), (_76168, 8), (_76167, 8), (_76166, 8), (_76165, 8), (_76164, 8), (_76163, 8), (_76162, 8), (_76516, 8), (_76515, 8), (_76514, 8), (_76513, 8), (_76512, 8), (_76511, 8), (_76510, 8), (_76509, 8), (_76508, 8), (_76507, 8), (_76506, 8), (_76505, 8), (_76504, 8), (_76503, 8), (_76502, 8), (_76501, 8), (_76500, 8), (_76499, 8), (_76498, 8), (_76497, 8), (_76496, 8), (_76495, 8), (_76494, 8), (_76493, 8), (_76492, 8), (_76491, 8), (_76490, 8), (_76489, 8), (_76488, 8), (_76487, 8), (_76486, 8), (_76485, 8), (_76839, 8), (_76838, 8), (_76837, 8), (_76836, 8), (_76835, 8), (_76834, 8), (_76833, 8), (_76832, 8), (_76831, 8), (_76830, 8), (_76829, 8), (_76828, 8), (_76827, 8), (_76826, 8), (_76825, 8), (_76824, 8), (_76823, 8), (_76822, 8), (_76821, 8), (_76820, 8), (_76819, 8), (_76818, 8), (_76817, 8), (_76816, 8), (_76815, 8), (_76814, 8), (_76813, 8), (_76812, 8), (_76811, 8), (_76810, 8), (_76809, 8), (_76808, 8), (_77162, 8), (_77161, 8), (_77160, 8), (_77159, 8), (_77158, 8), (_77157, 8), (_77156, 8), (_77155, 8), (_77154, 8), (_77153, 8), (_77152, 8), (_77151, 8), (_77150, 8), (_77149, 8), (_77148, 8), (_77147, 8), (_77146, 8), (_77145, 8), (_77144, 8), (_77143, 8), (_77142, 8), (_77141, 8), (_77140, 8), (_77139, 8), (_77138, 8), (_77137, 8), (_77136, 8), (_77135, 8), (_77134, 8), (_77133, 8), (_77132, 8), (_77131, 8), (_77485, 8), (_77484, 8), (_77483, 8), (_77482, 8), (_77481, 8), (_77480, 8), (_77479, 8), (_77478, 8), (_77477, 8), (_77476, 8), (_77475, 8), (_77474, 8), (_77473, 8), (_77472, 8), (_77471, 8), (_77470, 8), (_77469, 8), (_77468, 8), (_77467, 8), (_77466, 8), (_77465, 8), (_77464, 8), (_77463, 8), (_77462, 8), (_77461, 8), (_77460, 8), (_77459, 8), (_77458, 8), (_77457, 8), (_77456, 8), (_77455, 8), (_77454, 8), (_77808, 8), (_77807, 8), (_77806, 8), (_77805, 8), (_77804, 8), (_77803, 8), (_77802, 8), (_77801, 8), (_77800, 8), (_77799, 8), (_77798, 8), (_77797, 8), (_77796, 8), (_77795, 8), (_77794, 8), (_77793, 8), (_77792, 8), (_77791, 8), (_77790, 8), (_77789, 8), (_77788, 8), (_77787, 8), (_77786, 8), (_77785, 8), (_77784, 8), (_77783, 8), (_77782, 8), (_77781, 8), (_77780, 8), (_77779, 8), (_77778, 8), (_77777, 8), (_78131, 8), (_78130, 8), (_78129, 8), (_78128, 8), (_78127, 8), (_78126, 8), (_78125, 8), (_78124, 8), (_78123, 8), (_78122, 8), (_78121, 8), (_78120, 8), (_78119, 8), (_78118, 8), (_78117, 8), (_78116, 8), (_78115, 8), (_78114, 8), (_78113, 8), (_78112, 8), (_78111, 8), (_78110, 8), (_78109, 8), (_78108, 8), (_78107, 8), (_78106, 8), (_78105, 8), (_78104, 8), (_78103, 8), (_78102, 8), (_78101, 8), (_78100, 8), (_78454, 8), (_78453, 8), (_78452, 8), (_78451, 8), (_78450, 8), (_78449, 8), (_78448, 8), (_78447, 8), (_78446, 8), (_78445, 8), (_78444, 8), (_78443, 8), (_78442, 8), (_78441, 8), (_78440, 8), (_78439, 8), (_78438, 8), (_78437, 8), (_78436, 8), (_78435, 8), (_78434, 8), (_78433, 8), (_78432, 8), (_78431, 8), (_78430, 8), (_78429, 8), (_78428, 8), (_78427, 8), (_78426, 8), (_78425, 8), (_78424, 8), (_78423, 8), (_78777, 8), (_78776, 8), (_78775, 8), (_78774, 8), (_78773, 8), (_78772, 8), (_78771, 8), (_78770, 8), (_78769, 8), (_78768, 8), (_78767, 8), (_78766, 8), (_78765, 8), (_78764, 8), (_78763, 8), (_78762, 8), (_78761, 8), (_78760, 8), (_78759, 8), (_78758, 8), (_78757, 8), (_78756, 8), (_78755, 8), (_78754, 8), (_78753, 8), (_78752, 8), (_78751, 8), (_78750, 8), (_78749, 8), (_78748, 8), (_78747, 8), (_78746, 8), (_79100, 8), (_79099, 8), (_79098, 8), (_79097, 8), (_79096, 8), (_79095, 8), (_79094, 8), (_79093, 8), (_79092, 8), (_79091, 8), (_79090, 8), (_79089, 8), (_79088, 8), (_79087, 8), (_79086, 8), (_79085, 8), (_79084, 8), (_79083, 8), (_79082, 8), (_79081, 8), (_79080, 8), (_79079, 8), (_79078, 8), (_79077, 8), (_79076, 8), (_79075, 8), (_79074, 8), (_79073, 8), (_79072, 8), (_79071, 8), (_79070, 8), (_79069, 8), (_79423, 8), (_79422, 8), (_79421, 8), (_79420, 8), (_79419, 8), (_79418, 8), (_79417, 8), (_79416, 8), (_79415, 8), (_79414, 8), (_79413, 8), (_79412, 8), (_79411, 8), (_79410, 8), (_79409, 8), (_79408, 8), (_79407, 8), (_79406, 8), (_79405, 8), (_79404, 8), (_79403, 8), (_79402, 8), (_79401, 8), (_79400, 8), (_79399, 8), (_79398, 8), (_79397, 8), (_79396, 8), (_79395, 8), (_79394, 8), (_79393, 8), (_79392, 8), (_79746, 8), (_79745, 8), (_79744, 8), (_79743, 8), (_79742, 8), (_79741, 8), (_79740, 8), (_79739, 8), (_79738, 8), (_79737, 8), (_79736, 8), (_79735, 8), (_79734, 8), (_79733, 8), (_79732, 8), (_79731, 8), (_79730, 8), (_79729, 8), (_79728, 8), (_79727, 8), (_79726, 8), (_79725, 8), (_79724, 8), (_79723, 8), (_79722, 8), (_79721, 8), (_79720, 8), (_79719, 8), (_79718, 8), (_79717, 8), (_79716, 8), (_79715, 8), (_80069, 8), (_80068, 8), (_80067, 8), (_80066, 8), (_80065, 8), (_80064, 8), (_80063, 8), (_80062, 8), (_80061, 8), (_80060, 8), (_80059, 8), (_80058, 8), (_80057, 8), (_80056, 8), (_80055, 8), (_80054, 8), (_80053, 8), (_80052, 8), (_80051, 8), (_80050, 8), (_80049, 8), (_80048, 8), (_80047, 8), (_80046, 8), (_80045, 8), (_80044, 8), (_80043, 8), (_80042, 8), (_80041, 8), (_80040, 8), (_80039, 8), (_80038, 8), (_80392, 8), (_80391, 8), (_80390, 8), (_80389, 8), (_80388, 8), (_80387, 8), (_80386, 8), (_80385, 8), (_80384, 8), (_80383, 8), (_80382, 8), (_80381, 8), (_80380, 8), (_80379, 8), (_80378, 8), (_80377, 8), (_80376, 8), (_80375, 8), (_80374, 8), (_80373, 8), (_80372, 8), (_80371, 8), (_80370, 8), (_80369, 8), (_80368, 8), (_80367, 8), (_80366, 8), (_80365, 8), (_80364, 8), (_80363, 8), (_80362, 8), (_80361, 8), (_80715, 8), (_80714, 8), (_80713, 8), (_80712, 8), (_80711, 8), (_80710, 8), (_80709, 8), (_80708, 8), (_80707, 8), (_80706, 8), (_80705, 8), (_80704, 8), (_80703, 8), (_80702, 8), (_80701, 8), (_80700, 8), (_80699, 8), (_80698, 8), (_80697, 8), (_80696, 8), (_80695, 8), (_80694, 8), (_80693, 8), (_80692, 8), (_80691, 8), (_80690, 8), (_80689, 8), (_80688, 8), (_80687, 8), (_80686, 8), (_80685, 8), (_80684, 8), (_81038, 8), (_81037, 8), (_81036, 8), (_81035, 8), (_81034, 8), (_81033, 8), (_81032, 8), (_81031, 8), (_81030, 8), (_81029, 8), (_81028, 8), (_81027, 8), (_81026, 8), (_81025, 8), (_81024, 8), (_81023, 8), (_81022, 8), (_81021, 8), (_81020, 8), (_81019, 8), (_81018, 8), (_81017, 8), (_81016, 8), (_81015, 8), (_81014, 8), (_81013, 8), (_81012, 8), (_81011, 8), (_81010, 8), (_81009, 8), (_81008, 8), (_81007, 8), (_81361, 8), (_81360, 8), (_81359, 8), (_81358, 8), (_81357, 8), (_81356, 8), (_81355, 8), (_81354, 8), (_81353, 8), (_81352, 8), (_81351, 8), (_81350, 8), (_81349, 8), (_81348, 8), (_81347, 8), (_81346, 8), (_81345, 8), (_81344, 8), (_81343, 8), (_81342, 8), (_81341, 8), (_81340, 8), (_81339, 8), (_81338, 8), (_81337, 8), (_81336, 8), (_81335, 8), (_81334, 8), (_81333, 8), (_81332, 8), (_81331, 8), (_81330, 8), (_81684, 8), (_81683, 8), (_81682, 8), (_81681, 8), (_81680, 8), (_81679, 8), (_81678, 8), (_81677, 8), (_81676, 8), (_81675, 8), (_81674, 8), (_81673, 8), (_81672, 8), (_81671, 8), (_81670, 8), (_81669, 8), (_81668, 8), (_81667, 8), (_81666, 8), (_81665, 8), (_81664, 8), (_81663, 8), (_81662, 8), (_81661, 8), (_81660, 8), (_81659, 8), (_81658, 8), (_81657, 8), (_81656, 8), (_81655, 8), (_81654, 8), (_81653, 8), (_82007, 8), (_82006, 8), (_82005, 8), (_82004, 8), (_82003, 8), (_82002, 8), (_82001, 8), (_82000, 8), (_81999, 8), (_81998, 8), (_81997, 8), (_81996, 8), (_81995, 8), (_81994, 8), (_81993, 8), (_81992, 8), (_81991, 8), (_81990, 8), (_81989, 8), (_81988, 8), (_81987, 8), (_81986, 8), (_81985, 8), (_81984, 8), (_81983, 8), (_81982, 8), (_81981, 8), (_81980, 8), (_81979, 8), (_81978, 8), (_81977, 8), (_81976, 8), (_82330, 8), (_82329, 8), (_82328, 8), (_82327, 8), (_82326, 8), (_82325, 8), (_82324, 8), (_82323, 8), (_82322, 8), (_82321, 8), (_82320, 8), (_82319, 8), (_82318, 8), (_82317, 8), (_82316, 8), (_82315, 8), (_82314, 8), (_82313, 8), (_82312, 8), (_82311, 8), (_82310, 8), (_82309, 8), (_82308, 8), (_82307, 8), (_82306, 8), (_82305, 8), (_82304, 8), (_82303, 8), (_82302, 8), (_82301, 8), (_82300, 8), (_82299, 8), (_82653, 8), (_82652, 8), (_82651, 8), (_82650, 8), (_82649, 8), (_82648, 8), (_82647, 8), (_82646, 8), (_82645, 8), (_82644, 8), (_82643, 8), (_82642, 8), (_82641, 8), (_82640, 8), (_82639, 8), (_82638, 8), (_82637, 8), (_82636, 8), (_82635, 8), (_82634, 8), (_82633, 8), (_82632, 8), (_82631, 8), (_82630, 8), (_82629, 8), (_82628, 8), (_82627, 8), (_82626, 8), (_82625, 8), (_82624, 8), (_82623, 8), (_82622, 8)] [_82945, _82946, _82947, _82948, _82949, _82950, _82951, _82952, _82953, _82954, _82955, _82956, _82957, _82958, _82959, _82960, _82961, _82962, _82963, _82964, _82965, _82966, _82967, _82968, _82969, _82970, _82971, _82972, _82973, _82974, _82975, _82976]", "EXPR [ (1, _256) (-1766847064778384329583297500742918515827483896875618958121606201292619776, _82945) (-6901746346790563787434755862277025452451108972170386555162524223799296, _82946) (-26959946667150639794667015087019630673637144422540572481103610249216, _82947) (-105312291668557186697918027683670432318895095400549111254310977536, _82948) (-411376139330301510538742295639337626245683966408394965837152256, _82949) (-1606938044258990275541962092341162602522202993782792835301376, _82950) (-6277101735386680763835789423207666416102355444464034512896, _82951) (-24519928653854221733733552434404946937899825954937634816, _82952) (-95780971304118053647396689196894323976171195136475136, _82953) (-374144419156711147060143317175368453031918731001856, _82954) (-1461501637330902918203684832716283019655932542976, _82955) (-5708990770823839524233143877797980545530986496, _82956) (-22300745198530623141535718272648361505980416, _82957) (-87112285931760246646623899502532662132736, _82958) (-340282366920938463463374607431768211456, _82959) (-1329227995784915872903807060280344576, _82960) (-5192296858534827628530496329220096, _82961) (-20282409603651670423947251286016, _82962) (-79228162514264337593543950336, _82963) (-309485009821345068724781056, _82964) (-1208925819614629174706176, _82965) (-4722366482869645213696, _82966) (-18446744073709551616, _82967) (-72057594037927936, _82968) (-281474976710656, _82969) (-1099511627776, _82970) (-4294967296, _82971) (-16777216, _82972) (-65536, _82973) (-256, _82974) (-1, _82975) 0 ]", "unconstrained func 0", "[Const { destination: Direct(5), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(6), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(7), bit_size: Integer(U32), value: 3 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(7), offset_address: Direct(5) }, Cast { destination: Direct(1), source: Direct(1), bit_size: Integer(U32) }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(7), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(3), op: IntegerDiv, lhs: Direct(0), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Mul, lhs: Direct(3), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Sub, lhs: Direct(0), rhs: Direct(4) }, Store { destination_pointer: Direct(9), source: Direct(4) }, BinaryIntOp { destination: Direct(9), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(6) }, Mov { destination: Direct(0), source: Direct(3) }, BinaryIntOp { destination: Direct(8), op: LessThan, bit_size: U32, lhs: Direct(9), rhs: Direct(7) }, JumpIf { condition: Direct(8), location: 7 }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, Stop { return_data: HeapVector { pointer: Direct(9), size: Direct(1) } }]", @@ -114730,14 +114730,14 @@ expression: artifact "unconstrained func 2", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "pL3NrvxNclZ7Lz32oDK+g1s5OkIGDLJkGWTMmSDu/bx7V6znhUEzaE+6EuyOrMr6P876Za694n/+5T/9w3/4H//l3//jP//n//rf//Lv/p//+Zf/8C//+E//9I//5d//03/9j3//r//4X//5j//f//m//u4v/D///b/+yz/8wx//X3/53/7nf/y3/tvf/8s//PO//uXf/fP/+Kd/+ru//H9//0//4/d/6b//t7//59/Xf/37f/njf/r5u7/8wz//pz9e/yj4n//xn/7hZ/S//u7P//bnr/9X33t5/+33IlQg/7YKWX+tgv31CmnDJ0jbPyu8+T8q+F+vUG12Fapj/lqF/9t7KGveQ3n+WyuE/00VelRh/6YK2UGF7L/pU8xHFebzV7+L/9u/B/sU/x4s7W/5F+XGe3he769VeO+vl2hnJbs/f1OBpcD4/NUC/5d/kvGhQNi/tYD331Ign/41uf8bC4T9bQWUiOi/bQ0oEH/bO4jP+7cVyPf5t32EXP4t1yf/jQVe/G0FXAX2byow/W8rUK7/6xyfv6mA1V8p8P/+8f/6+//4j//yf+yrf/n88X3/3V/e73/a73/673/G73/m73/W73/273/O73/u9791/+Xvf/t9/+vv+99/3wLvW+F9S7xvjfct8r5V7FvF7j18q9i3in2r2LeKfavYt4p9q9i3in+r+LeK30f5VvE/qvyxKp7fl/q+/FHljy/L5/uyvy/x+b6874v9/m+Gf1++VSK//7P6vnyrxLdKfKvkt0p+q+S3Sn6r5LdKft9Lft9Lfqvkt0p+q9S3Sn2rlH1f/PsS35fve6lvlervy3xf9velP9+Xb5X+Vulvlf5W6W+V/n6i/r6X/r6X/r6X+VaZ9335fqL5fqL5fqL5VplvlflWmW+V+VbZ7yfa73vZ73vZ73vZb5X9rst+P9F+P9F+P9F+q7zP517fvdq9+r3Gvea91r32vX7Lvc93hd773Ou7V7vXq/eu3rt67+q9q/fmXu/92b0/u/dnV8/8XuNe817rXq+eXT27en71/Or5fV6/9+f3/vze3/0Df973ep/X7/PGfd77V/7i6sXVi6t3/9Lf/VN/92/93T/2d//aX169vPW7f/Dv/sW/+yf/8url1bt/9e/+2b/7d//uH/67f/nv/um/+7f/6urVrd/983/37/9dAF5dvb56l4F3IXiXgncx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hxt+uOGHm2h75Tznhxt+uOGHG3644YcbfrjhhxvzUse81OGHG3644YebWHvlPOeHG3644Ycbfrjhhxt+uOGHG/NSx7zU4YcbfrjBww0ebvBwg4cbPNzg4QYPN3i44YcbfrgxL3XwcMMPN/xwww83qefmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3KSem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HCTem5e6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDTeo5P9zg4Sad5/xwk3puXuqYlzp4uMHDDR5u0j1ctveh56nn5qUOHm7S93nqeeq5ealjXurg4QYPN3i4SfdwOd6Hnqeem5c6eLhJ3+ep56nn5qWOeamDhxs83ODhppzn5TwvPS89Ny918HBTzvPS89Jz81LHvNTBww0ebvBwU+7hyn07P9zwww0/3ODhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDTem5eamDhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzel5+alDh5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/clJ6blzp4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cFN6XnqOhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzel56XneLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HDTet56jocbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83reet53i44Ycbfrjhhxt+uOGHGzzc4OEGDzf8cMMPN/xw03puXurg4YYfbvjhhh9u+OGGH27wcIOHGzzc8MMNP9zww03ruXmpg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83refmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3LSem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HDTem5e6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDzei5eamDhxs83ODhBg83/HCDh5txD8cPN3i4wcMNHm7wcPPHw+1/q++e4Y+H+7caq++eYT5OZubjZGY+Tmbm42RmPk5m5uNkZq6MK+PKuDKejCfjyXgynown48l4Mp6MJyNkhIyQETJCRsgIGSEj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D4eHO3i4g4c7eLiDhzt4uIOHO+U8L+d5Oc/LeV7O83IPV+7by317fX9XO+U8L7/by/d5+T4v93DlPC/neTnPy3lezvNyD1fu28t9e1175Twvv9vL93n5Pi/3cOU8L+d5Oc/LeV7O89Lzct+Ohzt4uIOHO3i4g4c7eLiDhzt4uFN6Xnpeeo6HO+Ue7vPD/a7slZ6XnuPhTvk+Lz0vPS89Lz3Hwx083MHDnXIP9/nh/r/S89Lz0nM83Cnf56Xnpeel56XneLiDhzt4uFPu4T4/3O/KXul56Tke7pTv89Lz0vPS89JzPNzBwx083CnneTnPS89Lz1vP8XCnneet563nreet53i4g4c7eLjT7uHafXvreet56zke7rTv89bz1vPW89ZzPNzBwx083Gn3cO2+vfW89bz1HA932vd563nreet56zke7uDhDh7utPO8neet563nred4uNPO89bz1vPW89ZzPNzBwx083Gn3cO2+vfW89bz1HA932vd563nreet56zke7uDhDh7utHu4dt/eet563nqOhzvt+7z1vPW89bz1HA938HAHD3faPVy7b289bz1vPcfDnfZ93nreet563nqOhzt4uIOHO+13e7tvbz1vPW89x8Od8bt99Hz0fPR89BwPd/BwBw93xj3cuG8fPR89Hz3Hw53xfT56Pno+ej56joc7eLiDhzvjHm7ct4+ej56PnuPhzvg+Hz0fPR89Hz3Hwx083MHDnXEPN+7bR89Hz0fP8XBn/G4fPR89Hz0fPcfDHTzcwcOdcQ837ttHz0fPR8/xcGd8n4+ej56Pno+e4+EOHu7g4c64hxv37aPno+ej53i4M77PR89Hz0fPR8/xcAcPd/BwZ9zDjfv20fPR89FzPNwZ3+ej56Pno+ej53i4g4c7eLgzvs/H9/no+ej56Dke7ox7uNHz1fPV89VzPNzBwx083Fn3cOu+ffV89Xz1HA931j3c6vnq+er56jke7uDhDh7urHu4dd++er56vnqOhzvrHm71fPV89Xz1HA938HAHD3fWPdy6b189Xz1fPcfDHTzcwcMdPNxZPcfDnXUPt77P8XAHD3fwcAcPd/54uP1v9d0z/PFw/1ZhlVZl1VZj9d1lLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5m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3s/nh/tdHatr9azCKq3Kqq2+jOs8v3p+9fzq+XWeX+f51fOr51fPr55fPb96fvX8Xhn3WYVVWpWVjCtDz6+eXz2/en71/Or51fP7ZLy2sld6fvX84+F+VzL0/Or51fOr51fPr55fPb/O8+s8v3p+9fzq+XWeX+f51fOr51fPr55fPb96fvX8lozyPvT86vnV84+H+/+qZej51fOr51fPr55fPb96/vnhflfeh55fPb96/vFwvysZen71/Or51fOr51fPr55/frjflfeh51fPr55/PNzvSoaePz1/ev70/On50/On58/v9s8P97saq2+vnp4/v9uf3+1Pz5+ePz1/ev70/On50/PPD/e7OlbX6lmFlYwrQ8+fnj89f3r+9Pzp+dPzzw/3u0ore6XnT88/Hu7/q5Ch50/Pn54/PX96/vT86fnnh/tdeR96/vT86fnzu/353f70/On50/On50/Pn54/Pf/8cL8r70PPn54/PX9+t39+uN+VDD1/ev70/On50/On558f7nflfej50/On58/v9s8P97uSoedPz5+ePz1/ev70/PPD/a68Dz1/ev70/Pnd/vnhflcy9Pzpeeh56Hnoeeh5+D4P3+eh56Hnoefhd/vnh/tdydDz0PPQ89Dz0PPQ888P97v63kfoeeh56Hn43f754X5XMvQ89Dz0PPQ89Dz0/PPD/a6elb3S89Dz8Lv988P9rmToeeh56Hnoeeh56Pnnh/tdeR96Hnoeeh5+t4eeh/M8nOeh5+F3e6QM3+eh56HnoefhPP/j4fa/1XfP8MfD/VuVVVuN1XfPEP1jdayu1bOS0TJaRstoGS1jZIyMkTEyRsbIGBkjY2SMjJWxMlbGylgZK2NlrAy/28P3efo+Tz1PPU89T+d5Os9Tz1PPU89Tzz8/3O9Khp6nnqeep55/frjflQw9Tz1PPU+/29P3eep56nnqeep56nnqeer554f7XR2ra/WswkqG7/PU89Tz1PPU89Tz1PPU888P97tKK3ul56nn6Xd7+j5PPf/8cL8rGc7z1PN0nqfzPPU83cOle7iPh/td2Su/29P3efo+T/dw6TxP53k6z9N5ns7zdA/3+eF+V/aq7ZXzPP1uT9/n6fs83cOl8zyd5+k8T+d5Os/TPdznh/td2auxV87z9Ls9fZ+n7/N0D5fO83Sep/M8nefpPC89L/ft5b794+F+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nes5Hu7g4Q4e7uDhTul56Tke7pSel56Xnpee4+EOHu7g4c7nh/tdydDz0vPSczzcKd/npeel56Xnped4uIOHO3i48/nhfldj9ay+fpSe4+FO+T4vPS89Lz0vPcfDHTzcwcOdzw/3uzpW9krPS8/xcKd8n5eef36435UM5zke7pTzvJzneLjz+eF+V/aq7ZXzHA938HAHD3fwcKec5+U8L+d5Oc/Lef754X5X3sfYq7FXzvPyu718n5fv888P97uS4Twv53k5z8t5/vnhflfex7NXz145z8vv9vJ9Xr7PPz/c70qG87yc5+U8L+d56fnnh/td2avv72oHD3fwcAcPd/BwBw938HCn9bz1vPUcD3faPdznh/tdhVValZUM3+et563nreet53i4g4c7eLjT7uE+P9zv6lqN1bOS4fu89bz1vPW89RwPd/BwBw932j3c54f7/0rPW89bz/Fwp32ft563nreet57j4Q4e7uDhTjvP23neet563nqOhzvtPG89bz1vPW89x8MdPNzBw512D9fX+9Dz1vPWczzcad/nreet563nred4uIOHO3i40+7h+nkfet563nqOhzvt+7z1vPW89bz1HA938HAHD3faed7O89bz1vPWczzcuc7zq+dXz6+eXz3Hwx083MHDnese7rpvv3p+9fzqOR7uXN/nV8+vnl89v3qOhzt4uIOHO9c93HXffvX86vnVczzcub7Pr55fPb96fvUcD3fwcAcPd657uOu+/er51fOr53i4c32fXz2/en71/Oo5Hu7g4Q4e7ly/26/79qvnV8+vnuPhzvW7/er51fOr51fP8XAHD3fwcOe6h7vu26+eXz2/eo6HO9f3+dXzq+dXz6+e4+EOHu7g4c51D3fdt189v3p+9RwPd67v86vnV8+vnl89x8MdPNzBw53rHu66b796fvX86jke7ly/26+ej56Pno+e4+EOHu7g4c64hxv37aPno+ej53i4M77PR89Hz0fPR8/xcAcPd/BwZ9zDjfv20fPR89FzPNwZ3+ej56Pno+ej53i4g4c7eLgz7uHGffvo+ej56Dke7ozv89Hz0fPR89FzPNzBwx083Bnf5+P7fPR89Hz0HA93xj3c6Pno+ej56Dke7uDhDh7ujHu4cd8+ej56PnqOhzvjHm70fPR89Hz0HA938HAHD3fGPdy4bx89Hz0fPcfDnXEP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0PPU89Tz9Lv988P9rmToeep56nnqeep56vnnh/tdjZV+6Hnqefrd/vnhflcy9Dz1PPU89Tz1PPX888P9ro5VWKVVWbV/e63G6lnJcJ6XnpfzvJznpeefH+53da3G6lnJ8H1evs8/Hu53JcN5Xs7zcp6X8/zzw/2uvvfx+eF+V/bKeV5+t5fv8/J9/vnhflcynOflPC/neTnPPz/c78r7KHtV9sp5Xn63l+/z8n3++eF+VzKc5+U8L+d5Oc9Lzz8/3O/KXrW9cp6Xnpfv8/J9/vFwvysZel56Xnpeev754X5X3oeel56Xnpff7eX7vPS89Lz0vPS89Lz0vPT888P9rrwPPS89Lz0vv9vL93npeel56Xnpeel56Xnp+eeH+11976P1vPW89bz9bm/f563nreet563nreet563n7Txv53nreet563k7z9t53nreet563nreet563nre7uE6xupZ2Ss9b7/b2/d563nreet563nreet563m7h+vyPvS89bz1vP1ub9/nreet563nreet563nreftPG/neet563nreTvP23neet563nreet563nreet7u4fp6H3reet563n63t+/z1vPW89bz1vPW89bz1vN2D/f54X5X9krPW8/b7/b2fd563nreet563nreet563u7hPj/c78pe6fnV8+t3+/V9fvX86vnV86vnV8+vnl89v363X/ftV8+vnl89v363X7/br55fPb96fvX86vnV86vn1z3cdd9+9fzq+dXz6/v8+j6/en71/Or51fOr51fPr55f93DXffvV86vnV8+v7/Pr+/zq+dXzq+dXz6+eXz2/en7dw1337VfPr55fPb9+t1+/26+eXz2/en71/Or51fOr59c93HXffvX86vnV8+t3+/V9fvX86vnV86vnV8+vnl89v+7hrvv2q+dXz6+eX7/br+/zq+dXz6+eXz2/en71/Or5dQ933bdfPb96fvX8+t0+vs9Hz0fPR89Hz0fPR89Hz8f3+fg+Hz0fPR89H7/bxz3c6Pno+ej56Pno+ej56Pm4hxv37aPno+ej5+N3+7iHGz0fPR89Hz0fPR89Hz0f93Djvn30fPR89Hz8bh/3cKPno+ej56Pno+ej56Pn4x5u3LePno+ej56P3+2j5+M8H+f56Pn43T7u4cb3+ej56Pno+TjP/3i4/W/13TP88XD/rebH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5X1e3uel56Xnpeel56Xnpeel56Xnpeel5+W8vZy3l56Xnpeel9/t5fu89Lz0vPS89Lz0vPS89Lyct5fz9tLz0vPS8/K7vXyfl56Xnpeet563nreet5638/Z23t563nreet5+t7fv89bzdt7e3uftfd563t7n7X3eet7O4do5XPu7Wnuft9/t7fu8fZ+3c7j2Pm/v8/Y+b+/z9j5v53DtvL2dt7e/q7X3efvd3r7P2/d5O4dr7/P2Pm/v8/Y+b+/zdg7XztvbeXv7u1p7n7ff7e37vH2ft3O49j5v7/P2Pm/v8/Y+bz1v5+3tvL39Xa29z1vP2/d5+z5v53Ct563nreet563n7Ryu/V2t9bz1vPW8/W5v3+et563nreet563nreet5+0crv1drfW89bz1vP1ub9/nreet563nreet56Pno+fjHG78XW30fPR89Hz8bh/f56Pno+ej56Pno+ej56Pn430+3uej56Pno+fjfT7e56Pno+ej56Pno+ej56Pn4xxunLePno+ej56P3+3j+3z0fPR89Hz0fPR89Hz0fJzDjfP20fPR89Hz8bt9fJ+Pno+ej56Pno+ej56Pno/3+Xifj56Pno+ej/f5eJ+Pno+ej56Pno+ej56Pno9zuHHePno+ej56Pn63j+/z0fPR89Hz0fPR89Hz0fNxDjfO20fPR89Hz8fv9vF9Pno+ej56Pno+ej56Pnq+zuHWefvq+er56vn63b6+z1fPV89Xz1fPV89Xz1fP1+/2dd6+er56vnq+frev3+2r56vnq+er56vnq+er5+scbp23r56vnq+er+/z9X2+er56vnq+er56vnq+er7O4dZ5++r56vnq+fo+X9/nq+er56vnq+er56vnq+frHG6dt6+er56vnq/f7et3++r56vnq+er56vnq+er5Oodb5+2r56vnq+frd/v6Pl89Xz1fPV89Xz1fPV89X+dw67x99Xz1fPV8/W5f3+er56vnq+er56vnq+er5+sc7vPD/f+E7Ov5+fP1/Hz7Un/Tv4zz+eF+U5rK1KYx7Td9PT94uPP54X7TM4UpTWWScWQcGVfGlfH1/ODhDh7u4OHO54f7TW0ak3v13Ksn48l4Mp6MJ+O5V891PNfxXEfICM8j3Ktwr8K9ChkhI2SEjJCR7lW6jnQd6TpSRnoe6V6le5XuVcoo11Guo1xHySgZJaNk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noff7dEyfJ+Hnoeeh56H9/lfHu7v+ctfHi7+m47pmp4pTGkqU5vG9J1lxMpYGStjZayMlbEyVsbK2C8j//wxHdM1PVOY0lSmNo1JxpFxZBwZR4bf7en7PH2fp56nnqeep/d5ep+nnqeep56nnqeep56nnqeep56nnn9+uN8kQ89Tz1PP0+/29H2eep56nnqeep56nnqeev754X5Tm8b09SP1PP1uT9/nqeep56nnqeep56nnqeefH+43HZN7peep5+l3e/o+Tz3//HC/SYb3eep5ep+n93nqeTqHS+dwHw/3m9wrv9vT93n6Pk/ncOl9nt7n6X2e3ufpfZ7O4T4/3P+nda/WvfI+T7/b0/d5+j5P53DpfZ7e5+l9Xt7n5X1ezuHKeXs5b68/aSpT+2/HJMM5XHmfl/d5eZ+X93l5n5eel/P2ct7+8XD/n7zPS8/L93n5Pi/ncKXnpeel56XnpeflHO7zw/0m90rPS8/L7/byfV56Xnpeel56Xnpeel56Xs7hPj/cb3Kv9Lz0vPxuL9/npeel56Xnpeel56XnpeflHO7zw/1/0vPS89Lz8ru9fJ+Xnpeel56Xnpeel56Xnpf3eXmfl56Xnpeel/d5eZ+Xnpeel56Xnpeel56XnpdzuHLeXnpeel56Xn63l+/z0vPS89Lz0vPS89Lz0vN2DtfO21vPW89bz9vv9vZ93nreet563nreet563nre3uftfd563nreet7e5+193nreet563nreet563nrezuHaeXvreet563n73d6+z1vPW89bz1vPW89bz1vP2zlcO29vPW89bz1vv9vb93nreet563nreet563nreTuHa+ftreet563n7Xd7+z5vPW89bz1vPW89bz1vPW+/29t5e+t563nrefvd3n63t563nreet563nreet563c7h23t563nreet6+z9v3eet563nreet563nreet5O4dr5+2j56Pno+fj+3x8n4+ej56Pno+ej56Pno+ej3O4cd4+ej56Pno+freP3+2j56Pno+ej56Pno+ej5+Mcbpy3j56Pno+ej9/t4/t89Hz0fPR89Hz0fPR89Hycw43z9tHz0fPR8/G7fXyfj56Pno+ej56Pno+ej56Pc7hx3j56Pno+ej5+t4/v89Hz0fPR89Hz0fPR89Hz8X0+vs9Hz0fPR8/H7/ZxDjd6Pno+ej56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+03ulZ6nnqff7en7PPU89Tz1PPU89Tz1PPU8ncN9frjf5F7peep5+t2evs9Tz1PPU89Tz1PPU89Tz9P3efo+Tz1PPU89T7/b0zlc6nnqeep56nnqeep56nk6h/v8cL/JvdLz1PP0u72cw5Wel56Xnpeel56Xnpeel3O4ct5eel56XnpefreXc7jS89Lz0vPS89Lz0vPS83IOV87bS89Lz0vPy+/20vPyPi/v89Lz8ru9nMOV7/PS89Lz0vPyPv/Lw/09f/nLw8V/0zFd0zOFKU1latOYvrOMShkpI2WkjJSRMlJGykgZKaNklIySUTJKRskoGSWjZJSMltEyWkbL8Lu9fJ+X7/PS89Lz0vPyPi/v89Lz0vPS89Lz0vPS89Lz0vPS89Lzct5ezttLz0vPS8/L7/byfV563nreet563nreet563s7b23l763nreet5+93evs9bz1vPW89bz1vPW89bz9t5eztvbz1vPW89b7/b2/d563k7b2/v8/Y+bz1v7/P2Pm89b+dw7Ryu/V2tvc/b7/b2fd6+z9s5XHuft/d5e5+393l7n7dzuHbe3s7b29/V2vu8/W5v3+ft+7ydw7X3eXuft/d5e5+393k7h2vn7e28vf1drb3P2+/29n3evs/bOVx7n7f3eXuft/d5e5+3nrfz9nbe3v6u1t7nreft+7x9n7dzuNbz1vPW89bz1vN2Dtf+rtZ63nreet5+t7fv89bz1vPW89Hz0fPR89HzcQ43/q42ej56Pno+freP7/PR89Hz0fPR89Hz0fPR83EON/6uNno+ej56Pn63j+/z0fPR89Hz0fPR89Hz0fPxPh/v89Hz0fPR8/E+H+/z0fPR89Hz0fPR89Hz0fNxDjfO20fPR89Hz8fv9vF9Pno+ej56Pno+ej56Pno+zuHGefvo+ej56Pn43T6+z0fPR89Hz0fPR89Hz0fPx/t8vM9Hz0fPR8/H+3y8z0fPR89Hz0fPR89Hz0fPxzncOG8fPR89Hz0fv9vH9/no+ej56Pno+ej56vnq+TqHW+ftq+er56vn63f7+j5fPV89Xz1fPV89Xz1fPV/ncOu8ffV89Xz1fP1uX9/nq+er56vnq+er56vnq+frd/s6b189Xz1fPV+/29fv9tXz1fPV89Xz1fPV89XzdQ63zttXz1fPV8/X9/n6Pl89Xz1fPV89Xz1fPV89X+dw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ep56nnqOhzt4uIOHO+kcLp23l56Xnpee4+FO+T4vPS89Lz0vPcfDHTzcwcOdcg5XzttLz0vPS8/xcKd8n5eel56Xnpee4+EOHu7g4U55n5f3eel56XnpOR7ulPd56Xnpeel56Tke7uDhDh7ulHO4ct5eel56XnqOhzvl+7z0vPS89Lz0HA938HAHD3fKOVw5by89Lz0vPcfDnfJ9Xnpeel56XnqOhzt4uIOHO+Ucrpy3l56Xnpee4+FO+T4vPS89Lz0vPcfDHTzcwcOd8ru9nLeXnpeel57j4U753V56Xnpeel56joc7eLiDhzvlHK6ct5eel563nuPhTvs+bz1vPW89bz3Hwx083MHDnXYO187bW89bz1vP8XCnfZ+3nreet563nuPhDh7u4OFOO4dr5+2t563nred4uNN+t7eet563nree4+EOHu7g4U47h2vn7a3nreet53i4077PW89bz1vPW8/xcAcPd/Bwp53DtfP21vPW89ZzPNxp3+et563nreet53i4g4c7eLjTzuHaeXvreet56zke7rTv89bz1vPW89ZzPNzBwx083Gnf5+37vPW89bz1HA932jlc63nreet56zke7uDhDh7utHO4dt7eet563nqOhzvjHG70fPR89Hz0HA938HAHD3fGOdw4bx89Hz0fPcfDnXEON3o+ej56PnqOhzt4uIOHO+Mcbpy3j56Pno+e4+EOHu7g4Q4e7oye4+HOOIcb3+d4uIOHO3i4g4c7f3m4v+cvf3m4+G86pmt6pjClqUxtGtN3ljEpI2WkjJSRMlJGykgZKSNllIySUTJKRskoGSWjZJSMktEyWkbLaBl+t4/v8/F9joc7eLiDhzt4uIOHO6Pno+d4uDN6Pno+ej56joc7eLiDhzvjvH2ct4+ej56PnuPhzvg+Hz1fPV89Xz3Hwx083MHDnXXevs7bV89Xz1fP8XBnfZ+vnq+er56vnuPhDh7u4OHOOm9f5+2r56vnq+d4uLO+z1fP13n7ep+v9zke7qz3+Xqf4+HOOofDwx083MHD/Y+oc0lyZFeW5JYq/Avf/8a6X95D1RlGZRJguTESVFF88HAfPNwHD/fBw33H9/nxfX58nx/f58f3+XEOd5y3H+ftx+9qx/f58d5+/H1+/H1+nMMd3+fH9/nxfX58nx/f58c53HHefpy3H7+rHd/nx3v78ff58ff5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85LyvOSHNf4tTfO9pHwvKd9LyveSn+zvb+nnNu7kuJO+l5R/45TnJeV5yU/697c0zfeS8r2kfC8p30t+6r+/pZ/bupPrTvpeUv6NU56XlOclPwXg39I030vK95LyvaR8Lym75GcC/L/luZPnTvpeUnZJeV5Snpf8AMi/pWl2SdklbZe0XdKevf68gH/Lctkux+X6LzyXptklbZe0XdJ2SdslbZe0Z68/S+Df8rlkJ9suaf/Gac9L2i5pu6TtkrZL2i5pu6Ttkvbs9ecM/Fu6k3ZJ2yXt3zjteUnbJW2XtF3SdknbJW2XtF3Svpe07yVtl7Rd0nZJ+17Svpe0XdJ2SdslbZe0XdJ2Sdsl7dlrt5+bXdJ2Sdsl7d847XlJ2yVtl7Rd0nZJ2yVtl7Rd0p699vq52SVtl7Rd0v6N056XtF3SdknbJW2XtF3SdknbJe17Sfte0nZJ2yVtl7TvJe17SdslbZe0XdJ2SdslbZe0XTKevY6/44xdMnbJ2CXj3zjjecnYJWOXjF0ydsnYJWOXjF0ynr2Ov+OMXTJ2ydgl498443nJ2CVjl4xdMnbJ2CVjl4xdMp69jr/jjF0ydsnYJePfOON5ydglY5eMXTJ2ydglY5eMXTL+jTP+jjN2ydglY5eMf+OMf+OMXTJ2ydglY5eMXTJ2ydgl49nr+DvO2CVjl4xdMp6XjOclY5eMXTJ2ydglY5eMXTJ2yXj2Ov6OM3bJ2CVjl4znJeN5ydglY5eMXTJ2ydglY5eMXTKevY6/44xdMnbJ2CXj3zjj3zhjl4xdMnbJ2CVjl4xdMnbJePY6/o6zdsnaJWuXrH/jrOcla5esXbJ2ydola5esXbJ2yXr2uv6Os3bJ2iVrl6x/46znJWuXrF2ydsnaJWuXrF2ydsl69rr+jrN2ydola5esf+Os5yVrl6xdsnbJ2iVrl6xdsnbJel6ynpesXbJ2ydol698469nr2iVrl6xdsnbJ2iVrl6xdsp69rr/jrF2ydsnaJevfOOvZ69ola5esXbJ2ydola5esXbKeva6/46xdsnbJ2iXr3zjr2evaJWuXrF2ydsnaJWuXrF2ynr2uv+OsXbJ2ydol6984a5es7yXre8naJevfOOvZ63pesnbJ2iVrl6zvJX+86P/Oz/6A0fpv+bkMl+myXLbLcbkun0tOnt5n2mfaZ9pn2mfaZ9pn2mfaZ9pnWpgWpoVpYVqYFqaFaWFamBampWlpWpqWpvk3zvO85Hle8uySZ5c8u+T5XvJ8L3l2ybNLnl3y7JJnlzy75Nklzy55dsmzS56/4zx/x3l2ybNLnl3y/BvneV7y7JJnlzy75Nklzy55dsmzS56/4zx/x3l2ybNLnl3y/BvneV7y7JJnlzy75Nklzy55dsmzS56/4zx/x3l2ybNLnl3y/BvneV7y7JLn7zjP95Lne8mzS57vJc/3kmeXPM9en2evz9+En+8lz79xzvOS87zkPHs930vO95LzveR8LznfS86z1/N3nPN3nPM34fO95Pwb5zwvOc9LzrPX873kfC8530vO95LzveQ8ez1/xzl/xzl/Ez7fS86/cc7zkvO85Dx7Pd9LzveS873kfC8530vOLjl/xzl/xzl/Ez7fS84uOc9LzvOS8+z17JKzS84uObvk7JLz7PX8TfjskrNLzi45/8Y5z0vOLjm75OySs0vOLjm75OyS8+z1/E347JKzS84uOf/GOc9Lzi45u+TskrNLzi45u+TskvPs9fxN+OySs0vOLjn/xjnPS84uObvk7JKzS84uObvk7JLzveR8Lzm75OySs0vO95LzveToku8fXfL9o0u+f3TJJ/f6yb1+cq/fP85ev3/8jvP9o0u+f3TJ948u+eRev3+faZ9pn2mfaXTJJ/f6yb1+cq/fvzCN33G+f3TJ948u+f7RJZ/c6/cvTAvTwrQwLd3J9NnSZ0ufLU3jveT7l+5kupPpTqZpZVqZVqaVaeVOls9WPlv5bGVa+bm1O9nuZLuTbVqb1qa1aW1au5Pts43PNj7bmDZ+buNOjjs57uSYNqaNaWvamrbu5Pps67Otz7amrZ/bupPrTj538pn2THumPdOeac+dfD7b89mez3amnZ/buZPnTp47eaadaWfamWaXfHaJ3Osn9/rJvX4fZ6/fx+8432eXfHbJZ5fIvX7fZ5pd8tkln13y2SVyr5/c6yf3+n2fafyO8312yWeXfHaJ3Ov3hWl2yWeXfHbJZ5fIvX5yr5/c6/elafyO8312yWeXfHaJ3Ov3pWl2yWeXfHbJZ5fIvX5yr5/c6/eVaeXnZpd8dslnl8i9fl+bZpd8dslnl3x2idzrJ/f6yb1+35g2fm52yWeXfHaJ3Ov3jWl2yWeXfHbJZ5fIvX5yr5/c6/etaevnZpd8dslnl8i9ft8zzS757JLPLvnsErnXT+71k3v9vmfa83OzSz675LNL5F6/70yzSz675LNLPrtE7vWTe/3kXr/g7PULfsf5wi4JuyTsErnXLzh7/cIuCbsk7JKwS+ReP7nXT+71i880fsf5wi4JuyTsErnXL8I0uyTskrBLwi6Re/3kXj+51y/SNH7H+cIuCbsk7BK510/u9ZN7/eRev7BL5F6/KNPKNLtE7vWTe/3kXr8/7vX+W/7Ogr4/7vW/Zf9z+bkMl+myXLbLcbkuTWvTxrQxbUwb08a0MW1MG9PGtDFtTVvT1rQ1bU1b09a0NW1NW9Oeac+05+f2/F/y/F9il8i9fnKvn9zrJ/f6hV0Sdonc6xd2SdglYZeEXSL3+sm9fnKvX/I7zpf8jvOlXZJ2Sdolcq9fcl7ypV2SdknaJWmXyL1+cq+f3OuXn2n8jvOlXZJ2Sdolcq9fhml2SdolaZekXSL3+sm9fnKvX4Zp/I7zpV2SdknaJXKvX6Zpdkmmab6XpO8lcq9f+l6SvpfIvX5Zfm7lTpY76XuJ3Osn9/rJvX5yr1/6XpK+l6TvJel7Sfpekm1a+7m1O9nupO8l6d84OaaNaWOa7yXpe0n6XpK+l6TvJbmmrZ/bupPrTvpekv6Nk2vamram+V6Svpek7yXpe0n6XpJ2ST4/t+dOPnfS9xK510/u9ZN7/eReP7nXL+2StEvSLpF7/fJM4zfhr+ySskvKLpF7/crzkrJLyi4pu6TsErnXT+71k3v96jON34S/skvKLim7RO71K89Lyi4pu6TskrJL5F4/uddP7vWrMI3fhL+yS8ouKbtE7vUrz0vKLim7pOySskvkXj+510/u9SvfS8r3krJLyi4pu0Tu9SvfS8ouKbuk7JKyS+ReP7nXT+71qzat/dzskrJLyi6Re/3K85KyS8ouKbuk7BK510/u9ZN7/WpMGz83u6TskrJL5F6/8ryk7JKyS8ouKbtE7vWTe/3kXr/yvaR8Lym7pOySskvkXr/yvaTskrJLyi4pu0Tu9ZN7/eRevzrTzs/NLim7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+51689e21+x/naLmm7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+51689e21+x/naLmm7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+516/9G6fTz80uabuk7RK516/9G6ftkrZL2i5pu0Tu9ZN7/eRev/bstdvPzS5pu6TtErnXrz0vabuk7ZK2S9oukXv95F4/udevPXvt8XOzS9ouabtE7vVrz0vaLmm7pO2StkvkXj+510/u9WvPXvv5udklbZe0XSL3+rV/47Rd0nZJ2yVtl8i9fnKvn9zr15699vm52SVtl7RdIvf6jeclY5eMXTJ2ydglcq+f3Osn9/qNZ6/j7zhjl4xdMnaJ3Os3npeMXTJ2ydglY5fIvX5yr5/c6zeevY6/44xdMnbJ2CVyr994XjJ2ydglY5eMXSL3+sm9fnKv33heMp6XjF0ydsnYJXKv33j2OnbJ2CVjl4xdIvf6yb1+cq/fePY6/o4zdsnYJWOXyL1+49nr2CVjl4xdMnaJ3Osn9/rJvX7j2ev4O87YJWOXjF0i9/qNZ69jl4xdMnbJ2CVyr5/c6yf3+o1nr+PvOGOXjF0ydonc6yf3+sm9fnKv39glcq/fePY6npfIvX5yr5/c6yf3+v1xr/ffkrOgP+71t3wuOQtaWLVvYdW+hVX7FlbtW1i1b2HVvoVV+xZW7VtYtW//mfaZ9pn2mfaZ9pn2mfaZ9pn2mfaZFqaFaWFamBamhWlhWpgWpoVp/o2znpes5yVyr5/c6yf3+sm9fnKv39ola5fIvX5rl6xdsnbJ2iVyr5/c6yf3+q2/46y/46xdsnbJ2iVyr996XrJ2ydola5esXSL3+sm9fnKv3/o7zvo7ztola5esXSL3+q3nJWuXrF2ydsnaJXKvn9zrJ/f6rb/jrL/jrF2ydsnaJXKv33pesnbJ+jvO+l6yvpfIvX7re8n6XiL3+q1nr3Kvn9zrJ/f6yb1+cq+f3Osn9/qt7yXP95Lne8nzveT5XvI8e33+jvP8Hef5m/DzveT5N87zvOR5XvI8e32+lzzfS57vJc/3kud7yfPs9fk7zvN3nOdvws/3kuffOM/zkud5yfPs9fle8nwveb6XPN9Lnu8lzy55/o4j9/rJvX5yr5/c6yf3+sm9fnKvn9zr9+ySZ5c8u0Tu9XuevT5/E352ybNLnl0i9/o9z0ueXfLskmeXPLtE7vWTe/3kXr/n2evzN+Fnlzy75Nklcq/f87zk2SXPLnl2ybNL5F4/uddP7vV7nr0+fxN+dsmzS55dIvf6Pc9Lnl3y7JJnlzy7RO71k3v95F6/53vJ873k2SXPLnl2idzr93wveXbJs0ueXfLsErnXT+71k3v9zrPX83ecs0vOLjm7RO71O89Lzi45u+TskrNL5F4/uddP7vU7z17P33HOLjm75OwSudfvPC85u+TskrNLzi6Re/3kXj+51+98LznfS84uObvk7BK51+98Lzm75OySs0vOLpF7/eReP7nX7zx7PX/HObvk7JKzS+Rev/O85OySs0vOLjm7RO71k3v95F6/8+z1/B3n7JKzS84ukXv9zvOSs0vOLjm75OwSuddP7vWTe/3Os9fzd5yzS84uObtE7vU7z0vOLjm75OySs0vkXj+510/u9Tv/xjl/xzm75OySs0vkXr/zb5yzS84uObvk7BK510/u9ZN7DX2voe819L3GP7ok/tElIfca+l5D32voew19r6HvNeReQ+415F5D32voew19r/GPLol/dEnIvYa+19D3GvpeQ99r6HsNudeQew2519D3GvpeQ99r/Et3Mt3JNC1NS9PStDQt3cn02cpnK5+tTCs/t3Iny50sd7JMK9PKtDatTWt3sn229tnaZ2vT2s+t3cl2J8edHNPGtDFtTBvTxp0cn218tvHZ1rT1c1t3ct3JdSfXtDVtTVvT1rTnTj6f7flsz2d7pj0/t+dOPnfyuZPPtDPtTDvTzrRzJ89nO5/tfLYzjd9x4rNLPrvks0vkXkPfa+h7DX2voe819L2G3GvIvYbca+h7DX2voe81Prvks0vkXkPfa+h7DX2voe819L2G3GvIvYbca+h7DX2voe81Prvks0vkXkPuNeReQ+419L2G3Gt8aVqaZpfIvYbca8i9xh/3ev8tf2dB8ce9/pbjcl0+l8cSVi0+WLX4YNXig1WLr01r09q0Nq1Na9PGtDFtTBvTxrQxbUwb08a0MW1NW9PWtDVtTVvT1rQ1bf3c1v8lz/8ldonca8i9htxryL3GZ5d8donca+h7DX2voe819L2G3GvIvYbca+h7DX2voe81Prsk7BK519D3GvpeQ99r6HsNfa8h9xpyryH3GvpeQ99r6HuNsEvCLpF7DX2voe819L2GvtfQ9xpyryH3GnKvoe819L2GvtcIuyTsErnX0Pca+l5D32voew19ryH3GuF7SfheIvca+l5D7jXkXkPuNeReQ+415F5D7jX0vYa+19D3GuF7Sfheou819L2GvteIdid9L9H3GvpeQ99r6HsNfa+h7zX0vUb4XhK+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r6nvNfW9ptxryr2m3Gvqe019r6nvNdMuSbtE7jX1vaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpeM+2StEvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe810y5Ju0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7JKyS+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXLLim7RO419b2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XrPskrJL5F5T32vqe019r6nvNfW9ptxryr2m3Gvqe019r6nvNcsuKbtE7jX1vaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpes+ySskvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe81yy4pu0TuNeVeU+415V5T32vKvWY90zwvkXtNudeUe0251/zjXu+/JWdBf9zrf8v75/JzGS7TZblsl+NyXZoGq5YNq5YNq5YNq5YNq5YNq5YNq5YNq5YNq5YNq5b9z7TPtM+0z7TPtM+0z7TPtM+0z7TPtDAtTPNvnPa8RN9ryr2m3GvKvabca8q9ZtslbZfIvaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpes+2StkvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe812y5pu0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7ZK2S+ReU99r6ntNfa+p7zX1vabca7bvJe17idxr6ntNudeUe02515R7TbnXlHtNudfU95r6XlPfa7bvJe17ib7X1Pea+l6z+U04x/cSfa+p7zX1vaa+19T3mvpeU99rju8l43uJvtfU95r6XnP4TTjH9xJ9r6nvNfW9pr7X1Pea+l5T32uO7yXje4m+19T3mnKvKfeacq8p95pyryn3mnKvKfea+l5T32uOXSL3mvpeU99r6nvNsUvGLpF7TX2vqe819b2mvtfU95pyryn3mnKvqe819b2mvtccu2TsErnX1Pea+l5T32vqe019ryn3mnKvKfea+l5T32vqe82xS8YukXtNfa+p7zX1vaa+19T3mnKvKfeacq+p7zX1vaa+1xy7RN9ryr3m+F6i7zXHLhm7ZOwSudeUe0251xzPXsffccYuGbtk7BK511zPS9YuWbtk7ZK1S+ReU+415V5zPXtdf8dZu2TtkrVL5F5zPS9Zu2TtkrVL1i6Re02515R7zfW9ZH0vWbtk7ZK1S+Rec30vWbtk7ZK1S9YukXtNudeUe8317HX9HUffa+p7TX2vKfea+l5T32vqe019r6nvNeVeU+415V5T32vqe019r7l2ydolcq+p7zX1vaa+19T3mvpeU+415V5T7jX1vaa+19T3mmuXrF0i95r6XlPfa+p7TX2vqe815V5T7jXlXlPfa+p7TX2vuXbJ2iVyr6nvNfW9pr7X1Pea+l5T7jXlXlPuNfW9pr7X1Peaa5esXSL3mvpeU99r6ntNfa+p7zXlXlPuNeVeU99r6ntNfa/57JJnl8i9pr7X1Pea+l5T32vqe02515R7TbnX1Pea+l5T32s+u+TZJXKvqe819b2mvtfU95r6XlPuNeVeU+419b2mvtfU95rPLnl2idxr6ntNfa+p7zX1vaa+15R7TbnXlHtNfa+p7zX1veazS55dIvea+l5T32vqe019r6nvNeVeU+415V5T32vqe019r/nskmeXyL2mvtfU95r6XlPfa+p7TbnXlHtNudfU95r6XlPfaz675Nklcq+p7zX1vaa+19T3mvpeU+415V5T7jX1vaa+19T3ms8ueXaJ3Gvqe019r6nvNfW9pr7XlHtNudeUe019r6nvNfW95tklZ5fIvaa+19T3mvpeU99r6ntNudeUe02519T3mvpeU99rnl1ydonca8q9ptxryr2mvteUe83z7FXfa8q9ptxryr2m3Gv+ca/335KzoD/u9bd8LjkLOlm1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVk3vN87xE32vKvabca8q9ptxryr3m2SVnl8i9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l7z7JKzS+ReU99r6ntNfa+p7zX1vabca8m9ltxr6Xstfa+l77X+0SX1jy4pudfS91r6Xkvfa+l7LX2vJfdacq8l91r6Xkvfa+l7rX90Sf2jS0rutfS9lr7X0vda+l5L32vJvda/8NnCZ0vTOHstudeSey2515J7LbnXknstudfS91r6Xkvfa/0rn618tjKt/NzKnSx3stzJMq1Na9PatDat3cn22dpna5+tTWs/t3Enx50cd3JMG9PGtDFtTBt3cny29dnWZ1vT1s9t3cl1J9edXNPWtDXtmfZMe+7k89mez/Z8tmfa83N77uRzJ8+dPNPOtDPtTDvTzp08n+18NrtE32vpe63PLvnsks8ukXstfa+l77X0vZa+19L3WnKvJfdacq+l77X0vZa+1/rsks8ukXstfa+l77X0vZa+19L3WnKvJfdacq+l77X0vZa+1/rsEn2vJfdaX5pml3x2yWeXfHaJ3GvJvZbca31lWvm52SWfXfLZJXKv9ZVpdslnl3x2yWeXyL2W3GvJvdbXprWfm13y2SWfXSL3Wt+YZpd8dslnl3x2idxryb2W3Gt9a9r6udkln13y2SVyr/WtaXbJZ5d8dslnl8i9ltxryb3W90x7fm52ib7X0vdacq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmGXhF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vFXZJ2CVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaYZeEXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa8VdknYJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91phl4RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19rxV2Sdglcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmGXhF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vFXZJ2iVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaaZekXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa+VdknaJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91ppl6RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19r5V2Sdolcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmmXpF0i91pyryX3WnKvpe+15F4r17Q1zS6Rey2515J7rT/u9f5b/s6C6o97/S3H5bp8Lo8lrFolrFolrFolrFrlmXamnWln2pkGq1YFq1YFq1YFq1YFq1YFq1YFq1YFq1YFq1YFq1b1z7TPtM+0z7TPtM+0z7TPtM80/8Ypz0v0vZbca8m9ltxryb2W3GuVXVJ2idxr6Xstfa+l77X0vZbca8m9ltxr6Xstfa+l77XKLim7RO619L2WvtfS91r6Xkvfa8m9ltxryb2WvtfS91r6XqvskrJL5F5L32vpey19r6XvtfS9ltxryb2W3Gvpey19r6XvtcouKbtE7rX0vZa+19L3WvpeS99ryb1W+V5SvpfIvZa+15J7LbnXknstudeSey2515J7LX2vpe+19L1W+V5Svpfoey19r6XvtercSd9L9L2WvtfS91r6Xkvfa+l7LX2v1b6XtO8l+l5L32vpe63mN+Fq30v0vZa+19L3WvpeS99r6Xstfa/Vvpe07yX6Xkvfa8m9ltxryb2W3GvJvZbca8m9ltxr6Xstfa/Vdonca+l7LX2vpe+12i5pu0TutfS9lr7X0vda+l5L32vJvZbca8m9lr7X0vda+l6r7ZK2S+ReS99r6Xstfa+l77X0vZbca8m9ltxr6Xstfa+l77XaLmm7RO619L2WvtfS91r6Xkvfa8m9ltxryb2WvtfS91r6XqvtEn2vJfda7XuJvtdqu6TtkrZL5F5L7rXkXqs9e+3zc7NL2i5pu0TutdrzkrZL2i5pu2TsErnXknstudcaz17H33HGLhm7ZOwSudcaz0vGLhm7ZOySsUvkXkvuteRea3wvGd9Lxi4Zu2TsErnXGt9Lxi4Zu2TskrFL5F5L7rXkXms8ex1/x9H3WvpeS99ryb2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa41dMnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91tglY5fIvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rjV0ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2CVjl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32utXbJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbaJWuXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa61dsnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91tola5fIvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rrV2ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2iVrl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32utXbJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdazS55dIvda+l5L32vpey19r6XvteReS+615F5L32vpey19r/XskmeXyL2W3GvJvZbca+l7LbnXep696nstudeSey2515J7rT/u9f5bchb0x73+luWyXY7LdflccvL0YNXqwarVK9PKtDKtTCvTyrQyrUxr09q0Nq1Na9PatDatTWvT2rQxbUwb08a0MW1M82+c53mJvteSey2515J7LbnXknutZ5c8u0TutfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdazy55donca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2SVnl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32udXXJ2idxr6Xstfa+l77X0vZa+15J7rfO95HwvkXstfa8l91pyryX3WnKvJfdacq8l91r6Xkvfa+l7rfO95Hwv0fda+l5L32udvwmf7yX6Xkvfa+l7LX2vpe+19L2Wvtc630vO9xJ9r6XvtfS91vmb8Pleou+19L2WvtfS91r6Xkvfa+l7rfO95Hwv0fda+l5L7rXkXkvuteReS+615F5L7rXkXkvfa+l7rbNL5F5L32vpey19r3V2ydklcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WkeX9D+6pOVeW99r63ttfa+t77X1vbbca8u9ttxr63ttfa+t77X/0SX9jy5pudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77X90Set7bbnX/pempWlpWpqW7mT6bOmzpc+WpqWfW7mT5U6WO1mmlWllWplWppU7WT5b+2zts7Vp7efW7mS7k+1OtmltWps2po1p406OzzY+2/hsY9r4uY07Oe7kupNr2pq2pq1pa9q6k+uzrc+2Ptsz7fm5PXfyuZPPnXymPdOeac+0Z9q5k+eznc92PtuZdn5u506eO3nuJH/jtL7X1vfa+l77s0s+u0TuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99phl4RdIvfa+l5b32vre219r63vteVeW+615V5b32vre219rx12Sdglcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32mGXhF0i99r6Xlvfa+t7bX2vre+15V5b7rXlXlvfa+t7bX2vHXZJ2CVyr63vtfW9tr7X1vfa+l5b7rXlXlvutfW9tr7X1vfaYZeEXSL32nKvLffacq+t77XlXjvWtDXNLpF7bbnXlnvtP+71/rd8v7Og/uNef8twmS7LZbscl+vyuTyWZ9qZdqadaWfamXamnWlnGqxaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xa5z/TPtM+0z7TPtP8Gyc5L2l9ry332nKvLffacq8t99ppl6RdIvfa+l5b32vre219ry332nKvLffa+l5b32vre+20S9IukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1067JO0SudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bRL0i6Re219r63vtfW9tr7X1vfacq+dvpek7yVyr63vteVeW+615V5b7rXlXlvuteVeW99r63ttfa+dvpek7yX6Xlvfa+t77Tx30vcSfa+t77X1vba+19b32vpeW99rl+8l5XuJvtfW99r6Xrv4TbjL9xJ9r63vtfW9tr7X1vfa+l5b32uX7yXle4m+19b32nKvLffacq8t99pyry332nKvLffa+l5b32uXXSL32vpeW99r63vtskvKLpF7bX2vre+19b22vtfW99pyry332nKvre+19b22vtcuu6TsErnX1vfa+l5b32vre219ry332nKvLffa+l5b32vre+2yS8oukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1y67RN9ry712+V6i77XLLim7pOwSudeWe225165n2vNzs0vKLim7RO61y/OSskvKLim7pOwSudeWe225127PXpvfcbrtkrZL2i6Re+32vKTtkrZL2i5pu0TuteVeW+612/eS9r2k7ZK2S9oukXvt9r2k7ZK2S9ouabtE7rXlXlvutduz1+Z3nNb32vpeW99ry722vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa7dd0naJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW9dtslbZfIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rt13Sdonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b122yVtl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32uPXTJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfbYJWOXyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa49dMnaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99tglY5fIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rj10ydonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b322CVjl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32uPXTJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfbYJWuXyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa69dsnaJ3GvLvbbca8u9tr7Xlnvt9exV32vLvbbca8u9ttxr/3Gv99+Ss6A/7vW/Zf5z+bkMl+myXLbLcbkuTUvTyrQyrUwr08q0Mq1MK9PKtDKtTWvT2rQ2rU1r09q0Nq1Na9PGtDHNv3HW8xJ9ry332nKvLffacq8t99prl6xdIvfa+l5b32vre219ry332nKvLffa+l5b32vre+21S9YukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1167ZO0SudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77WeXPLtE7rX1vba+19b32vpeW99ry732873k+V4i99r6XlvuteVeW+615V5b7rXlXlvutfW9tr7X1vfaz/eS53uJvtfW99r6Xvv5m/DzvUTfa+t7bX2vre+19b22vtfW99rP95Lne4m+19b32vpe+/mb8PO9RN9r63ttfa+t77X1vba+19b32s/3kud7ib7X1vfacq8t99pyry332nKvLffacq8t99r6Xlvfaz+7RO619b22vtfW99rPLnl2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfazS55dIvfa+l5b32vre219r63vteVeW+615V5b32vre219r312ydklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32meX6Httudc+30v0vfbZJWeXnF0i99pyry332ufZ6/k7ztklZ5ecXSL32ud5ydklZ5ecXXJ2idxry7223GufZ6/n7zhnl5xdcnaJ3Guf5yVnl5xdcnbJ2SVyry332nKvfb6XnO8lZ5ecXXJ2idxrn+8lZ5ecXXJ2ydklcq8t99pyr32evZ6/4+h7bX2vre+15V5b32vre219r63vtfW9ttxry7223Gvre219r63vtc8uObtE7rX1vba+19b32vpeR9/ryL2O3OvIvY6+19H3Ovpe5x9dMv/okpF7HX2vo+919L2OvtfR9zpyryP3OnKvo+919L2Ovtf5R5fMP7pk5F5H3+voex19r6PvdfS9jtzryL2O3Ovoex19r6Pvdf6lO5nuZJqWpqVpZVqZVu5k+Wzls5XPVqaVn1u5k+VOtjvZprVpbVqb1qa1O9k+W/ts7bONaePnNu7kuJPjTo5pY9qYNqaNaetOrs+2Ptv6bGva+rmtO7nu5LqTa9oz7Zn2THumPXfy+WzPZ3s+2zPt+bmdO3nu5LmTZ9qZdqadaWfauZN2idzryL2OvtfR9zqfXfLZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6cq8j9zpyr6PvdeRe5xvT1jS7RO515F5H7nX+uNf7b/k7C5o/7vW3fC6PJazafLBq88GqzQerNh+s2nywavM9055pz7Rn2pl2pp1pZ9qZdqadaWfamQarNgGrNgGrNgGrNgGrNgGrNgGrNgGrNgGrNgGrNvHPNP7GmeC8ZPS9jtzryL2O3OvIvY7c64RdEnaJ3Ovoex19r6PvdfS9jtzryL2O3Ovoex19r6PvdcIuCbtE7nX0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o+919L2OvtfR9zpyryP3OnKvo+919L2Ovtc5u+TsErnX0fc6+l5H3+voex19ryP3OnKvI/c6+l5H3+voe52zS84ukXsdfa+j73X0vY6+19H3OnKvI/c6cq+j73X0vY6+1zm75OwSudfR9zr6Xkff6+h7HX2vI/c6cq8j9zr6Xkff6+p73X90yf6jS1budfW9rr7X1fe6+l5X3+vKva7c68q9rr7X1fe6+l73H12y/+iSlXtdfa+r73X1va6+19X3unKvK/e6cq+r73X1va6+1/0X7mS6k2lampampWlpWrqT6bOlz5Y+W5lWfm7lTpY7We5kmVamlWllWpnW7mT7bO2ztc/WprWfW7uT7U62O9mmjc82Ptv4bGPamDamjWnjs43PNqatz/Z/XXL/LX9nQfvHvf6W5bJdjst1+VweS1i1/Qertv+eac+0Z9oz7Zn2THumPdPOtDPtTDvTzrQz7Uw70840WLX9YNX2g1XbD1ZtP1i1/WDV9oNV+/9LPreP85LV97pyryv3unKvK/e6cq/72SWfXSL3uvpeV9/r6ntdfa8r97pyryv3uvpeV9/r6nvdzy757BK519X3uvpeV9/r6ntdfa8r97pyryv3uvpeV9/r6nvdzy757BK519X3uvpeV9/r6ntdfa8r97pyryv3uvpeV9/r6nvdzy757BK519X3uvpeV9/r6ntdfa8r97rf+Gzjs9kl+l5X7nXlXlfudeVeV+515V5X7nX1va6+19X3ut/6bOuzPdOen9tzJ587+dzJZ9oz7Zn2THumnTt5Ptv5bOeznWnn53bu5LmT507yN87qe119r6vvdfW9rr7X1fe64XtJ+F6i73X1va7c68q9rtzryr2u3OvKva7c68q9rr7X1fe6YZfIva6+19X3uvpeN+ySsEvkXlff6+p7XX2vq+919b2u3OvKva7c6+p7XX2vq+91wy4Ju0TudfW9rr7X/X9F3NGqd0mSWPd30bUvTkZEZkT4XYyQZNkMDBoxlgzGzLurzzdV+3cXTTcV7P2vXuTJvVh6r6332nqvzXtt3mvzXlvvtfVeW++1A0sCS3ivrffaeq+t99p6r6332rzX5r0277X1XlvvtfVeO7BE77V5rx3OJXqvHVgSWBJYwntt3mvzXjvatva7YUlgSWAJ77VjbMOSwJLAksAS3mvzXpv32rG2rd8NSwJLAkt4rx1rG5YkliSWJJbwXpv32rzXTueSdC5JLEksSSzhvXY6lySWJJYkliSW8F6b99q8186w7fuO03qvrffaeq/Ne22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qJJYklvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq+dWJJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffaiSWJJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvnViSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332okliSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r11YUljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qFJYUlvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq9dWFJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffahSWFJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvXVhSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332oUlhSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r11YUljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99oXSy6W8F6b99q81+a9tt5r8177unvVe23ea/Nem/favNf+473++/3ZH++1/hqPMYxpLOM1PmMbx/jdPN20LW1L29K2tC1tS9vStrQtbSvbyrayrWwr28q2sq1sK9vKtmvbte3adm3zN851X6L32rzX5r0277V5r8177YslF0t4r6332nqvrffaeq/Ne23ea/NeW++19V5b77Uvllws4b223mvrvbbea+u9tt5r816b99q819Z7bb3X1nvtiyUXS3ivrffaeq+t99p6r6332rzX5r0277X1XlvvtfVe+2HJwxLea+u9tt5r67223mvrvTbvtZ9zyXMu4b223mvzXpv32rzX5r0277V5r817bb3X1nttvdd+ziXPuUTvtfVeW++1X3qTziV6r6332nqvrffaeq+t99p6r/2cS55zid5r67223mu/8iadS/ReW++19V5b77X1XlvvtfVe+zmXPOcSvdfWe23ea/Nem/favNfmvTbvtXmvzXttvdfWe+2HJbzX1nttvdfWe+2HJQ9LeK+t99p6r6332nqvrffavNfmvTbvtfVeW++19V77YcnDEt5r67223mvrvbbea+u9Nu+1ea/Ne22919Z7bb3XbixpLOG9tt5r67223mvrvbbea/Nem/favNfWe22919Z77cYSvdfmvXY7l+i9dmNJY0ljCe+1ea/Ne+1299q+4zSWNJY0lvBeu92XNJY0ljSWNJbwXpv32rzXbnev7TtOY0ljSWMJ77XbfUljSWNJY0ljCe+1ea/Ne+12LmnnksaSxpLGEt5rt3NJY0ljSWNJYwnvtXmvzXvtdvfavuPovbbea+u9Nu+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rN5Y0lvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u9dmPJYAnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeaw+WDJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZgyWAJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msPlgyW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6732YMlgCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rD5YMlvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u99mDJYAnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeaw+WDJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZiyWIJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msvliyW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6732YsliCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rL5YslvBem/favNfmvbbea/Nee9296r0277V5r817bd5r//Fe96/xuwv6473+NfaP8RjDmMYyXuMzttE2rtpy1Zartly15aotV225astVW67actWWq7ZcteWqLVdtuWrLVVuu2nLVlqu2XLX9XLX5+Vy1+flcteG9zs93XzJ6r8N7Hd7r8F6H9zq81/n5WDI/H0uG9zp6r6P3Onqvo/c6vNfhvQ7vdfReR+919F7nJzxbeLawLWwL28K2sO1jyfBeh/c6vNfRex2919F7nZ+PJfPzsWR4r6P3Onqvo/c6eq+j9zq81+G9Du919F5H73X0XufnepPXm7y2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q/e6F0sulvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q97sWSiyW819V7Xb3X1XtdvdfVe13e6/Jel/e6eq+r97p6r/uw5GEJ73X1XlfvdfVeV+919V6X97q81+W9rt7r6r2u3us+LHlYwntdvdfVe12919V7Xb3X5b0u73V5r6v3unqvq/e6D0selvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q97sOShyW819V7Xb3X1XtdvdfVe13e6/Jel/e6eq+r97p6r/uw5GEJ73X1XlfvdfVeV+919V6X97q81+W9rt7r6r2u3us+LHlYwntdvdfVe12919V7Xb3X5b0u73V5r6v3unqvq/e6D0selvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q9bmNJYwnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6zaWNJbwXlfvdfVeV+919V5X73V5r8t7Xd7r6r2u3uvqvW5jSWMJ73X1XlfvdfVeV+919V6X97q81+W9rt7r6r2u3us2ljSW8F6X97q81+W9rt7r8l633b3qvS7vdXmvy3td3uv+8V7//f7sj/daf43HGMY0lvEan7GNY/xunrpta9vatratbWvb2ra2rW1r28a2sW1sG9vGtrFtbBvbxraxbW1b29a2tc3fOO2+RO91ea/Le13e6/Jel/e6gyWDJbzX1XtdvdfVe1291+W9Lu91ea+r97p6r6v3uoMlgyW819V7Xb3X1XtdvdfVe13e6/Jel/e6eq+r97p6rztYMljCe12919V7Xb3X1XtdvdflvS7vdXmvq/e6eq+r97qDJYMlvNfVe12919V7Xb3X1Xtd3uuOc8k4l/BeV+91ea/Le13e6/Jel/e6vNflva7e6+q9rt7rjnPJOJfova7e6+q97vgmPM4leq+r97p6r6v3unqvq/e6eq87ziXjXKL3unqvq/e645vwOJfova7e6+q9rt7r6r2u3uvqve44l4xzid7r6r0u73V5r8t7Xd7r8l6X97q81+W9rt7r6r3uYgnvdfVeV+919V53sWSxhPe6eq+r97p6r6v3unqvy3td3uvyXlfvdfVeV+91F0sWS3ivq/e6eq+r97p6r6v3urzX5b0u73X1XlfvdfVed7FksYT3unqvq/e6eq+r97p6r8t7Xd7r8l5X73X1XlfvdRdL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e43GksYS3mvovYbea+i9ht5r6L0G7zV4r8F7Db3X0HsNvddoLGks4b2G3mvovYbea+i9ht5r8F6D9xq819B7Db3X0HuNxpLGEt5r6L2G3mvovYbea+i9Bu81eK/Bew2919B7Db3XaCxpLOG9ht5r6L2G3mvovYbea/Beg/cavNfQew2919B7jcaSxhLea+i9ht5r6L2G3mvovQbvNXivwXsNvdfQew2912gsaSzhvYbea+i9ht5r6L2G3mvwXoP3GrzX0HsNvdfQe43GksYS3mvovYbea+i9ht5r6L0G7zV4r8F7Db3X0HsNvdcYLBks4b2G3mvovYbea+i9ht5r8F6D9xq819B7Db3X0HuNwZLBEt5r6L2G3mvovYbea+i9Bu81eK/Bew2919B7Db3XGCwZLOG9ht5r6L2G3mvovYbea/Beg/cavNfQew2919B7jcGSwRLea+i9ht5r6L2G3mvovQbvNXivwXsNvdfQew291xgsGSzhvYbea+i9ht5r6L2G3mvwXoP3GrzX0HsNvdfQe43BksES3mvwXoP3GrzX0HsN3muMu1e91+C9Bu81eK/Be40/3uv+NX53QX+817/HMX53QctVW67actWWq7ZcteWqLVdtuWrLVVuu2nLVlqu2XLXlqi1Xbblqy1Vbrtpy1Zartly15aotV225astVW67actWWq7ZcteWq8V5j3ZfovQbvNXivwXsN3mvwXmOxZLGE9xp6r6H3GnqvofcavNfgvQbvNfReQ+819F5jsWSxhPcaeq+h9xp6r6H3GnqvwXsN3mvwXkPvNfReQ+81FksWS3ivofcaeq+h9xp6r6H3GrzX4L0G7zX0XkPvNfReY7FksYT3Gnqvofcaeq+h9xp6r8F7jXUuWecS3mvovQbvNXivwXsN3mvwXoP3GrzX0HtNvdfUe82f71ySP9+5JPVeU+819V7z5/smnD/fuST1XlPvNfVeU+819V5T7zX1XvPnO5fkz3cuSb3X1HtNvdf8+b4J5893Lkm919R7Tb3X1HtNvdfUe0291/xJz5aeLW37vuMk7zV5r8l7Td5r8l6T95q81+S9pt5r6r3mT3m28mxlW/ndypssb/J6k9e2a9u17dp2bbve5PVs17Ndz/Zse363500+b/J5k8+2Z9uz7dn2bGtvsj1be7b2bG1b+93am2xvsr3Jtm1sG9vGtrFt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S++19F6L91q81+K9lt5r6b2W3msFlgSW8F6L91q81+K9lt5r8V4r0ra0DUt4r8V7Ld5r/fFe99/H+vsuqP54r3+PYUxjGa/xGds4xv3Ga9u17dp2bbu2Xduubde2a9u17dn2bHu2Pduebc+2Z9uz7dn2bGvb2ra2rW1rv1v7t6T9W4IlvNfivRbvtXivFVgSWMJ7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6rxVYEljCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91qJJYklvNfSey2919J7Lb3X0nst3mvxXov3Wnqvpfdaeq+VWJJYwnstvdfSey2919J7Lb3X4r1WOpekcwnvtfRei/davNfivRbvtXivxXst3mvpvZbea+m9VjqXpHOJ3mvpvZbea+X1Jp1L9F5L77X0XkvvtfReS++19F4rnUvSuUTvtfReS++18nmTziV6r6X3Wnqvpfdaeq+l91p6r5XOJelcovdaeq/Fey3ea/Fei/davNfivRbvtXivpfdaeq+VWMJ7Lb3X0nstvddKLEks4b2W3mvpvZbea+m9lt5r8V6L91q819J7Lb3X0nutwpLCEt5r6b2W3mvpvZbea+m9Fu+1eK/Fey2919J7Lb3XKiwpLOG9lt5r6b2W3mvpvZbea/Fei/davNfSey2919J7rcISvdfivVY5l+i9VmFJYUlhCe+1eK/Fe60q28rvhiWFJYUlvNcq9yWFJYUlhSWFJbzX4r0W77Xq2fb8blhSWFJYwnutcl9SWFJYUlhSWMJ7Ld5r8V6rnEvKuaSwpLCksIT3WuVcUlhSWFJYUljCey3ea/Feq8a28bthid5r6b0W77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3mtdLLlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaF0sulvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sWSiyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r3Wx5GIJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3mtdLLlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaF0sulvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sWSiyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r/Ww5GEJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3ms9LHlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaD0selvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sOShyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r/Ww5GEJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3ms9LHlYwnst3mvxXov3WnqvxXut5+5V77V4r8V7Ld5r8V7rj/e6f43/2Hbi3/63//D//qd//af/9J//+b/+P//hf/////Ef/6//+d/+y//4p3/5b3/9x//x//33v/+b//yv//TP//xP//d//O//+i//5b/+n//zX//rf/znf/kvf/67f/s//u1/AQ==", + "debug_symbols": "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PMfDnXQPh4c7eLiDhzt4uIOHO3i4g4c75Twv53k5z8t5Xs7zcg9X7tvLfXt9f1c75Twvv9vL93n5Pi/3cOU8L+d5Oc/LeV7O83IPV+7by317XXvlPC+/28v3efk+L/dw5Twv53k5z8t5Xs7z0vNy346HO3i4g4c7eLiDhzt4uIOHO3i4U3peel56joc75R7u88P9ruyVnpee4+FO+T4vPS89Lz0vPcfDHTzcwcOdcg/3+eH+v9Lz0vPSczzcKd/npeel56Xnped4uIOHO3i4U+7hPj/c78pe6XnpOR7ulO/z0vPS89Lz0nM83MHDHTzcKed5Oc9Lz0vPW8/xcKed563nreet563neLiDhzt4uNPu4dp9e+t563nrOR7utO/z1vPW89bz1nM83MHDHTzcafdw7b699bz1vPUcD3fa93nreet563nrOR7u4OEOHu6087yd563nreet53i4087z1vPW89bz1nM83MHDHTzcafdw7b699bz1vPUcD3fa93nreet563nrOR7u4OEOHu60e7h239563nreeo6HO+37vPW89bz1vPUcD3fwcAcPd9o9XLtvbz1vPW89x8Od9n3eet563nreeo6HO3i4g4c77Xd7u29vPW89bz3Hw53xu330fPR89Hz0HA938HAHD3fGPdy4bx89Hz0fPcfDnfF9Pno+ej56PnqOhzt4uIOHO+Mebty3j56Pno+e4+HO+D4fPR89Hz0fPcfDHTzcwcOdcQ837ttHz0fPR8/xcGf8bh89Hz0fPR89x8MdPNzBw51xDzfu20fPR89Hz/FwZ3yfj56Pno+ej57j4Q4e7uDhzriHG/fto+ej56PneLgzvs9Hz0fPR89Hz/FwBw938HBn3MON+/bR89Hz0XM83Bnf56Pno+ej56PneLiDhzt4uDO+z8f3+ej56PnoOR7ujHu40fPV89Xz1XM83MHDHTzcWfdw67599Xz1fPUcD3fWPdzq+er56vnqOR7u4OEOHu6se7h13756vnq+eo6HO+sebvV89Xz1fPUcD3fwcAcPd9Y93LpvXz1fPV89x8MdPNzBwx083Fk9x8OddQ+3vs/xcAcPd/BwBw93/ni4/W/13TP88XD/VmGVVmXVVmP13WUsTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMni4s77P1/c5Hu7g4Q4e7uDhDh7urJ6vnuPhzur56jk/3OWHu3i4i4e7eLjLD3f54S4/3P35en6/eam/KxlHxpFxZBwZX88vHu7i4S4e7vLDXX64yw93f76e329e6u9KxpVxZVwZV8bX84uHu3i4i4e7/HCXH+7yw92fZ6+evXoynownI2SEjLBX4TnCc4TnCBnhfYS9CnuV9iplpIyUkTJSRtqr9BzpOdJzlIzyPspelb0qe1UySkbJKBklo+1Ve472HO05WkZ7H22v2l61vWoZI2NkjIyRMfZqPMd4jvEcI2O8j7VXa6/WXq2MlbEyVsbKWHul50fP8XCXH+7yw11+uHv0/Og5Hu7yw11+uMsPd/nhLj/cxcNdPNzFw11+uMsPd/nh7tHzo+d4uMsPd/nhLj/c5Ye7/HAXD3fxcBcPd/nhLj/c5Ye7R8+PnuPhLj/c5Ye7/HCXH+7yw1083MXDXTzc5Ye7/HCXH+4ePeeHu3i4e1KGnh89P3p+9BwPd/FwFw93T8pI70PPj54fPcfD3VMy9Pzo+dHzo+d4uIuHu3i4e1pGex96fvT86Dke7p6WoedHz4+eHz3Hw1083MXD3TMyxvvQ86PnR8/xcPesDD0/en70/Og5Hu7i4S4e7t7vHu7e77798sNdfrjLD3fxcJcf7vLDXX64yw93+eEuHu7i4S4e7vLDXX64yw93r55fPcfDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9y9en71HA93+eEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cPfq+dVzPNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3avnV8/xcJcf7vLDXX64yw93+eEuHu7i4S4e7vLDXX64yw93r55fPcfDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9y9en71HA93+eEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cPfp+dNzPNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3afnT8/xcJcf7vLDXX64yw93+eEuHu7i4S4e7vLDXX64yw93n54/PcfDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9x9ev70HA93+eEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cPfp+dNzPNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3afnT8/xcJcf7vLDXX64yw93+eEuHu7i4S4e7vLDXX64yw93n54/PcfDXTzcxcNdPNzlh7t4uPtWxsrQczzcxcNdPNz94+F+71/uHw8X/62O1bV6VmGVVmXVVmO13+rIODKOjCPjyDgyjowj48g4Mq6MK+PKuDKujCvjyrgyrowr48l4Mp6MJ8Pv9vB9zg938XAXD3fxcBcPd/FwN/Q89BwPd/nhLj/c5Ye7/HAXD3fxcBcPd/nhLj/c5Ye7oeeh53i4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7uh56HneLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu6Hnoed4uMsPd/nhLj/c5Ye7/HAXD3fDeR7Oczzc5Ye7eLiLh7t4uIuHu3i4i4e7eLjLD3f54S4/3E3neTrP+eEuP9zlh7v5/V3tpvOcH+7yw11+uMsPd/nhLj/c5Ye76TxP5zk/3OWHu/xwN7+/q910nvPDXX64yw93+eEuP9zlh7v8cDed5+k854e7/HAXD3fxcBcPd/FwFw938XAXD3fxcJcf7vLD3dRzPNzlh7v8cJcf7qaep57j4S4/3OWHu/xwlx/u8sNdPNzFw1083OWHu/xwlx/upp6nnuPhLj/c5Ye7/HCXH+7yw1083MXDXTzc5Ye7/HCXH+6mnqee4+EuP9zlh7v8cJcf7vLDXTzcxcNdPNzlh7v8cJcf7qae88NdPNxN5zk/3C09Lz0vPcfDXTzcxcPdcg9X7ttLz0vPS8/xcLd8n5eel56Xnpee4+EuHu7i4W65hyv37aXnpeel53i4W77PS89Lz0vPS8/xcBcPd/Fwt5zn5TwvPS89Lz3Hw91ynpeel56Xnpee4+EuHu7i4W65hyv37fxwlx/u8sNdPNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3dLz0nM83OWHu/xwlx/u8sNdfriLh7t4uIuHu/xwlx/u8sPd0vPSczzc5Ye7/HCXH+7yw11+uIuHu3i4i4e7/HCXH+7yw93S89JzPNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3dbz1nM83OWHu/xwlx/u8sNdfriLh7t4uIuHu/xwlx/u8sPd1vPWczzc5Ye7/HCXH+7yw11+uIuHu3i4i4e7/HCXH+7yw93W89ZzPNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3dbz1nM83OWHu/xwlx/u8sNdfriLh7t4uIuHu/xwlx/u8sPd1vPWczzc5Ye7/HCXH+7yw11+uIuHu3i4i4e7/HCXH+7yw93W89ZzPNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3dbz1nM83OWHu/xwlx/u8sNdfriLh7t4uIuHu/xwlx/u8sPd0fPRczzc5Ye7/HCXH+7yw11+uIuHu3i4i4e7/HCXH+7yw93R89FzPNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3dHz0XM83MXDXTzcxcNdfriLh7vjHo4f7uLhLh7u4uEuHu7+8XD73+q7Z/jj4f5b5Y/VsbpWzyqs0qqs2kpGyigZJaNklIySUTJKRskoGSWjZbSMltEyWkbLaBkto2W0jJExMvxuH9/n/HAXD3fxcBcPd/FwFw93R89Hz/Fwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfri7er56joe7/HCXH+7yw11+uMsPd/FwFw938XCXH+7yw11+uLt6vnqOh7v8cJcf7vLDXX64yw938XAXD3fxcJcf7vLDXX64u3q+eo6Hu/xwlx/u8sNdfrjLD3fxcHed5+s8x8NdfriLh7t4uIuHu3i4i4e7eLiLh7v8cJcf7vLD3XWer/OcH+7yw11+uLv+rrbOc364yw93+eEuP9zlh7v8cJcf7q7zfJ3n/HCXH+7yw931d7V1nvPDXX64yw93+eEuP9zlh7v8cHed5+s854e7/HAXD3fxcBcPd/FwFw938XAXD3fxcJcf7vLD3dVzPNzlh7v8cI8f7v18PX/mpT483OOHe/xwjx/u8cM9friHh3t4uIeHe/xwjx/u8cO9n6/nz7zUh4d7/HCPH+7xwz1+uMcP9/BwDw/38HCPH+7xwz1+uPdz7dWzV0/Gk/FkPBlPxrNXz3M8z/E8R8gI7yPsVdirsFchI2SEjJARMtJepedIz5GeI2Wk95H2Ku1V2quUUTJKRskoGWWvynOU5yjPUTLK+2h71faq7VXLaBkto2W0jLZX7TnGc4znGBnjfYy9Gns19mpkjIyRsTJWxtqr9RzrOdZzrIz1PtZe6Tk/3MPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9w7em5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9w7em5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9w7em5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9w7en70HA/3+OEeP9zjh3v8cI8f7uHhHh7u4eEeP9zjh3v8cO/o+dFzPNzjh3v8cI8f7vHDPX64h4d7eLiHh3v8cI8f7vHDvaPnR8/xcI8f7vHDPX64xw/3+OEeHu7h4R4e7vHDPX64xw/3jp4fPcfDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9y7em5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9y7em5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9y7em5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9y7em5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9y7em5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9y7em5e6sPDPTzcw8M9PNzjh3t4uHdHxsrQczzcw8M9PNz74+H2v9W/e4b3x8P9W43Vv3uG9z5O5r2Pk3nv42Te+ziZ9z5O5r2Pk3nv42Te+ziZ9z5O5r0fGUfGkXFkHBlHxpFxZBwZR8aRcWVcGVfGlXFlXBlXxpVxZVwZfre/7/v88cM9PNzDwz083MPDPTzcMy/1mZf68HCPH+7xwz1+uMcP9/BwDw/38HCPH+7xwz1+uPf03LzUh4d7/HCPH+7xwz1+uMcP9/BwDw/38HCPH+7xwz1+uPf03LzUh4d7/HCPH+7xwz1+uMcP9/BwDw/38HCPH+7xwz1+uPf03LzUh4d7/HCPH+7xwz1+uMcP9/Bwz7zUZ17qw8M9friHh3t4uIeHe3i4h4d7eLiHh3v8cI8f7vHDPfNSn3mpjx/u8cM9frgX39/Vnnmpjx/u8cM9frjHD/f44R4/3OOHe+alPvNSHz/c44d7/HAvvr+rPfNSHz/c44d7/HCPH+7xwz1+uMcP98xLfealPn64xw/38HAPD/fwcA8P9/BwDw/38HAPD/f44R4/3DMv9eHhHj/c44d7/HAv9Ny81IeHe/xwjx/u8cM9frjHD/fwcA8P9/Bwjx/u8cM9frgXem5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9wLPTcv9eHhHj/c44d7/HCPH+7xwz083MPDPTzc44d7/HCPH+6FnvPDPTzcC+c5P9wLPTcv9ZmX+vBwDw/38HAv3cPld9/+Us9Tz81LfXi4l77PU89Tz81LfealPjzcw8M9PNxL93D53be/1PPUc/NSHx7upe/z1PPUc/NSn3mpDw/38HAPD/fSeZ7O89Tz1HPzUh8e7qXzPPU89dy81Gde6sPDPTzcw8O9dA+X4X3oOT/c44d7eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe6nn5qU+PNzjh3v8cI8f7vHDPX64h4d7eLiHh3v8cI8f7vHDvdRz81IfHu7xwz1+uMcP9/jhHj/cw8M9PNzDwz1+uMcP9/jhXuq5eakPD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xwr/S89BwP9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HCv9Lz0HA/3+OEeP9zjh3v8cI8f7uHhHh7u4eEeP9zjh3v8cK/0vPQcD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xwr/S89BwP9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HCv9Ny81IeHe/xwjx/u8cM9frjHD/fwcA8P9/Bwjx/u8cM9frhXem5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9wrPTcv9eHhHj/c44d7/HCPH+7xwz083MPDPTzc44d7/HCPH+61npuX+vBwjx/u8cM9frjHD/f44R4e7uHhHh7u8cM9frjHD/daz81LfXi4xw/3+OEeP9zjh3v8cA8P9/BwDw/3+OEeP9zjh3ut5+alPjzcw8M9PNzDwz1+uIeHe+0ejh/u4eEeHu7h4R4e7v3xcPvf6rtn+OPh/q3Kqq3G6rtn6I+Tef1xMq8/Tub1x8m8ThkpI2WkjJSRMkpGySgZJaNklIySUTJKRsloGS2jZbSMltEyWkbL8Lu9fZ/zwz083MPDPTzcw8M9PNwzL/WZl/rwcI8f7vHDPX64xw/38HAPD/fwcI8f7vHDPX6413puXurDwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/cGz03L/Xh4R4/3OOHe/xwjx/u8cM9PNzDwz083OOHe/xwjx/ujZ6bl/rwcI8f7vHDPX64xw/3+OEeHu6Zl/rMS314uMcP9/BwDw/38HAPD/fwcA8P9/Bwjx/u8cM9frhnXuozL/Xxwz1+uMcP98bf1cxLffxwjx/u8cM9frjHD/f44R4/3DMv9ZmX+vjhHj/c44d74+9q5qU+frjHD/f44R4/3OOHe/xwjx/umZf6zEt9/HCPH+7h4R4e7uHhHh7u4eEeHu7h4R4e7vHDPX64Z17qw8M9frjHD/f44d7ouXmpDw/3+OEeP9zjh3v8cI8f7uHhHh7u4eEeP9zjh3v8cG/13LzUh4d7/HCPH+7xwz1+uMcP9/BwDw/38HCPH+7xwz1+uLd6bl7qw8M9frjHD/f44R4/3OOHe3i4h4d7eLjHD/f44R4/3Fs954d7eLi3znN+uLd6bl7qMy/14eEeHu7h4d66h1v37avnq+fmpT483Fvf56vnq+fmpT7zUh8e7uHhHh7urXu4dd++er56bl7qw8O99X2+er56bl7qMy/14eEeHu7h4d46z9d5vnq+em5e6sPDvXWer56vnpuX+sxLfXi4h4d7eLi37uHWfTs/3OOHe/xwDw/3+OEeP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364+Pl6HualBh4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9c/Hw9D/NSAw8X/HDBDxf8cMEPF/xwgYcLPFzg4YIfLvjhgh8ufp69evbqyQgZISNkhIywV+E5wnOE5wgZ4X2kvUp7lfYqZaSMlJEyUkbaq/Qc5TnKc5SM8j7KXpW9KntVMkpGyWgZLaPtVXuO9hztOVpGex9tr9pejb0aGSNjZIyMkTH2ajzHeI7xHCtjvY+1V2uv1l6tjJWxMlaGnvPDBR4u8HCBhwt+uOCHC364OHpuXmrg4YIfLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww8XRc/NSAw8X/HDBDxf8cMEPF/xwgYcLPFzg4YIfLvjhgh8ujp6blxp4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cHH03LzUwMMFP1zwwwU/XPDDBT9c4OECDxd4uOCHC3644IeLo+fmpQYeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XBw9Ny818HCBhws8XODhgh8u8HBxRsbI0HM8XODhAg8Xfzzc/rf6d88Qfzzcv1VYpVVZtdVY/bvLiPtxMnE/Tibux8nE/TiZuB8nE/fjZOJ+nEzcj5OJ+3EycX9kHBlHxpFxZBwZR8aRcWQcGUfGlXFlXBlXxpVxZXy/2+N+3+fBDxd4uMDDBR4u8HCBhwvzUsO81MDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uLh6bl5q4OGCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MPF1XPzUgMPF/xwwQ8X/HDBDxf8cIGHCzxc4OGCHy744YIfLq6em5caeLjghwt+uOCHC3644IcLPFyYlxrmpQYeLvjhAg8XeLjAwwUeLvBwgYcLPFzwwwU/XPDDhXmpYV5q8MMFP1zww8X7/q4W5qUGP1zwwwU/XPDDBT9c8MMFP1yYlxrmpQY/XPDDBT9cvO/vamFeavDDBT9c8MMFP1zwwwU/XPDDhXmpYV5q8MMFP1zg4QIPF3i4wMMFHi7wcIGHCzxc8MMFP1yYlxp4uOCHC3644IeLp+fmpQYeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XDw9Ny818HDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OHi6bl5qYGHC3644IcLfrjghwt+uMDDBR4u8HDBDxf8cMEPF0/P+eECDxfPec4PF0/PzUsN81IDDxd4uMDDxVsZ3317hJ6HnpuXGni4CN/noeeh5+alhnmpgYcLPFzg4SKOjO++PULPQ8/NSw08XITv89Dz0HPzUsO81MDDBR4u8HARzvNwnoeeh56blxp4uAjneeh56Ll5qWFeauDhAg8XeLiIkBHeh57zwwU/XODhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDRei5eamBhwt+uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxeh5+alBh4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9chJ6blxp4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cBF6nnqOhwt+uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxep56nneLjghwt+uOCHC3644IcLPFzg4QIPF/xwwQ8X/HCRep56jocLfrjghwt+uOCHC364wMMFHi7wcMEPF/xwwQ8Xqeep53i44IcLfrjghwt+uOCHCzxc4OECDxf8cMEPF/xwkXpuXmrg4YIfLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww0XquXmpgYcLfrjghwt+uOCHC364wMMFHi7wcMEPF/xwwQ8XqefmpQYeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XKSem5caeLjghwt+uOCHC3644IcLPFzg4QIPF/xwwQ8X/HBRem5eauDhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDRem5eamBhws8XODhAg8X/HCBh4tyD8cPF3i4wMMFHi7wcPHHw/3dv/zxcPHf6lhdq2cVVmlVVm01Vt9dRqWMlJEyUkbKSBkpI2WkjJRRMkpGySgZJaNklIySUTJKRstoGS2jZfjdXr7P+eECDxd4uMDDBR4u8HBhXmqYlxp4uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxel5+alBh4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9ctJ6blxp4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cNF6bl5q4OGCHy744YIfLvjhgh8u8HBhXmqYlxp4uOCHCzxc4OECDxd4uMDDBR4u8HDBDxf8cMEPF+alhnmpwQ8X/HDBDxft72rmpQY/XPDDBT9c8MMFP1zwwwU/XJiXGualBj9c8MMFP1y0v6uZlxr8cMEPF/xwwQ8X/HDBDxf8cGFeapiXGvxwwQ8XeLjAwwUeLvBwgYcLPFzg4QIPF/xwwQ8X5qUGHi744YIfLvjhovXcvNTAwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4vRc/NSAw8X/HDBDxf8cMEPF/xwgYcLPFzg4YIfLvjhgh8uRs/NSw08XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uBg954cLPFyM85wfLkbPzUsN81IDDxd4uMDDxbiHG/fto+ej5+alBh4uxvf56PnouXmpYV5q4OECDxd4uBj3cOO+ffR89Ny81MDDxfg+Hz0fPTcvNcxLDTxc4OECDxfjPB/n+ej56Ll5qYGHi3Gej56PnpuXGualBh4u8HCBh4txDzfu2/nhgh8u+OECDxf8cMEPF/xwwQ8X/HCBhws8XODhgh8u+OGCHy5Wz81LDTxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364WD03LzXwcMEPF/xwwQ8X/HDBDxd4uMDDBR4u+OGCHy744WL13LzUwMMFP1zwwwU/XPDDBT9c4OECDxd4uOCHC3644IeL1fPVczxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364WD1fPcfDBT9c8MMFP1zwwwU/XODhAg8XeLjghwt+uOCHi9Xz1XM8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uFg9Xz3HwwU/XPDDBT9c8MMFP1zg4QIPF3i45IdLfrjkh8ufr+dpXmri4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw+XP1/M0LzXxcMkPl/xwyQ+X/HDJD5d4uMTDJR4u+eGSHy754fLn2atnr56MJ+PJeDKejGevnucIzxGeI2SE9xH2KuxV2KuQETJCRspIGWmv0nOk50jPkTLS+0h7lfaq7FXJKBklo2SUjLJX5TnKc5TnaBntfbS9anvV9qpltOdoz9Geo2WMjJExMsZzjOcYGeM5fnu+/63+3TPkHw/332p/rI7VtXpWYZVWZdVWMj5OJs/HyeT5OJk8HyeT5+Nk8nycTJ6Pk8nzcTJ5Pk4mz8fJ5PmRcWQcGUfGkXFkHBlHxpFxZBwZV8aV8f1uz/N9nyc/XOLhEg+XeLjEwyUeLs1LTfNSEw+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnh8ui5eamJh0t+uOSHS3645IdLfrjEwyUeLvFwyQ+X/HDJD5dHz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364PHpuXmri4ZIfLvnhkh8u+eGSHy7xcGleapqXmni45IdLPFzi4RIPl3i4xMMlHi7xcMkPl/xwyQ+X5qWmeanJD5f8cMkPl+f7u1qal5r8cMkPl/xwyQ+X/HDJD5f8cGleapqXmvxwyQ+X/HB5v7+rpXmpyQ+X/HDJD5f8cMkPl/xwyQ+X5qWmeanJD5f8cImHSzxc4uESD5d4uMTDJR4u8XDJD5f8cGleauLhkh8u+eGSHy6vnpuXmni45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xwefXcvNTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8ur5+alJh4u+eGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9cXj3nh0s8XF7nOT9cXj03LzXNS008XOLhEg+Xd2Ws96HnV8/NS008XL7v+zyfnj89Ny81zUtNPFzi4RIPl++7h8v33bfn0/On5+alJh4u35Gh50/PzUtN81ITD5d4uMTD5XOeP+f50/On5+alJh4un/P86fnTc/NS07zUxMMlHi7xcPmejO++Pfnhkh8u+eESD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy6fnpuXmni45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xw+fTcvNTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8un5+alJh4u+eGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9cPj1/eo6HS3645IdLfrjkh0t+uMTDJR4u8XDJD5f8cMkPl6Hnoed4uOSHS3645IdLfrjkh0s8XOLhEg+X/HDJD5f8cBl6HnqOh0t+uOSHS3645IdLfrjEwyUeLvFwyQ+X/HDJD5eh56HneLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HAZem5eauLhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLDZei5eamJh0t+uOSHS3645IdLfrjEwyUeLvFwyQ+X/HDJD5eh5+alJh4u+eGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9chp6bl5p4uOSHS3645IdLfrjkh0s8XOLhEg+X/HDJD5f8cJl6bl5q4uGSHy754ZIfLvnhkh8u8XCJh0s8XPLDJT9c8sNl6rl5qYmHSzxc4uESD5f8cImHy3QPxw+XeLjEwyUeLvFw+cfD7X+r757hj4f7txqr754hP04m8+NkMj9OJvPjZDI/Tibz42QyQ0bICBkhI2WkjJSRMlJGykgZKSNlpIySUTJKRskoGSWjZJSMklEy/G5P3+f8cImHSzxc4uESD5d4uDQvNc1LTTxc8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Rz81ITD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy5Lz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364LD03LzXxcMkPl/xwyQ+X/HDJD5d4uDQvNc1LTTxc8sMlHi7xcImHSzxc4uESD5d4uOSHS3645IdL81LTvNTkh0t+uOSHywp75Tznh0t+uOSHS3645IdLfrjkh0vzUtO81OSHS3645IfLKnvlPOeHS3645IdLfrjkh0t+uOSHS/NS07zU5IdLfrjEwyUeLvFwiYdLPFzi4RIPl3i45IdLfrg0LzXxcMkPl/xwyQ+XpefmpSYeLvnhkh8u+eGSHy754RIPl3i4xMMlP1zywyU/XLaem5eaeLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HDZem5eauLhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLDZes5P1zi4bKd5/xw2XpuXmqal5p4uMTDJR4u2z1cu29vPW89Ny818XDZvs9bz1vPzUtN81ITD5d4uMTDZbuHa/ftreet5+alJh4u2/d563nruXmpaV5q4uESD5d4uGzneTvPW89bz81LTTxctvO89bz13LzUNC818XCJh0s8XLZ7uHbfzg+X/HDJD5d4uOSHS3645IdLfrjkh0s8XOLhEg+X/HDJD5f8cDl6bl5q4uGSHy754ZIfLvnhkh8u8XCJh0s8XPLDJT9c8sPl6Ll5qYmHS3645IdLfrjkh0t+uMTDJR4u8XDJD5f8cMkPl6Pn5qUmHi754ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1yOno+e4+GSHy754ZIfLvnhkh8u8XCJh0s8XPLDJT9c8sPl6PnoOR4u+eGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9cjp6PnuPhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLD5ej56DkeLvnhkh8u+eGSHy754RIPl3i4xMMlP1zywyU/XI6em5eaeLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HC5em5eauLhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLD5eq5eamJh0t+uOSHS3645IdLfrjEwyUeLvFwyQ+X/HDJD5er5+alJh4u+eGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9crp6bl5p4uOSHS3645IdLfrjkh0s8XOLhEg+X/HDJD5f8cLl6bl5q4uESD5d4uMTDJT9c4uFy3cPxwyUeLvFwiYdLPFz+8XD73+q7Z/jj4f6tyqqtxuq7Z1iczOJkFiezOJnFySxOZnEyi5NZnMx+nEz9fJxM/XycTP18nEz9fJxM/XycTP18nEz9fJxM/XycTP18nEz9/Mg4Mo6MI+PIODKOjCPjyPh+t9fP931e/HCFhys8XOHhCg9XeLgyL7XMSy08XPHDFT9c8cMVP1zh4QoPV3i44ocrfrjih6uf5znCc4SMkBEyQkbI+HpeeLjCwxUervjhih+u+OHq5+t5mZdaeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HD1U/aq7FXJaBkto2W0jLZX7Tnac7TnaBntfYy9Gns19mpkjIyRMTJGxtir8RzrOdZzrIz1PtZerb1ae7UyVsb3fV78cMUPV/xwxQ9X5qWWeanFD1f8cMUPV+f7u1qZl1r8cMUPV/xwxQ9X/HDFD1f8cGVeapmXWvxwxQ9XeLjCwxUervBwhYcrPFzh4QoPV/xwxQ9X5qUWHq744Yofrvjh6ui5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1dHz81LLTxc8cMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364OnpuXmrh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw9XRc364wsPVGRl6fvTcvNQyL7XwcIWHKzxcnZWx3oeeHz03L7XwcHVWhp4fPTcvtcxLLTxc4eEKD1f3u4er+92319Xzq+fmpRYeru6RoedXz81LLfNSCw9XeLjCw9V1nl/n+dXzq+fmpRYerq7z/Or51XPzUsu81MLDFR6u8HB1n4zvvr344YofrvjhCg9X/HDFD1f8cMUPV/xwhYcrPFzh4Yofrvjhih+urp6bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cHX13LzUwsMVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oerq+fmpRYervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XF09v3qOhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1dPz5+e4+GKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV0/On53i44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xw9fT86Tkervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XD09Ny+18HDFD1f8cMUPV/xwxQ9XeLjCwxUervjhih+u+OHq6bl5qYWHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV0/PzUstPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrh6em5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHDVei5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1eh5+alFh6u8HCFhys8XPHDFR6u4srwfY6HKzxc4eEKD1d/PNz+t/ruGf54uH+rsEqrsmqrsfruMuLjZCo+TqYiZISMkBEyQkbICBkhI2WkjJSRMlJGykgZKSNlpIySUTJKRskoGSXD7/bwfc4PV3i4wsMVHq7wcIWHK/NSy7zUwsMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364Cj03L7XwcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744Sr13LzUwsMVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oer1HPzUgsPV/xwxQ9X/HDFD1f8cIWHK/NSy7zUwsMVP1zh4QoPV3i4wsMVHq7wcIWHK3644ocrfrgyL7XMSy1+uOKHK364yrBXznN+uOKHK3644ocrfrjihyt+uDIvtcxLLX644ocrfrjKtFfOc3644ocrfrjihyt+uOKHK364Mi+1zEstfrjihys8XOHhCg9XeLjCwxUervBwhYcrfrjihyvzUgsPV/xwxQ9X/HCVem5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHDVeq5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1el5+alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9clZ7zwxUersp5zg9XpefmpZZ5qYWHKzxc4eGq3MOV+/bS89Jz81ILD1fl+7z0vPTcvNQyL7XwcIWHKzxclXu4ct9eel56bl5q4eGqfJ+Xnpeem5da5qUWHq7wcIWHq3Kel/O89Lz03LzUwsNVOc9Lz0vPzUst81ILD1d4uMLDVbmHK/ft/HDFD1f8cIWHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV6Xn5qUWHq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cMVP1y1npuXWni44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xw1XpuXmrh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw1Xrees5Hq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cMVP1y1nree4+GKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cNV63nrOR6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9ctZ63nuPhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHDVeu5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1ej5+alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9cjZ6bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cDV6bl5q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV6Ll5qYWHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV6Pn5qUWHq7wcIWHKzxc8cMVHq7GPRw/XOHhCg9XeLjCw9UfD/d3//LHw8V/q2N1rZ5VWKVVWbXVWH13GbMyVsbKWBkrY2WsjJWxMnAyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJ4OFqfZ/zwxUervBwhYcrPFzh4cq81DIvtfBwxQ9X/HDFD1f8cIWHKzxc4eGKH6744YofrlbPzUstPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrhaPTcvtfBwxQ9X/HDFD1f8cMUPV3i4wsMVHq744YofrvjhavXcvNTCwxU/XPHDFT9c8cMVP1zh4cq81DIvtfBwxQ9XeLjCwxUervBwhYcrPFzh4Yofrvjhih+uzEst81KLH6744Yofrtbf1cxLLX644ocrfrjihyt+uOKHK364Ni+1zUttfrjmh2t+uP75/q7W5qU2P1zzwzU/XPPDNT9c88M1P1ybl9rmpTY/XPPDNR6u8XCNh2s8XOPhGg/XeLjGwzU/XPPDtXmpjYdrfrjmh2t+uP559urZqyfjyXgynownI+xVeI7wHOE5QkZ4H2Gvwl6FvQoZKSNlpIyUkfYqPUd6jvQcKSO9j7JXZa/KXpWMklEySkbJKHtVnqM9R3uOltHeR9urtldtr1pGy2gZI2NkjL0azzGeYzzHyBjvY+zV2Ku1VytjZayMlbEy1l6t51jPoefnu4fr892399Hzo+fmpTYers/3fd5Hz4+em5fa5qU2Hq7xcI2H63NkfOd5Hz0/em5eauPh+lwZen703LzUNi+18XCNh2s8XJ8r47tvb3645odrfrjGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+uj5+alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cHz03L7XxcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754frouXmpjYdrfrjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/XR8+PnuPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPD9dXzq+d4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cH31/Oo5Hq754Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1xfPb96jodrfrjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/XV8/NS208XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uL56bl5q4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88P11XPzUhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754Zofrq+em5faeLjmh2t+uOaHa3645odrPFzj4RoP1/xwzQ/X/HB99dy81MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH66fn5qU2Hq7xcI2Hazxc88M1Hq7flXFl6DkervFwjYfrPx5u/1v9u2foPx7uv9X7sTpW1+pZhVValVVbyXgyQkbICBkhI2SEjJARMkJGyEgZKSNlpIyUkTJSRspIGSmjZJQMv9tfeeflnes5Hq7xcI2Hazxcm5fa5qU2Hq754Zofrvnhmh+u8XCNh2s8XPPDNT9c88P103PzUhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754Zofrp+em5faeLjmh2t+uOaHa3645odrPFzj4RoP1/xwzQ/X/HAdem5eauPhmh+u+eGaH6754ZofrvFwbV5qm5faeLjmh2s8XOPhGg/XeLjGwzUervFwzQ/X/HDND9fmpbZ5qc0P1/xwzQ/X8eyV85wfrvnhmh+u+eGaH6754Zofrs1LbfNSmx+u+eGaH64j7ZXznB+u+eGaH6754Zofrvnhmh+uzUtt81KbH6754RoP13i4xsM1Hq7xcI2Hazxc4+GaH6754dq81MbDNT9c88M1P1yHnpuX2ni45odrfrjmh2t+uOaHazxc4+EaD9f8cM0P1/xwHXpuXmrj4Zofrvnhmh+u+eGaH67xcI2Hazxc88M1P1zzw3XquXmpjYdrfrjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/Xqef8cI2H63Se88N16rl5qW1eauPhGg/XeLhO93D53bd36nnquXmpjYfr9H2eep56bl5qm5faeLjGwzUertM9XIb3oeep5+alNh6u0/d56nnquXmpbV5q4+EaD9d4uE7neTrPU89Tz81LbTxcp/M89Tz13LzUNi+18XCNh2s8XKd7uGzvQ8/54ZofrvFwzQ/X/HDND9f8cM0P13i4xsM1Hq754ZofrvnhOvXcvNTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vSc/NSGw/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+uS8/NS208XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uC49Lz3HwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vS89JzPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrguPS89x8M1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr0vPSczxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364Lj03L7XxcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754br13LzUxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr1nPzUhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754ZofrlvPzUttPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrhuPTcvtfFwzQ/X/HDND9f8cM0P13i4xsM1Hq754ZofrvnhuvXcvNTGwzUervFwjYdrfrjGw3W7h+OHazxc4+EaD9d4uP7j4fa/1XfP8MfD/VuN1XfP0B8n0/1xMt0fJ9P9cTLdHyfT/XEy3SNjZIyMkbEyVsbKWBkrY2WsjJWxMj5OpufjZHo+Tqbn42R6Pk6m5+Nkej5OpufjZHo+Tqbn42R6fmT43T6+z/nhGg/XeLjGwzUervFwbV5qm5faeLjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/Xo+fmpTYervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XI+em5faeLjmh2t+uOaHa3645odrPFzj4RoP1/xwzQ/X/HA9em5eauPhmh+u+eGaH6754ZofrvFwbV5qm5faeLjmh2s8XOPhGg/XeLjGwzUervFwzQ/X/HDND9fmpbZ5qc0P1/xwzQ/X4+9q5qU2P1zzwzU/XPPDNT9c88M1P1ybl9rmpTY/XPPDNT9cr7+rmZfa/HDND9f8cM0P1/xwzQ/X/HBtXmqbl9r8cM0P13i4xsM1Hq7xcI2Hazxc4+EaD9f8cM0P1+alNh6u+eGaH6754Xr13LzUxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr1XPzUhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754ZofrlfPzUttPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrhePeeHazxcr/OcH65Xz81LbfNSGw/XeLjGw/W6h1v37avnq+fmpTYertf3+er56rl5qW1eauPhGg/XeLhe93Drvn31fL+ej3mpg4ebn+/7fH6+ns/P1/MxL3XMSx083ODhBg83P0fGd57Pz9fz+fl6PualDh5ufo6MI+PIODK+ng8ebvBwg4ebnyvju28ffrjhhxt+uMHDDT/c8MMNP9zwww0/3ODhBg83eLjhhxt+uOGHm5+wV2GvQkbICBkhI2SEvQrPkZ4jPUfKSO8j7VXaq7RXKSNlpIySUTLKXpXnKM9RnqNklPdR9qrsVdurltEyWkbLaBltr9pztOdozzEyxvsYezX2auzVyBgZI2NkjIy1V+s51nOs51gZ632svVp7tfbq+z4ffrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83R8+PnuPhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDzdHzo+d4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cHP03LzUwcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yebo+fmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3Bw9Ny918HDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OHm6Ll5qYOHG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPN0fPzUsdPNzwww0/3PDDDT/c8MMNHm7wcIOHG3644Ycbfri5em5e6uDhBg83eLjBww0/3ODh5h4ZR4ae4+EGDzd4uPnj4fa/1b97hvnj4f6tyqqtxmq/1cfJzP04mbkfJzP342TmPhlPxpPxZDwZT0bICBkhI2SEjJARMkJGyAgZKSNlpIyUkTJSRspIGel9pHde3rme4+EGDzd4uMHDjXmpY17q4OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/cXD03L3XwcMMPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744ebquXmpg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83T8/NSx083PDDDT/c8MMNP9zwww0ebsxLHfNSBw83/HCDhxs83ODhBg83eLjBww0ebvjhhh9u+OHGvNQxL3X44YYfbvjh5j175Tznhxt+uOGHG3644YcbfrjhhxvzUse81OGHG3644YebF/bKec4PN/xwww83/HDDDzf8cMMPN+aljnmpww83/HCDhxs83ODhBg83eLjBww0ebvBwww83/HBjXurg4YYfbvjhhh9unp6blzp4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cPP03LzUwcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yeb0HPzUgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbkLP+eEGDzfhPOeHm9Bz81LHvNTBww0ebvBwE0/Gd98+oeeh5+alDh5uwvd56HnouXmpY17q4OEGDzd4uImQEd6Hnoeem5c6eLgJ3+eh56Hn5qWOeamDhxs83ODhJpzn4TwPPQ89Ny918HATzvPQ89Bz81LHvNTBww0ebvBwEy2jvQ8954cbfrjBww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5vQc/NSBw83/HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9uUs/NSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uEk9Ny918HDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OEm9Tz1HA83/HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9uUs9Tz/Fwww83/HDDDzf8cMMPN3i4wcMNHm744YYfbvjhJvU89RwPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfblLPU8/xcMMPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744Sb13LzUwcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yeb0nPzUgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbkrPzUsdPNzwww0/3PDDDT/c8MMNHm7wcIOHG3644YcbfrgpPTcvdfBwww83/HDDDzf8cMMPN3i4wcMNHm744YYfbvjhpvTcvNTBww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5vSc/NSBw83eLjBww0ebvjhBg835R6OH27wcIOHGzzc4OHmj4fb/1bfPcMfD/dvFVZpVVZtNVbfXUZ9nMzUx8lMjYyRMTJGxsgYGSNjZKyMlbEyVsbKWBkrY2WsjI+Tmf44memPk5n+OJnpj5OZ/jiZ6Y+TGTzctO9zfrjBww0ebvBwg4cbPNyYlzrmpQ4ebvjhhh9u+OGGH27wcIOHGzzc8MMNP9zww03ruXmpg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83refmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3LSem5c6eLjhhxt+uOGHG3644YcbPNyYlzrmpQ4ebvjhBg83eLjBww0ebvBwg4cbPNzwww0/3PDDjXmpY17q8MMNP9zww037u5p5qcMPN/xwww83/HDDDzf8cMMPN+aljnmpww83/HDDDzft72rmpQ4/3PDDDT/c8MMNP9zwww0/3JiXOualDj/c8MMNHm7wcIOHGzzc4OEGDzd4uMHDDT/c8MONeamDhxt+uOGHG364GT03L3XwcMMPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744Wb03LzUwcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yeb0XPzUgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbkbP+eEGDzfjPOeHm9Fz81LHvNTBww0ebvBwM+7hxn376PnouXmpg4eb8X0+ej56bl7qmJc6eLjBww0ebsY93LhvHz0fPTcvdfBwM77PR89Xz81LHfNSBw83eLjBw806z9d5vnq+em5e6uDhZp3nq+er5+aljnmpg4cbPNzg4Wbdw637dn644YcbfrjBww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5vVc/NSBw83/HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9uVs/NSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uFk9Ny918HDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OFm9Xz1HA83/HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9uVs9Xz/Fwww83/HDDDzf8cMsPt3i4xcMtHm754ZYfbvnh9ufr+f58PV883PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uP35er4/X88XD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25/nr169urJeDKejJARMsJehecIzxGeI2SE9xH2KuxV2quUkTJSRspIGWmv0nOk50jPUTLK+yh7Vfaq7FXJKBklo2SUjLZX7Tnac7TnaBntfbS9anvV9qpljIyRMTJGxtir8RzjOcZzjIzxPtZerb1ae7UyVsbKWBkrY+2VnuPhFg+3/HDLD7f8cHv03LzUxcMtHm7xcIuHW364xcPtOTKODD3Hwy0ebvFw+8fD7d/q/rtn2D8e7t/qWj2rsEqrsmqrsdpv9WQ8GU/Gk/FkPBlPxpPxZDwZISNkhIyQETJCRsgIGSEjZKSMlJEyUkZ6H+mdp3eu53i4xcMtHm7xcGte6pqXuni45Ydbfrjlh1t+uMXDLR5u8XDLD7f8cMsPt0fPzUtdPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645Ydbfrg9em5e6uLhlh9u+eGWH2754ZYfbvFwi4dbPNzywy0/3PLD7dVz81IXD7f8cMsPt/xwyw+3/HCLh1vzUte81MXDLT/c4uEWD7d4uMXDLR5u8XCLh1t+uOWHW364NS91zUtdfrjlh1t+uL3PXjnP+eGWH2754ZYfbvnhlh9u+eHWvNQ1L3X54ZYfbvnh9oa9cp7zwy0/3PLDLT/c8sMtP9zyw615qWte6vLDLT/c4uEWD7d4uMXDLR5u8XCLh1s83PLDLT/cmpe6eLjlh1t+uOWH26vn5qUuHm754ZYfbvnhlh9u+eEWD7d4uMXDLT/c8sMtP9xePTcvdfFwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnh9um5eamLh1t+uOWHW3645YdbfrjFwy0ebvFwyw+3/HDLD7dPz/nhFg+3z3nOD7dPz81LXfNSFw+3eLjFw+27Mr779n16/vTcvNTFw+17MvT86bl5qWte6uLhFg+3eLh9ISO8Dz1/em5e6uLh9oUMPX96bl7qmpe6eLjFwy0ebp/z/DnPn54/PTcvdfFw+5znT8+fnpuXuualLh5u8XCLh9tXMsr70HN+uOWHWzzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364fXpuXuri4ZYfbvnhlh9u+eGWH27xcIuHWzzc8sMtP9zyw+3Tc/NSFw+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uQ8/NS1083PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uA09Dz3Hwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9vQ89BzPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645YdbfrgNPQ89x8MtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb0PPQczzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364DT03L3XxcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754Tb03LzUxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb1HPzUhcPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfblPPzUtdPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645YdbfrhNPTcvdfFwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnhNvXcvNTFwy0ebvFwi4dbfrjFw226h+OHWzzc4uEWD7d4uP3j4fa/1XfP8MfD/bfqH6tjda2eVVilVVm1lYyWMTJGxsgYGSNjZIyMkTEyRsbKWBkrY2WsjJWxMlbGyvg4ma2Pk9n6OJnFw235PueHWzzc4uEWD7d4uMXDrXmpa17q4uGWH2754ZYfbvnhFg+3eLjFwy0/3PLDLT/clp6bl7p4uOWHW3645Ydbfrjlh1s83OLhFg+3/HDLD7f8cFt6bl7q4uGWH2754ZYfbvnhlh9u8XCLh1s83PLDLT/c8sNt6bl5qYuHW3645Ydbfrjlh1t+uMXDrXmpa17q4uGWH27xcIuHWzzc4uEWD7d4uMXDLT/c8sMtP9yal7rmpS4/3PLDLT/cVtsr5zk/3PLDLT/c8sMtP9zywy0/3JqXuualLj/c8sMtP9zW2ivnOT/c8sMtP9zywy0/3PLDLT/cmpe65qUuP9zywy0ebvFwi4dbPNzi4RYPt3i4xcMtP9zyw615qYuHW3645YdbfrhtPTcvdfFwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnhtvXcvNTFwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9vWc/NSFw+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uW8/54RYPt+0854fb1nPzUte81MXDLR5u8XDb7uHafXvreeu5eamLh9v2fd563npuXuqal7p4uMXDLR5u2z1cu29vPW89Ny918XDbvs9bz1vPzUtd81IXD7d4uMXD7TjPx3k+ej56bl7q4uF2nOej56Pn5qWueamLh1s83OLhdtzDjft2frjlh1t+uMXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH29Fz81IXD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25Hz81LXTzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364HT03L3XxcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754Xb0fPQcD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25Hz0fP8XDLD7f8cMsPt/xwyw+3eLjFwy0ebvnhlh9u+eF29Xz1HA+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uV89Xz/Fwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnhdvXcvNTFwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9vVc/NSFw+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uV8/NS1083PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uF09Ny918XDLD7f8cMsPt/xwyw+3eLjFwy0ebvnhlh9u+eF29dy81MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh9vPD/f/v6r96/nv6lhdq/8yflfhf0ursmr/v/G/yTgy/vX8d3WtZPw7z39X+Xf/8rv6757hd9VWY7Xf6h8n87s6VtfqWYVVWsm4Mq6MK+PJeDKejCfjyXgynown48l4MkJGyAgZISNkhIyQETJCRshI7yO98/TO0/tI7+Nfz39XZeWdp3ee3nnJKO+8vPOSUTJKRskoGSWjZLSM9hztOVpGy2gZLaNl/Ov572q/1b+e/648x8j4d9/+u9KP0Y/Rj5ExMkbGylgZa6/Wc6znWM+xMv7dt/+u7JWeHz3/eLjf1bV6VmGVVmXVVmP1PcfR888P97u6Vs8qrGQcGUfGkXFk3B8rz3E9x/UcV8ZNq7Jqq7GS8WQ8GU/Gk/Hs1fMcz3M8z/FkPO8j7FXYq7BXISNkhIyQETLCXoXnSM+RnkPPPz/c78pepb1Ke6XnHw/3u5JRMvT86PnR86PnR88/P9zvyvvQ86PnR88/Hu53JUPPj54fPT96fvT86PnR888P97vyPvT86PnR84+H+13J0POj50fPj54fPT96fvT888P9rrwPPT96fvT84+Hez+eH+10dq2v1rMIqrcqqrb6M6zy/en71/Or5dZ5f5/nV86vnV8+vnl89v3p+9fxeGfdZhVValZWMK0PPr55fPb96fvX86vnV8/tkvLayV3p+9fzj4X5XMvT86vnV86vnV8+vnl89v87z6zy/en71/Or5dZ5f5/nV86vnV8+vnl89v3p+9fyWjPI+9Pzq+dXzj4f7/6pl6PnV86vnV8+vnl89v3r++eF+V96Hnl89v3r+8XC/Kxl6fvX86vnV86vnV8+vnn9+uN+V96HnV8+vnn883O9Khp4/PX96/vT86fnT86fnz+/2zw/3uxqrb6+enj+/25/f7U/Pn54/PX96/vT86fnT888P97s6VtfqWYWVjCtDz5+ePz1/ev70/On50/PPD/e7Sit7pedPzz8e7v+rkKHnT8+fnj89f3r+9Pzp+eeH+115H3r+9Pzp+fO7/fnd/vT86fnT86fnT8+fnj89//xwvyvvQ8+fnj89f363f36435UMPX96/vT86fnT86fnnx/ud+V96PnT86fnz+/2zw/3u5Kh50/Pn54/PX96/vT888P9rrwPPX96/vT8+d3++eF+VzL0/Ol56Hnoeeh56Hn4Pg/f56Hnoeeh5+F3++eH+13J0PPQ89Dz0PPQ89Dzzw/3u/reR+h56Hnoefjd/vnhflcy9Dz0PPQ89Dz0PPT888P9rp6VvdLz0PPwu/3zw/2uZOh56Hnoeeh56Hno+eeH+115H3oeeh56Hn63h56H8zyc56Hn4Xd7pAzf56Hnoeeh5+E8/+Ph9r/Vd8/wx8P9W5VVW43Vd88Q/WN1rK7Vs5LRMlpGy2gZLWNkjIyRMTJGxsgYGSNjZIyMlbEyVsbKWBkrY2WsDL/bw/d5+j5PPU89Tz1P53k6z1PPU89Tz1PPPz/c70qGnqeep56nnn9+uN+VDD1PPU89T7/b0/d56nnqeep56nnqeep56vnnh/tdHatr9azCSobv89Tz1PPU89Tz1PPU89Tzzw/3u0ore6Xnqefpd3v6Pk89//xwvysZzvPU83Sep/M89Tzdw6V7uI+H+13ZK7/b0/d5+j5P93DpPE/neTrP03mezvN0D/f54X5X9qrtlfM8/W5P3+fp+zzdw6XzPJ3n6TxP53k6z9M93OeH+13Zq7FXzvP0uz19n6fv83QPl87zdJ6n8zyd5+k8Lz0v9+3lvv3j4X5XYZX+27Jqq7GSoeel56XnpeflHu7zw/2uyqqtxkqG7/PS89Lz0vPS89Lz0vPS83IP9z+e7i23khwJguiWxHgwGPvf2IzUleePaKDgSGY7eJMyWHx+uP+v9Pzq+dXz63f79X1+9fzq+dXzq+dXz6+eXz2/7uE+P9zvyl7p+dXz63f79X1+9fzq+dXzq+dXz6+eXz2/zvPrPL96fvX86vl1nl/n+dXzq+dXz6+eXz2/en71/LqHu+7br55fPb96fv1uv77Pr55fPb96fvX86vnV86vn1z3cdd9+9fzq+dXz63f79X1+9fzq+dXzq+dXz6+eXz2/zvPrPB89Hz0fPR/n+TjPR89Hz0fPR89Hz0fPR8/HPdy4bx89Hz0fPR+/28f3+ej56Pno+ej56Pno+ej5uIcb9+2j56Pno+fjd/v4Ph89Hz0fPR89Hz0fPR89H/dw47599Hz0fPR8/G4f3+ej56Pno+ej56Pno+ej5+N3+7hvHz0fPR89H7/bx+/20fPR89Hz0fPR89Hz0fNxDzfu20fPR89Hz8f3+fg+Hz0fPR89Hz0fPR89Hz0f93Djvn30fPR89Hx8n4/v89Hz0fPR89Hz0fPR89HzcQ837ttHz0fPn54/v9uf3+1Pz5+ePz1/ev70/On50/PnHu65b396/vT86fnzu/35Pn96/vT86fnT86fnT8+fnj/3cM99+9Pzp+dPz5/f7c/3+dPzp+dPz5+ePz1/ev70/LmHe+7bn54/PX96/vxuf77Pn54/PX96/vT86fnT86fnz/f5833+9Pzp+dPz53f7cw/39Pzp+dPzp+dPz5+ePz1/7uGe+/an50/Pn54/v9ufe7in50/Pn54/PX96/vT86flzD/fctz89f3r+9Pz53f7cwz09f3r+9Pzp+dPzp+dPz597uOe+/en50/On58/v9tXzdZ6v83z1fP1uX/dw6/t89Xz1fPV8ned/PNz+t/ruGf54uH+rsmqrazVWz+q7y1iczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJk1u/29X2+vs9Xz1fPV8/Xeb7O89Xz1fPV89Xz1fPV89Xz1fPV89Xzdd++7ttXz1fPV8/X7/b1fb56vnq+er56vnq+er56vu7b13376vnq+er5+t2+vs9Xz1fPV89Xz1fPV89Xz9d9+7pvXz1fPV89X7/b1/f554f7/1+8vvv28/nhfldhlVZl1Vb/Ms7nh/tdPav9Vt95fvBwBw938HAHD3c+P9zv6lqN1bPyHCHju28/nx/ud5VWZSUjZISMkBEy0l6l50jPkZ4jZXz37efzw/2u7FXaq5RRMkpGySgZZa/Kc5TnKM9RMsr7aHvV9qrtVctoGS2jZbSMtlftOa7nuJ7jyrjex7VX115de3VlXBlXxsgYGWOvxnOM5xjPMTLG+xh7Nfbq2asn48l4Mp6MJ+PZq+c5nud4nmNlrPex9mrt1dqrlbEyVsbK0POj53i4g4c7eLjz+eF+V211rcbqWck4MvT86PnR86PneLiDhzt4uHOOjO++/Rw9P3p+9BwPd07I0POj50fPj57j4Q4e7uDhzkkZ3337OXp+9PzoOR7unJSh50fPj54fPcfDHTzcwcOdUzLK+9Dzo+dHz/Fw57QMPT96fvT86Dke7uDhDh7unCvjeh96fvT86Dke7nx+uN+VDD0/en70HA938HAHD3c+P9zvyvvQ86PnR8/xcOfzw/2uZOj50fOj53i4g4c7eLjz+eF+V96Hnh89P3qOhzufH+53JUPPj54fPcfDHTzcwcOdzw/3u0qrsmqrazX+7bOSoeeh56HneLiDhzt4uPP54X5XY/Wsvr0KPcfDnc8P97uSoeeh56HneLiDhzt4uPP54X5Xx8pe6XnoOR7ufH6435UMPQ89Dz3Hwx083MHDnc8P97vyPvQ89Dz0HA93Pj/c70qGnoeeh57j4Q4e7uDhzueH+115H3oeeh56joc7nx/udyVDz0PPQ8/xcAcPd/Bw5/PD/a68Dz0PPQ89x8Odzw/3u5Kh56Hnoed4uIOHO3i48/nhflfeh56Hnoee4+HO54f7XcnQ89Dz0HM83MHDHTzc+fxwv6tjFVZpVVbt316rsXpWMvQcD3fwcAcPdz4/3O+qra7VWD0rGSFDz1PPU89Tz/FwBw938HDn88P9rr73kXqeep56joc7nx/udyVDz1PPU8/xcAcPd/Bw5/PD/a68Dz1PPU89x8MdPNzBwx083Ek9x8OdbBktQ8/xcAcPd/Bw54+H27/V/XfPcP54uH+rsEqrsmqrazVWz2q/1cgYGSNjZIyMkTEyRsbIGBlPxpPxZDwZT8aT8WQ8GU/Gk7EyVsbKWBl+t+d65+ud6zke7uDhDh7u4OFO6XnpOR7ulJ6Xnpeel57j4Q4e7uDhzueH+13J0PPS89JzPNwp3+el56Xnpeel53i4g4c7eLjz+eF+V2P1rL5+lJ7j4U75Pi89Lz0vPS89x8MdPNzBw53PD/e7Olb2Ss9Lz/Fwp3yfl55/frjflQznOR7ulPO8nOd4uPP54X5X9qrtlfMcD3fwcAcPd/Bwp5zn5Twv53k5z8t5/vnhflfex9irsVfO8/K7vXyfl+/zzw/3u5LhPC/neTnPy3n++eF+V97Hs1fPXjnPy+/28n1evs8/P9zvSobzvJzn5Twv53np+eeH+13Zq+/vagcPd/BwBw938HAHD3fwcKf1vPW89RwPd9o93OeH+12FVVqVlQzf563nreet563neLiDhzt4uNPu4T4/3O/qWo3Vs5Lh+7z1vPW89bz1HA938HAHD3faPdznh/v/Ss9bz1vP8XCnfZ+3nreet563nuPhDh7u4OFOO8/bed563nreeo6HO+08bz1vPW89bz3Hwx083MHDnXYP19f70PPW89ZzPNxp3+et563nreet53i4g4c7eLjT7uH6eR963nreeo6HO+37vPW89bz1vPUcD3fwcAcPd9p53s7z1vPW89ZzPNy5zvOr51fPr55fPcfDHTzcwcOd6x7uum+/en71/Oo5Hu5c3+dXz6+eXz2/eo6HO3i4g4c71z3cdd9+9fzq+dVzPNy5vs+vnl89v3p+9RwPd/BwBw93rnu467796vnV86vneLhzfZ9fPb96fvX86jke7uDhDh7uXL/br/v2q+dXz6+e4+HO9bv96vnV86vnV8/xcAcPd/Bw57qHu+7br55fPb96joc71/f51fOr51fPr57j4Q4e7uDhznUPd923Xz2/en71HA93ru/zq+dXz6+eXz3Hwx083MHDnese7rpvv3p+9fzqOR7uXL/br56Pno+ej57j4Q4e7uDhzriHG/fto+ej56PneLgzvs9Hz0fPR89Hz/FwBw938HBn3MON+/bR89Hz0XM83Bnf56Pno+ej56PneLiDhzt4uDPu4cZ9++j56PnoOR7ujO/z0fPR89Hz0XM83MHDHTzcGd/n4/t89Hz0fPQcD3fGPdzo+ej56PnoOR7u4OEOHu6Me7hx3z56Pno+eo6HO+MebvR89Hz0fPQcD3fwcAcPd8Y93LhvHz0fPR89x8OdcQ83ej56Pno+eo6HO3i4g4c74x5u3LePno+ej57j4Q4e7uDhDh7ujJ7j4c5zD/d8n+PhDh7u4OEOHu788XD73+q7Z/jj4f5bnR+rYxVWaVVWbXWtxkrGkREyQkbICBkhI2SEjJARMkJGykgZKSNlpIyUkTJSRspIGSWjZPjd/nyfP9/neLiDhzt4uIOHO3i48/T86Tke7jw9f3r+9PzpOR7u4OEOHu489+3PffvT86fnT8/xcOf5Pn96/vT86fnTczzcwcMdPNx57tuf+/an50/Pn57j4c7zff70/On50/On53i4g4c7eLjz3Lc/9+1Pz5+ePz3Hw53n+/zp+XPf/pznz3mOhzvrPF/nOR7urHs4PNzBwx083MHDHTzcwcMdPNxZ5/k6z9d5vs7zdZ6ve7h1377u29ff1dZ5vn63r+/z9X2+7uHWeb7O83Wer/N8nefrHm7dt6/79vV3tXWer9/t6/t8fZ+ve7h1nq/zfJ3n6zxf5/nq+bpvx8MdPNzBwx083MHDHTzcwcMdPNxZPV89Xz3Hw511D7f+rrZ6vnq+eo6HO+v7fPV89Xz1fPUcD3fwcAcPd9Y93Pq72ur56vnqOR7urO/z1fPV89Xz1XM83MHDHTzcWfdw6+9qq+er56vneLizvs9Xz1fPV89Xz/FwBw938HDBDxf8cMEPFz9fz4MfLvBw8fOd58EPFz9fz+Obl/r/1dfzwMMFHi7wcPFzZHz37fHz9Tx+vp7HNy/1dyUjZISMkBEyvp4HHi7wcIGHi5+Q8d23x0/aq7RXaa9SRspIGSkjZaS9Ss9RnqM8R8ko76PsVdmrslclo2SUjJbRMtpetedoz9Geo2W099H2qu3VtVdXxpVxZVwZV8a1V9dzXM9xPcfIGO9j7NXYq7FXI2NkjIyRMTKevXqe43mO5zmejOd9PHv17NWzV0/GylgZK2NlrL1az7GeYz3Hyvju24MfLo6eHz3HwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4uj50fP8XDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OHi6PnRczxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364OHp+9BwPF/xwwQ8X/HDBDxf8cIGHCzxc4OGCHy744YIfLo6eHz3HwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4uj50fP8XDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OHi6PnRczxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364OHoeeo6HC3644IcLfrjghwt+uMDDBR4u8HDBDxf8cMEPF6Hnoed4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cBF6HnqOhwt+uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxeh56HneLjAwwUeLvBwwQ8XeLiIktEy9BwPF3i4wMPFHw+3/63+3TPEHw/3b/Ws9lt9nEzEx8lEfJxMxMfJRHycTMTHyURcGVfGlXFljIyRMTJGxsgYGSNjZIyMkfFkPBlPxpPxZDwZT8aT8WQ8Get9rHe+3rme4+ECDxd4uMDDReh56DkeLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww0Xqeeo5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1yknqee4+GCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MNF6nnqOR4u+OGCHy744YIfLvjhAg8X6TxP5zkeLvjhAg8XeLjAwwUeLvBwgYcLPFzwwwU/XPDDRTrP03nODxf8cMEPF3ntlfOcHy744YIfLvjhgh8u+OGCHy7SeZ7Oc3644IcLfrjIZ6+c5/xwwQ8X/HDBDxf8cMEPF/xwkc7zdJ7zwwU/XODhAg8XeLjAwwUeLvBwgYcLPFzwwwU/XJSe4+GCHy744YIfLkrPS8/xcMEPF/xwwQ8X/HDBDxd4uMDDBR4u+OGCHy744aL0vPQcDxf8cMEPF/xwwQ8X/HCBhws8XODhgh8u+OGCHy5Kz0vP8XDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OGi9JwfLvBwUc5zfrgoPS89Lz3HwwUeLvBwUVfG9T70vPS89BwPF+X7vPS89Lz0vPQcDxd4uMDDRY2M8T70vPS89BwPF+X7vPS89Lz0vPQcDxd4uMDDRTnPy3leel56XnqOh4tynpeel56Xnree4+ECDxd4uGj3cP3dtwc/XPDDBT9c4OGCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MNF63nrOR4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9ctJ63nuPhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDRet56zkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XLSet57j4YIfLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww0Xrees5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1y0nree4+GCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MPF1fOr53i44IcLfrjghwt+uOCHCzxc4OECDxf8cMEPF/xwcfX86jkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XFw9v3qOhwt+uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxdXz6+e4+GCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MPF1fOr53i44IcLfrjghwt+uOCHCzxc4OECDxf8cMEPF/xwcfX86jkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XFw9v3qOhws8XODhAg8X/HCBh4vrHo4fLvBwgYcLPFzg4eKPh9v/Vt89wx8P9291rcbqWX33DPNxMjEfJxPzcTIxHycTc2QcGUfGkXFkHBkhI2SEjJARMkJGyAgZISNkpIyUkTJSRspIGSkjZfjdPr7P+eECDxd4uMDDBR4u8HAxej56jocLfrjghwt+uOCHCzxc4OECDxf8cMEPF/xwMXo+eo6HC3644IcLfrjghwt+uMDDBR4u8HDBDxf8cMEPF6Pno+d4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cDF6PnqOhwt+uOCHC3644IcLfrjAw8U4z8d5jocLfrjAwwUeLvBwgYcLPFzg4QIPF/xwwQ8X/HDxnOfPec4PF/xwwQ8Xz9/VnvOcHy744YIfLvjhgh8u+OGCHy6e8/w5z/nhgh8u+OHi+bvac57zwwU/XPDDBT9c8MMFP1zww8Vznj/nOT9c8MMFHi7wcIGHCzxc4OECDxd4uMDDBT9c8MPF03M8XPDDBT9c8MPF0/On53i44IcLfrjghwt+uOCHCzxc4OECDxf8cMEPF/xw8fT86TkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XDw9f3qOhwt+uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxdPz/nhAg8X6zznh4vV89Xz1XM8XODhAg8X6x5u3bevnq+er57j4WJ9n6+er56vnq+e4+ECDxd4uFj3cOu+ffV89Xz1HA8X6/t89Xz1fPV89RwPF3i4wMPFOs/Xeb56vnq+eo6Hi3Wer56vnq+er57j4QIPF3i4WPdw676dHy744YIfLvBwwQ8X/HDBDxf8cMEPF3i4wMMFHi744YIfLvjhYvV89RwPF/xwwQ8X/HDBDxf8cIGHCzxc4OGCHy744YIfLlbPV8/xcMEPF/xwwQ8X/HDBDxd4uMDDBR4u+OGCHy744WL1fPUcD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy5/vp7nz9fzxMMlP1zywyU/XPLDJT9c4uESD5d4uOSHS3645IfLn6/n+fP1PPFwyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnh8iftVdmrklEySkbJKBllr8pzlOcoz9Ey2vtoe9X2qu1Vy2gZLaNltIxrr67nuJ7jeo4r43of115de3Xt1ZUxMkbGyBgZY6/Gc4znGM8xMsb7ePbq2atnr56MJ+PJeDKejGevnudYz7GeY2Ws97H2au3V2quVsTL0nB8u+eGSHy7xcImHSzxc8sMlP1zyw+XRc/NSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uj56bl5p4uOSHS3645IdLfrjkh0s8XOLhEg+X/HDJD5f8cHn03LzUxMMlHi7xcImHS364xMPlKRklQ8/xcImHSzxc/vFw+9/q3z1D/vFw/1Zl1VbXaqye1X6rj5PJ83Eyea6MK+PKuDKujCvjyrgyRsbIGBkjY2SMjJExMkbGyHgynown48l4Mp6M53087/x553qOh0s8XOLhEg+X5qWmeamJh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HAZem5eauLhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLDZei5eamJh0t+uOSHS3645IdLfrjEwyUeLvFwyQ+X/HDJD5eh5+alJh4u+eGSHy754ZIfLvnhEg+X5qWmeamJh0t+uMTDJR4u8XCJh0s8XOLhEg+X/HDJD5f8cGleapqXmvxwyQ+X/HAZ1145z/nhkh8u+eGSHy754ZIfLvnh0rzUNC81+eGSHy754TLGXjnP+eGSHy754ZIfLvnhkh8u+eHSvNQ0LzX54ZIfLvFwiYdLPFzi4RIPl3i4xMMlHi754ZIfLs1LTTxc8sMlP1zyw2XquXmpiYdLfrjkh0t+uOSHS364xMMlHi7xcMkPl/xwyQ+XqefmpSYeLvnhkh8u+eGSHy754RIPl3i4xMMlP1zywyU/XKaem5eaeLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HCZes4Pl3i4TOc5P1ymnpuXmualJh4u8XCJh8tsGe196HnquXmpiYfLvDL0PPXcvNQ0LzXxcImHSzxc5sgY70PPU8/NS008XObI0PPUc/NS07zUxMMlHi7xcJnO83Sep56nnpuXmni4TOd56nnquXmpaV5q4uESD5d4uKzvHi7ru29Pfrjkh0t+uMTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Jz81ITD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy5Lz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364LD03LzXxcMkPl/xwyQ+X/HDJD5d4uMTDJR4u+eGSHy754bL0vPQcD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy5Lz0vP8XDJD5f8cMkPl/xwyQ+XeLjEwyUeLvnhkh8u+eGy9Lz0HA+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uW89bz/FwyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnhsvXcvNTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vWc/NSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uW8/NS008XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uGw9Ny818XDJD5f8cMkPl/xwyQ+XeLjEwyUeLvnhkh8u+eGy9dy81MTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Zz81ITD5d4uMTDJR4u+eESD5ftHo4fLvFwiYdLPFzi4fKPh/u7f/nj4eq/1bEKq7Qqq7a6VmP1rL67jHtkHBlHxpFxZBwZR8aRcWQcGSEjZISMkBEyQkbICBkhI2SkjJSRMlKG3+3X9zk/XOLhEg+XeLjEwyUeLs1LTfNSEw+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnh8uq5eamJh0t+uOSHS3645IdLfrjEwyUeLvFwyQ+X/HDJD5dXz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364vHpuXmri4ZIfLvnhkh8u+eGSHy7xcGleapqXmni45IdLPFzi4RIPl3i4xMMlHi7xcMkPl/xwyQ+X5qWmeanJD5f8cMkPl+PvaualJj9c8sMlP1zywyU/XPLDJT9cmpea5qUmP1zywyU/XI6/q5mXmvxwyQ+X/HDJD5f8cMkPl/xwaV5qmpea/HDJD5d4uMTDJR4u8XCJh0s8XOLhEg+X/HDJD5fmpSYeLvnhkh8u+eFy9Ny81MTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Fz81ITD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy5Hz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364HD3nh0s8XI7znB8un56bl5rmpSYeLvFwiYfL5x7uuW9/ev703LzUxMPl833+9PzpuXmpaV5q4uESD5d4uHzu4Z779qfnT8/NS008XD7f50/Pn56bl5rmpSYeLvFwiYfL5zx/zvOn50/PzUtNPFw+5/nT86fn5qWmeamJh0s8XOLh8rmHe+7b+eGSHy754RIPl/xwyQ+X/HDJD5f8cImHSzxc4uGSHy754ZIfLp+em5eaeLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HD59Ny81MTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy6fn5qUmHi754ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1yunq+e4+GSHy754ZIfLvnhkh8u8XCJh0s8XPLDJT9c8sPl6vnqOR4u+eGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9crp6vnuPhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLD5er56jkeLvnhkh8u+eGSHy754RIPl3i4xMMlP1zywyU/XK6em5eaeLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HC5em5eauLhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLD5eq5eamJh0t+uOSHS3645IdLfrjEwxUervBwxQ9X/HDFD1c/X8/LvNTCwxU/XPHDFT9c8cMVP1zh4QoPV3i44ocrfrjih6ufr+dlXmrh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw9VP2qu0VykjPUd6jvQcKaNklIySUZ6jPEfJKM/x2/P9b/XvnqH+eLj/Vv1jdazCKq3Kqq2u1VjJaBlXxpVxZVwZV8aVcWVcGVfGlTEyRsbIGBkjY2SMjJExMkbGk/FkPO/jeefPO3/ex/M+nv+vnv+vnne+3vl65ytjvfP1zlfGylgZK0PP+eGKH6744erouXmphYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9XR8/NSy08XPHDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uDp6bl5q4eGKH6744Yofrvjhih+u8HBlXmqZl1p4uOKHKzxc4eEKD1d4uMLDFR6u8HDFD1f8cMUPV+allnmpxQ9X/HDFD1en7dW1V1fGlXFlXBlXxrVX13Ncz3E9x8gY72Ps1dirsVcjY2SMjJExMp69ep7jeY7nOfScH67wcIWHKzxc4eEKD1d4uMLDFR6u+OGKH67MSy08XPHDFT9c8cNV6Ll5qYWHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV6Hn5qUWHq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cMVP1yFnpuXWni44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xwFXrOD1d4uArnOT9chZ6bl1rmpRYervBwhYeraBntfeh56Ll5qYWHq7gy9Dz03LzUMi+18HCFhys8XMWVcb0PPQ89Ny+18HAVI0PPQ8/NSy3zUgsPV3i4wsNVOM/DeR56HnpuXmrh4Sqc56HnoefmpZZ5qYWHKzxc4eEqVsZ6H3rOD1f8cIWHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV6nn5qUWHq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cMVP1ylnpuXWni44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xwlXpuXmrh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw1Xqeeo5Hq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cP9f2Wv9Dz1HA9X/HDFD1f8cMUPV/xwhYcrPFzh4Yofrvjhih+uUs9Tz/FwxQ9X/HDFD1f8cMUPV3i4wsMVHq744YofrvjhKvU89RwPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744YofrkrPzUstPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrgqPTcvtfBwxQ9X/HDFD1f8cMUPV3i4wsMVHq744YofrvjhqvTcvNTCwxU/XPHDFT9c8cMVP1zh4QoPV3i44ocrfrjih6vSc/NSCw9X/HDFD1f8cMUPV/xwhYcrPFzh4Yofrvjhih+uSs/NSy08XPHDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uCo9Ny+18HCFhys8XOHhih+u8HBVT4bvczxc4eEKD1d4uPrj4fa/1XfP8MfD/Vs9q++eoT9OpvrjZKo/Tqb642SqP06m+uNkqj9OpvrjZKo/Tqb6R8aRcWQcGUfGkXFkHBlHxpFxZISMkBEyQkbICBkhI2SEjJDhd3v7PueHKzxc4eEKD1d4uMLDlXmpZV5q4eGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9ctZ6bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cNV6bl5q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cNV67l5qYWHK3644ocrfrjihyt+uMLDlXmpZV5q4eGKH67wcIWHKzxc4eEKD1d4uMLDFT9c8cMVP1yZl1rmpRY/XPHDFT9c3e/vamVeavHDFT9c8cMVP1zxwxU/XPHDlXmpZV5q8cMVP1zxw9X9/q5W5qUWP1zxwxU/XPHDFT9c8cMVP1yZl1rmpRY/XPHDFR6u8HCFhys8XOHhCg9XeLjCwxU/XPHDlXmphYcrfrjihyt+uLp6bl5q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV1XPzUgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744Yofrq6em5daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HB19ZwfrvBwdZ3n/HB19dy81DIvtfBwhYcrPFyNe7hx3z56PnpuXmrh4Wp8n4+ej56bl1rmpRYervBwhYercQ837ttHz0fPzUstPFyN7/PR89Fz81LLvNTCwxUervBwNc7zcZ6Pno+em5daeLga5/no+ei5eallXmrh4QoPV3i4Gvdw476dH6744YofrvBwxQ9X/HDFD1f8cMUPV3i4wsMVHq744YofrvjhavTcvNTCwxU/XPHDFT9c8cMVP1zh4QoPV3i44ocrfrjih6vRc/NSCw9X/HDFD1f8cMUPV/xwhYcrPFzh4Yofrvjhih+uRs/NSy08XPHDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uHp6/vQcD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH66enj89x8MVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oerp+dPz/FwxQ9X/HDFD1f8cMUPV3i4wsMVHq744Yofrvjh6un503M8XPHDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uHp6bl5q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV03PzUgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744Yofrp6em5daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HC1em5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1eq5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1er5+alFh6u8HCFhys8XPHDFR6u1j0cP1zh4QoPV3i4wsPVHw+3/62+e4Y/Hu7f6lqN1bP67hkWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE4GD1fr+5wfrvBwhYcrPFzh4QoPV+allnmphYcrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xwtV/P27zUxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofrn6/nbV5q4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88P1z9fzNi+18XDND9f8cM0P1/xwzQ/XeLg2L7XNS208XPPDNR6u8XCNh2s8XOPhGg/XeLjmh2t+uOaHa/NS27zU5odrfrjmh+uftldtr1pGy2gZV8aVce3V9RzXc1zPcWVc7+Paq2uvxl6NjJExMkbGyBh7NZ5jPMd4jifjeR/PXj179ezVk/FkPBlPxpOx9mo9x3qO9RwrY72PtVdrr9Zefb/bmx+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPD9dFz81IbD9f8cM0P1/xwzQ/X/HCNh2s8XOPhmh+u+eGaH66PnpuX2ni45odrfrjmh2t+uOaHazxc4+EaD9f8cM0P1/xwffScH67xcH1Khp4fPTcvtc1LbTxc4+EaD9enZbT3oedHz81LbTxcn5ah50fPzUtt81IbD9d4uMbD9bkyrveh50fPzUttPFyfkaHnR8/NS23zUhsP13i4xsP1GRnjfej50XPzUhsP1+fJ0POj5+altnmpjYdrPFzj4fqsjPU+9JwfrvnhGg/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+uQ8/NS208XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uA49Ny+18XDND9f8cM0P1/xwzQ/XeLjGwzUervnhmh+u+eE69Ny81MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Dz0HM8XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uA49Dz3HwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vQ89BzPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrgOPQ89x8M1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr1HPzUhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754ZofrlPPzUttPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrhOPTcvtfFwzQ/X/HDND9f8cM0P13i4xsM1Hq754ZofrvnhOvXcvNTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vUc/NSGw/X/HDND9ep5/xwzQ/XeLjGwzUervnhmh+u+eE69dy81MbDNR6u8XCNh2t+uMbDdT4ZT4ae4+EaD9d4uP7j4fa/1b97hv7j4f6tyqqtrtVYPat/dxldHyfT9XEyXR8n0/VxMl0fJ9P1cTJdHyfT9XEyXR8n0/Uj48g4Mo6MI+PIODKOjCPjyDgyQkbICBkhI2SEDL/by/c5P1zj4RoP13i4xsM1Hq7NS23zUhsP1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754br03LzUxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr0nPzUhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754ZofrkvPzUttPFzzwzU/XPPDNT9c88M1Hq7NS23zUhsP1/xwjYdrPFzj4RoP13i4xsM1Hq754Zofrvnh2rzUNi+1+eGaH6754bq/v6u1eanND9f8cM0P1/xwzQ/X/HDND9fmpbZ5qc0P1/xwzQ/X/f1drc1LbX645odrfrjmh2t+uOaHa364Ni+1zUttfrjmh2s8XOPhGg/XeLjGwzUervFwjYdrfrjmh2vzUhsP1/xwzQ/X/HDdem5eauPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPDdeu5eamNh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9et5+alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9ct57zwzUertt5zg/XrefmpbZ5qY2Hazxc4+G63cO1+/ar51fPzUttPFxf3+dXz6+em5fa5qU2Hq7xcI2H6+se7rpvv3p+9dy81MbD9fV9fvX86rl5qW1eauPhGg/XeLi+zvPrPL96fvXcvNTGw/V1nl89v3puXmqbl9p4uMbDNR6ur3u4676dH6754ZofrvFwzQ/X/HDND9f8cM0P13i4xsM1Hq754Zofrvnh+uq5eamNh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9dXz81LbTxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364vnpuXmrj4Zofrvnhmh+u+eGaH67xcI2Hazxc88M1P1zzw/XV89FzPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrgePR89x8M1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr0fPRczxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364Hj0fPcfDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Fz81IbD9f8cM0P1/xwzQ/X/HCNh2s8XOPhmh+u+eGaH65Hz81LbTxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364Hj03L7XxcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754Xr03LzUxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofrp+fmpTYervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XD89Ny+18XCNh2s8XOPhmh+u8XD93MPxwzUervFwjYdrPFz/8XB/9y9/PFz9tzpWYZVWZdVW12qsntV3l/FaRstoGS2jZbSMltEyWkbLuDKujCvjyrgyrowr48q4Mq6MkTEyRsbI8Lv9+T7nh2s8XOPhGg/XeLjGw7V5qW1eauPhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XD89Ny+18XDND9f8cM0P1/xwzQ/XeLjGwzUervnhmh+u+eF69dy81MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Vz81IbD9f8cM0P1/xwzQ/X/HCNh2vzUtu81MbDNT9c4+EaD9d4uMbDNR6u8XCNh2t+uOaHa364Ni+1zUttfrjmh2t+uF5/VzMvtfnhmh+u+eGaH6754Zofrvnh2rzUNi+1+eGaH6754Xr9Xc281OaHa3645odrfrjmh2t+uOaHa/NS27zU5odrfrjGwzUervFwjYdrPFzj4RoP13i45odrfrg2L7XxcM0P1/xwzQ/Xq+fmpTYervnhmh+u+eGaH+7yw1083MXDXTzc5Ye7/HCXH+7+fD2/5qVePNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3Z+v59e81IuHu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfrj7k/Yq7VXKSBkpo2SUjLJX5TnKc5TnKBnlfZS9KnvV9qpltIyW0TJaRtur9hztOdpzXBnX+7j26tqra6+ujCvjyrgyroyxV+M5xnOM5xgZ432MvRp7NfZqZDwZT8aT8WQ8e/U8x/Mcz3M8Gc/7WHu19mrt1cpYGStjZayMtVd6joe7eLjLD3f54S4/3D16bl7qxcNdfrjLD3f54S4/3OWHu3i4i4e7eLjLD3f54S4/3D16bl7qxcNdfrjLD3f54S4/3OWHu3i4i4e7eLjLD3f54S4/3D16bl7qxcNdfrjLD3f54S4/3OWHu3i4i4e7eLjLD3f54S4/3D16fvQcD3f54S4/3OWHu/xwlx/u4uEuHu7i4S4/3OWHu/xw9+j50XM83OWHu/xwlx/u8sNdfriLh7t4uIuHu/xwlx/u8sPdo+dHz/Fwlx/u8sNdfrjLD3f54S4e7uLhLh7u8sNdfrjLD3ePnh89x8NdfrjLD3f54S4/3OWHu3i4i4e7eLjLD3f54S4/3A09Ny/14uEuP9zlh7v8cJcf7vLDXTzcxcNdPNzlh7v8cJcf7oaem5d68XCXH+7yw11+uMsPd/nhLh7u4uEuHu7yw11+uMsPd0PPzUu9eLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu6Hn5qVePNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3dBz81IvHu7yw11+uMsPd/nhLj/cxcNdPNzFw11+uMsPd/nhbui5eakXD3fxcBcPd/Fwlx/u4uFuPBlPhp7j4S4e7uLh7h8Pt/+t/t0z3D8e7r/V/lgdq7BKq7Jqq2s1VjI+Tubmx8nc/DiZmx8nc/PjZG5+nMzNj5O5+XEyNz9O5ubHydz8kXFkHBlHxpFxZBwZR8aRcWQcGSEjZPjdnt/3+eWHu3i4i4e7eLiLh7t4uGte6jUv9eLhLj/c5Ye7/HCXH+7i4S4e7uLhLj/c5Ye7/HA39dy81IuHu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfribem5e6sXDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9xNPTcv9eLhLj/c5Ye7/HCXH+7yw1083DUv9ZqXevFwlx/u4uEuHu7i4S4e7uLhLh7u4uEuP9zlh7v8cNe81Gte6uWHu/xwlx/u5vd3tWte6uWHu/xwlx/u8sNdfrjLD3f54a55qde81MsPd/nhLj/cre/vate81MsPd/nhLj/c5Ye7/HCXH+7yw13zUq95qZcf7vLDXTzcxcNdPNzFw1083MXDXTzcxcNdfrjLD3fNS714uMsPd/nhLj/cLT03L/Xi4S4/3OWHu/xwlx/u8sNdPNzFw1083OWHu/xwlx/ulp6bl3rxcJcf7vLDXX64yw93+eEuHu7i4S4e7vLDXX64yw93S8/NS714uMsPd/nhLj/c5Ye7/HAXD3fxcBcPd/nhLj/c5Ye7pef8cBcPd8t5zg93S8/NS73mpV483MXDXTzcrZWx3oeel56bl3rxcLd9n7eet56bl3rNS714uIuHu3i42+7h+rtvv63nrefmpV483G3f563nrefmpV7zUi8e7uLhLh7utvO8neet563n5qVePNxt53nreeu5eanXvNSLh7t4uIuHu+0err/79ssPd/nhLj/cxcNdfrjLD3f54S4/3OWHu3i4i4e7eLjLD3f54S4/3G09Ny/14uEuP9zlh7v8cJcf7vLDXTzcxcNdPNzlh7v8cJcf7raem5d68XCXH+7yw11+uMsPd/nhLh7u4uEuHu7yw11+uMsPd1vPzUu9eLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu63nred4uMsPd/nhLj/c5Ye7/HAXD3fxcBcPd/nhLj/c5Ye7V8+vnuPhLj/c5Ye7/HCXH+7yw1083MXDXTzc5Ye7/HCXH+5ePb96joe7/HCXH+7yw11+uMsPd/FwFw938XCXH+7yw11+uHv1/Oo5Hu7yw11+uMsPd/nhLj/cxcNdPNzFw11+uMsPd/nh7tVz81IvHu7yw11+uMsPd/nhLj/cxcNdPNzFw11+uMsPd/nh7tVz81IvHu7yw11+uMsPd/nhLj/cxcNdPNzFw11+uMsPd/nh7tVz81IvHu7yw11+uMsPd/nhLj/cxcNdPNzFw11+uMsPd/nh7tVz81IvHu7yw11+uMsPd/nhLj/cxcNdPNzFw11+uMsPd/nh7ui5eakXD3f54S4/3OWHu/xwlx/u4uEuHu7i4S4/3OWHu/xwd/TcvNSLh7t4uIuHu3i4yw938XB33MPxw1083MXDXTzcxcPdPx5u/1t99wx/PNy/1bP67hnm42TufJzMnY+TufNxMnc+TubOx8ncKRklo2SUjJbRMlpGy2gZLaNltIyW0TKujCvjyrgyrowr48q4Mq6MK8Pv9vF9zg938XAXD3fxcBcPd/Fw17zUa17qxcNdfrjLD3f54S4/3MXDXTzcxcNdfrjLD3f54e7ouXmpFw93+eEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cPfpuXmpFw93+eEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cPfpuXmpFw93+eEuP9zlh7v8cJcf7uLhrnmp17zUi4e7/HAXD3fxcBcPd/FwFw938XAXD3f54S4/3OWHu+alXvNSLz/c5Ye7/HD3+buaeamXH+7yw11+uMsPd/nhLj/c5Ye75qVe81IvP9zlh7v8cPf5u5p5qZcf7vLDXX64yw93+eEuP9zlh7vmpV7zUi8/3OWHu3i4i4e7eLiLh7t4uIuHu3i4i4e7/HCXH+6al3rxcJcf7vLDXX64+/TcvNSLh7v8cJcf7vLDXX64yw938XAXD3fxcJcf7vLDXX64u3puXurFw11+uMsPd/nhLj/c5Ye7eLiLh7t4uMsPd/nhLj/cXT03L/Xi4S4/3OWHu/xwlx/u8sNdPNzFw1083OWHu/xwlx/urp7zw1083F3nOT/cXT03L/Wal3rxcBcPd/Fwd93Drfv21fPVc/NSLx7uru/z1fPVc/NSr3mpFw938XAXD3fXPdy6b189Xz03L/Xi4e76Pl89Xz03L/Wal3rxcBcPd/Fwd53n6zxfPV89Ny/14uHuOs9Xz1fPzUu95qVePNzFw1083F33cOu+nR/u8sNdfriLh7v8cJcf7vLDXX64yw938XAXD3fxcJcf7vLDDT/c/Hw9H/NSBw83/HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9ufr6ej3mpg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83P2Gv0l6ljJSRMlJGykh7lZ4jPUd6jpJR3kfZq7JXZa9KRskoGSWjZLS9as/RnqM9R8to76PtVdurtlct48q4Mq6MK+Paq+s5rue4nuPKuN7H2KuxV2OvRsbIGBkjY2SMvRrP8TzH8xxPxvM+nr169urZqyfjyXgyVsbKWHu1nmM9x3qOlbHex9orPTcvdfBwww83/HDDDzf8cMMPN3i4wcMNHm744YYfbvjh5ui5eamDhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzdHz81LHTzc8MMNP9zwww0/3PDDDR5u8HCDhxt+uOGHG364OXpuXurg4YYfbvjhhh9u+OGGH27wcIOHGzzc8MMNP9zww83Rc/NSBw83/HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9ujp6blzp4uMHDDR5u8HDDDzd4uDkjY2ToOR5u8HCDh5s/Hm7/W/27Z5g/Hu7f6lqN1bPab/VxMnM+TmbOx8nM+TiZOStjZayMlbEyPk5m4uNkJj5OZuLjZCY+Tmbi42QmPk5m4uNkJj5OZuLjZCZ+ZBwZR8aRcWQcGUfGkXFkfL/bJ77v8+GHGzzc4OEGDzd4uMHDjXmpY17q4OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/chJ6blzp4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cBN6bl7q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MNN6Ll5qYOHG3644Ycbfrjhhxt+uMHDjXmpY17q4OGGH27wcIOHGzzc4OEGDzd4uMHDDT/c8MMNP9yYlzrmpQ4/3PDDDT/cxNor5zk/3PDDDT/c8MMNP9zwww0/3JiXOualDj/c8MMNP9zk93e1MS91+OGGH2744YYfbvjhhh9u+OHGvNQxL3X44YYfbvBwg4cbPNzg4QYPN3i4wcMNHm744YYfbsxLHTzc8MMNP9zww03quXmpg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83qefmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3KSem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HCTes4PN3i4Sec5P9yknpuXOualDh5u8HCDh5tcGet96HnquXmpg4ebXBl6nnpuXuqYlzp4uMHDDR5u6ruHm/ru26f0vPTcvNTBw035Pi89Lz03L3XMSx083ODhBg835Twv53npeem5eamDh5tynpeel56blzrmpQ4ebvBwg4ebShnfffvwww0/3PDDDR5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/clJ6blzp4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cFN6bl7q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MNN6bl5qYOHG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPN6Xnped4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cNN63nqOhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzet563neLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HDTet56jocbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83refmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3LSem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HDTem5e6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDTeu5eamDhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzdXz81LHTzc8MMNP9zwww0/3PDDDR5u8HCDhxt+uOGHG364uXpuXurg4QYPN3i4wcMNP9zg4ea6h+OHGzzc4OEGDzd4uPnj4fa/1XfP8MfD/VuVVVtdq7F6Vt9dxv04mbkfJzO3ZJSMklEySkbJKBklo2W0jJbRMlpGy2gZLaNltIwr48q4Mq6MK+PK8Lv9+j7nhxs83ODhBg83eLjBw415qWNe6uDhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3Fw9Ny918HDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OFm9Ny81MHDDT/c8MMNP9zwww0/3ODhBg83eLjhhxt+uOGHm9Fz81IHDzf8cMMPN/xwww83/HCDhxvzUse81MHDDT/c4OEGDzd4uMHDDR5u8HCDhxt+uOGHG364MS91zEsdfrjhhxt+uBl/VzMvdfjhhh9u+OGGH2744YYfbvjhxrzUMS91+OGGH2744Wb8Xc281OGHG3644Ycbfrjhhxt+uOGHG/NSx7zU4YcbfrjBww0ebvBwg4cbPNzg4QYPN3i44YcbfrgxL3XwcMMPN/xwww83o+fmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3Iyem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HDz9Ny81MHDDT/c8MMNP9zwww0/3ODhBg83eLjhhxt+uOGHm6fn/HCDh5vnPOeHm6fn5qWOeamDhxs83ODh5rmHe+7bn54/PTcvdfBw83yfPz1/em5e6piXOni4wcMNHm6ee7jnvv3p+dNz81IHDzfP9/nT86fn5qWOeamDhxs83ODh5jnPn/P86fnTc/NSBw83z3n+9PzpuXmpY17q4OEGDzd4uHnu4Z77dn644YcbfrjBww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5un5+alDh5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/crJ6blzp4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cLN6bl7q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MPN6vnqOR5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/crJ6vnuPhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDzer56jkebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3Kyer57j4YYfbvjhhh9u+OGGH27wcIOHGzzc8MMNP9zww83quXmpg4cbfrjhh3v8cI8f7vHDPTzcw8M9PNzjh3v8cI8f7v18PX/mpT483OOHe/xwjx/u8cM9friHh3t4uIeHe/xwjx/u8cO9n6/nz7zUh4d7/HCPH+7xwz1+uMcP9/BwDw/38HCPH+7xwz1+uPeT9irtVcooGSWjZJSMslflOcpzlOcoGeV9tL1qe9X2qmW0jJbRMlpG26v2HNdzXM9xZVzv49qra6+uvboyrue4nmM8x8gYGSNjZIznGM8xMsZz/PZ8/1bv3z3D++Ph/q3CKq3Kqq2u1Vg9q/1WK2NlrIyVsTJWxspYGSvj42Te+TiZdz5O5p2Pk3nn42Te+TiZdz5O5p2Pk3nn42Te+TiZd35kHBlHxpFxZHy/29/5vs8fP9zDwz083MPDPTzcw8M981KfeakPD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe0fPzUt9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe0fPzUt9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe0fPzUt9eLjHD/f44R4/3OOHe/xwDw/3zEt95qU+PNzjh3t4uIeHe3i4h4d7eLiHh3t4uMcP9/jhHj/cMy/1mZf6+OEeP9zjh3tn7dXaq5WxMlbGylgZa6+c5+alPvNSHz/c44d7/HAvvr+rPfNSHz/c44d7/HCPH+7xwz1+uMcP98xLfealPn64xw/38HAPD/fwcA8P9/BwDw/38HAPD/f44R4/3DMv9eHhHj/c44d7/HAv9Ny81IeHe/xwjx/u8cM9frjHD/fwcA8P9/Bwjx/u8cM9frgXem5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9wLPTcv9eHhHj/c44d7/HCPH+7xwz083MPDPTzc44d7/HCPH+6FnvPDPTzcC+c5P9wLPTcv9ZmX+vBwDw/38HAvnoznfeh56Ll5qQ8P92Jl6HnouXmpz7zUh4d7eLiHh3v53cO9/O7bX+p56rl5qQ8P9/L7Pn+p56nn5qU+81IfHu7h4R4e7qXzPJ3nqeep5+alPjzcS+d56nnquXmpz7zUh4d7eLiHh3sZMr779scP9/jhHj/cw8M9frjHD/f44R4/3OOHe3i4h4d7eLjHD/f44R4/3Es9Ny/14eEeP9zjh3v8cI8f7vHDPTzcw8M9PNzjh3v8cI8f7qWem5f68HCPH+7xwz1+uMcP9/jhHh7u4eEeHu7xwz1+uMcP91LPzUt9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe6nnqed4uMcP9/jhHj/c44d7/HAPD/fwcA8P9/jhHj/c44d7peel53i4xw/3+OEeP9zjh3v8cA8P9/BwDw/3+OEeP9zjh3ul56XneLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe6Xnped4uMcP9/jhHj/c44d7/HAPD/fwcA8P9/jhHj/c44d7pefmpT483OOHe/xwjx/u8cM9friHh3t4uIeHe/xwjx/u8cO90nPzUh8e7vHDPX64xw/3+OEeP9zDwz083MPDPX64xw/3+OFe6bl5qQ8P9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HCv9Ny81IeHe/xwjx/u8cM9frjHD/fwcA8P9/Bwjx/u8cM9frhXem5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9xrPTcv9eHhHh7u4eEeHu7xwz083Gv3cPxwDw/38HAPD/fwcO+Ph9v/Vt89wx8P998qf6yOVVilVVm11bUaKxkpo2SUjJJRMkpGySgZJaNklIyW0TJaRstoGS2jZbSMltEyrowrw+/29n3OD/fwcA8P9/BwDw/38HDPvNRnXurDwz1+uMcP9/jhHj/cw8M9PNzDwz1+uMcP9/jhXuu5eakPD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xwr/XcvNSHh3v8cI8f7vHDPX64xw/38HAPD/fwcI8f7vHDPX64d/XcvNSHh3v8cI8f7vHDPX64xw/38HDPvNRnXurDwz1+uIeHe3i4h4d7eLiHh3t4uIeHe/xwjx/u8cM981KfeamPH+7xwz1+uHfTXjnP+eEeP9zjh3v8cI8f7vHDPX64Z17qMy/18cM9frjHD/du2yvnOT/c44d7/HCPH+7xwz1+uMcP98xLfealPn64xw/38HAPD/fwcA8P9/BwDw/38HAPD/f44R4/3DMv9eHhHj/c44d7/HDv6rl5qQ8P9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HDv6rl5qQ8P9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HBv9Ny81IeHe/xwjx/u8cM9frjHD/fwcA8P9/Bwjx/u8cM9frg3es4P9/Bwb5zn/HBv9Ny81Gde6sPDPTzcw8O9cQ837ttHz0fPzUt9eLg3vs9Hz0fPzUt95qU+PNzDwz083Bv3cOO+ffR89Ny81IeHe+P7fPR89Ny81Gde6sPDPTzcw8O9cZ6P83z0fPTcvNSHh3vjPB89Hz03L/WZl/rwcA8P9/Bwb9zDjft2frjHD/f44R4e7vHDPX64xw/3+OEeP9zDwz083MPDPX64xw/3+OHe6Ll5qQ8P9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HDv6bl5qQ8P9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HDv6bl5qQ8P9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HDv6fnTczzc44d7/HCPH+7xwz1+uIeHe3i4h4d7/HCPH+7xw72n50/P8XCPH+7xwz1+uMcP9/jhHh7u4eEeHu7xwz1+uMcP956ePz3Hwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/ce3r+9BwP9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HDv6bl5qQ8P9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HBv9dy81IeHe/xwjx/u8cM9frjHD/fwcA8P9/Bwjx/u8cM9fri3em5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9xbPTcv9eHhHj/c44d7/HCPH+7xwz083MPDPTzc44d7/HCPH+6tnpuX+vBwjx/u8cM9frjHD/f44R4e7uHhHh7u8cM9frjHD/dWz81LfXi4h4d7eLiHh3v8cA8P99Y9HD/cw8M9PNzDwz083Pvj4fa/1XfP8MfD/Vs9q++eYXEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczH6czP58nMz+fJzM/nyczP58nMz+fJzM/nyczP58nMz+fJzM/nyczP78yPh+t+/P932+/HCLh1s83OLhFg+3eLg1L3XNS1083PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9uf9BzpOVJGykgZKSNlfD1fPNzi4RYPt/xwyw+3/HD78/V8zUtdPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645Ydbfrj9aXt17dWVcWVcGVfGlXHt1fUc13NczzEyxvsYezX2auzVyBgZI2NkjIxnr57neJ7jeY4n43kfz149e/Xs1ZOxMlbGylgZa6/Wc6znWM+xMr779uWH2/P9XW3NS11+uOWHW3645Ydbfrjlh1t+uDUvdc1LXX645YdbPNzi4RYPt3i4xcMtHm7xcIuHW3645Ydb81IXD7f8cMsPt/xwe/TcvNTFwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9uj5+alLh5u+eGWH2754ZYfbvnhFg+3eLjFwy0/3PLDLT/cHj03L3XxcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754fboOT/c4uH2jAw9P3puXuqal7p4uMXDLR5uz5PxvA89P3puXuri4fY8GXp+9Ny81DUvdfFwi4dbPNyelbHeh54fPTcvdfFwG9/3+Yaeh56bl7rmpS4ebvFwi4fbcJ6H8zz0PPTcvNTFw204z0PPQ8/NS13zUhcPt3i4xcNthIzvvn354ZYfbvnhFg+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uQ8/NS1083PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uA09Ny918XDLD7f8cMsPt/xwyw+3eLjFwy0ebvnhlh9u+eE29Ny81MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH29Dz0HM83PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uA09Dz3Hwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9vU89RzPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645YdbfrhNPU89x8MtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb1HPzUhcPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfblPPzUtdPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645YdbfrhNPTcvdfFwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnhNvXcvNTFwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9vUc/NSFw+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uS8/NS1083OLhFg+3eLjlh1s83NaR4fscD7d4uMXDLR5u/3i4/W/13TP88XD/VtdqrJ7Vd89QHyez9XEyWx8ns/VxMlspI2WkjJSRMlJGySgZJaNklIySUTJKRskoGS2jZbSMltEyWkbLaBl+t5fvc364xcMtHm7xcIuHWzzcmpe65qUuHm754ZYfbvnhlh9u8XCLh1s83PLDLT/c8sNt6bl5qYuHW3645Ydbfrjlh1t+uMXDLR5u8XDLD7f8cMsPt6Xn5qUuHm754ZYfbvnhlh9u+eEWD7d4uMXDLT/c8sMtP9y2npuXuni45Ydbfrjlh1t+uOWHWzzcmpe65qUuHm754RYPt3i4xcMtHm7xcIuHWzzc8sMtP9zyw615qWte6vLDLT/c8sNtp71ynvPDLT/c8sMtP9zywy0/3PLDrXmpa17q8sMtP9zyw22XvXKe88MtP9zywy0/3PLDLT/c8sOtealrXurywy0/3OLhFg+3eLjFwy0ebvFwi4dbPNzywy0/3JqXuni45Ydbfrjlh9vWc/NSFw+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uW8/NS1083PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uL16bl7q4uGWH2754ZYfbvnhlh9u8XCLh1s83PLDLT/c8sPt1XN+uMXD7XWe88Pt1XPzUte81MXDLR5u8XB73cNd9+1Xz6+em5e6eLi9vs+vnl89Ny91zUtdPNzi4RYPt9c93HXffvX86rl5qYuH2+v7/Or51XPzUte81MXDLR5u8XB7nefXeX71/Oq5eamLh9vrPL96fvXcvNQ1L3XxcIuHWzzcXvdw1307P9zywy0/3OLhlh9u+eGWH2754ZYfbvFwi4dbPNzywy0/3PLD7dVz81IXD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25Hz81LXTzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364HT03L3XxcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754Xb0fPQcD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25Hz0fP8XDLD7f8cMsPt/xwyw+3eLjFwy0ebvnhlh9u+eF29Hz0HA+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uR89Hz/Fwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnhdvTcvNTFwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9un5+alLh5u+eGWH2754ZYfbvnhFg+3eLjFwy0/3PLDLT/cPj03L3XxcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754fbpuXmpi4dbfrjlh1t+uOWHW364xcMtHm7xcMsPt/xwyw+3T8/NS1083PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uH16bl7q4uEWD7d4uMXDLT/c4uH2uYfjh1s83OLhFg+3eLj94+H2v9V3z/DHw/1blVVbXauxelbfXcb7OJl9Hyez78l4Mp6MJ+PJeDKejCdjZayMlbEyVsbKWBkrY2XgZBYnsziZxcksTmZxMouTwcPt+j7nh1s83OLhFg+3eLjFw615qWte6uLhlh9u+eGWH2754RYPt3i4xcMtP9zywy0/3K6em5e6eLjlh1t+uOWHW3645YdbPNzi4RYPt/xwyw+3/HC7em5e6uLhlh9u+eGWH2754ZYfbvFwi4dbPNzywy0/3PLD7eq5eamLh1t+uOWHW3645YdbfrjFw615qWte6uLhlh9u8XCLh1s83OLhFg+3eLjFwy0/3PLDLT/cmpe65qUuP9zywy0/3K6/q5mXuvxwyw+3/HDLD7f8cMsPt/xwa17qmpe6/HDLD7f8cLv+rmZe6n5+uP/ftv/7Pv9dHauwSquyaqtrNVb/Zfyu9lv9u2//XR2rsJJxZBwZR8aR8a/nvyvPEZ4jPEfI+Pd3td9VWbXVtZIRMkJGykgZaa/Sc6TnSM+RMv79Xe13Za/SXpW9Khklo2SUjJJR9qo8R3mO8hwto72Ptldtr9petYyW0TJaRsu49up6jus5rue4Mq73ce3VtVfXXl0ZI2NkjIyRMfZqPMd4jvEcI2O8j2evnr169urJeDKejCfjyXj26nmO9RzrOVbGeh9rr9Zerb1aGStDz4+eHz0/en70/Oj50fPz82Wcn7F6Vt9eHT3/eLjflQw9P3p+9Pzo+dHzo+dHz0/IiGMVVmlVVjJChp4fPT96fvT86PnR86Pnnx/ud9VW9krPj55/PNz/VyVDz4+eHz0/en70/Oj50fPPD/e78j70/Oj50fOPh/tdydDzo+dHz4+eHz0/en70/PPD/a68Dz0/en70/OPhflcy9Pzo+dHzo+dHz4+eHz3//HC/K+9Dz4+eHz3/eLjflQw9P3p+9Pzo+dHzo+dHzz8/3O/K+9Dzo+dHzz8e7nclQ8+Pnh89Dz0PPQ89Dz3//HC/q7a6VmP1rGQcGXoeeh56Hnoeeh56Hnr++eF+V9/7CD0PPQ89/3i435UMPQ89Dz0PPQ89Dz0PPf/8cL+rtLJXeh56/vFwvysZeh56Hnoeeh56Hnoeev754X5X3oeeh56Hnn883O9Khp6Hnoeeh56Hnoeeh55/frjflfeh56HnoecfD/e7kqHnoeeh56Hnoeeh56Hnnx/ud+V96Hnoeej5x8P9f/Vk6Hnoeeh56Hnoeeh56Pnnh/tdeR96Hnoeev7xcL8rGXoeeh56Hnoeep56nnr++eF+V2lVVm11rca/ff7b9xzpPE89T7/b88g4MvQ89Tz1PJ3nfzzc/q3iv3uG39WxCqu0Kqu2ulZj9az2W6WMlJEyUkbKSBkpI2WkjJRRMkpGySgZJaNklIySUTJKRstoGS2jZfjdnu2dt3eu56nnqefpPE/neep56nnqeep56nnqeep56nnqeer554f7XcnQ89Tz1PP0u/3zw/2uZOh56nnqeep56nnq+eeH+12NlX7oeep5+t3++eF+VzL0PPU89Tz1PPU89fzzw/2ujlVYpVVZtX97rcbqWclwnpeel/O8nOel558f7nd1rcbqWcnwfV6+zz8e7nclw3lezvNynpfz/PPD/a6+9/H54X5X9sp5Xn63l+/z8n3++eF+VzKc5+U8L+d5Oc8/P9zvyvsoe1X2ynlefreX7/Pyff754X5XMpzn5Twv53k5z0vPPz/c78petb1ynpeel+/z8n3+8XC/Kxl6Xnpeel56/vnhflfeh56Xnpeel9/t5fu89Lz0vPS89Lz0vPS89Pzzw/2uvA89Lz0vPS+/28v3eel56Xnpeel56Xnpeen554f7XX3vo/W89bz1vP1ub9/nreet563nreet563nreftPG/neet563nreTvP23neet563nreet563nreet7u4TrG6lnZKz1vv9vb93nreet563nreet563nrebuH6/I+9Lz1vPW8/W5v3+et563nreet563nreet5+08b+d563nreet5O8/bed563nreet563nreet563u7h+nofet563nrefre37/PW89bz1vPW89bz1vPW83YP9/nhflf2Ss9bz9vv9vZ93nreet563nreet563nre7uE+P9zvyl7p+dXz63f79X1+9fzq+dXzq+dXz6+eXz2/frdf9+1Xz6+eXz2/frdfv9uvnl89v3p+9fzq+dXzq+fXPdx13371/Or51fPr+/z6Pr96fvX86vnV86vnV8+vnl/3cNd9+9Xzq+dXz6/v8+v7/Or51fOr51fPr55fPb96ft3DXfftV8+vnl89v363X7/br55fPb96fvX86vnV86vn1z3cdd9+9fzq+dXz63f79X1+9fzq+dXzq+dXz6+eXz2/7uGu+/ar51fPr55fv9uv7/Or51fPr55fPb96fvX86vl1D3fdt189v3p+9fz63T6+z0fPR89Hz0fPR89Hz0fPx/f5+D4fPR89Hz0fv9vHPdzo+ej56Pno+ej56Pno+biHG/fto+ej56Pn43f7uIcbPR89Hz0fPR89Hz0fPR/3cOO+ffR89Hz0fPxuH/dwo+ej56Pno+ej56Pno+fjHm7ct4+ej56Pno/f7aPn4zwf5/no+fjdPu7hxvf56Pno+ej5OM//eLj9b/XdM/zxcP+t5sfqWIVVWpVVW12rsZIxMp6MJ+PJeDKejCfjyXgynownY2WsjJWxMlbGylgZK2Nl7Jfxfn6sjtX3Pp7v8+f7/On50/On5895/pznT8+fnj89f3r+9Pzp+dPzp+dPz5+eP/ftz3370/On50/Pn9/tz/f50/On50/Pn54/PX96/vT8uW9/7tufnj89f3r+/G5/vs+fnj89f3r+9Pzp+dPzp+fPfftz3/70/On50/Pnd/vzff70/Llvf87z5zx/ev6c5895/vT8uYd77uGev6s95/nzu/35Pn++z597uOc8f87z5zx/zvPnPH/u4Z779ue+/fm72nOeP7/bn+/z5/v8uYd7zvPnPH/O8+c8f87z5x7uuW9/7tufv6s95/nzu/35Pn++z597uOc8X+f5Os/Xeb7O89Xzdd++7tvX39XWeb56vr7P1/f5uodbPV89Xz1fPV89X/dw6+9qq+er56vn63f7+j5fPV89Xz1fPV89Xz1fPV/3cOvvaqvnq+er5+t3+/o+Xz1fPV89Xz1fPV89Xz1f93Dr72qr56vnq+frd/v6Pl89Xz1fPV89Xz1fPV89X+f5Os9Xz1fPV8/Xeb7O89Xz1fPV89Xz1fPV89XzdQ+37ttXz1fPV8/X7/b1fb56vnq+er56vnq+er56vu7h1n376vnq+er5+t2+vs9Xz1fPV89Xz/FwBw938HDn5zvPz893np+fr+fn5+v5+eal/q7Gv31WMo6MI+Pr+cHDHTzcwcOdnyPju28/nx/ud7Xf6uv5wcOdzw/3u5IRMkLG1/ODhzt4uIOHO58f7nd1rOxV2qu0VykjZaSMlJEyyl6V5yjPUZ6jZJT3Ufaq7FXZq5LRMlpGy2gZba/ac7TnaM/RMtr7uPbq2qtrr66MK+PKuDKujGuvrucYzzGeY2SM9zH2auzV2KuRMTJGxpPxZDx79TzH8xzPczwZz/t49urZq7VXK2NlrIyVsTLWXq3nWM+h558f7nd1rMIqrcqq/dtrNVbPSoae4+EOHu7g4c7nh/tdtdW1GqtnJSNk6PnR86PnR8/xcAcPd/Bw5/PD/a6+93H0/Oj50XM83Pn8cL8rGXp+9PzoOR7u4OEOHu58frjflfeh50fPj57j4c7nh/tdydDzo+dHz/FwBw938HDn88P9rrwPPT96fvQcD3c+P9zvSoaeHz0/eo6HO3i4g4c7nx/ud+V96PnR86PneLjz+eF+VzL0/Oj50XM83MHDHTzc+fxwvyvvQ8+Pnh89x8Odzw/3u5Kh50fPj57j4Q4e7uDhzueH+1197yP0PPQ89BwPd/BwBw938HAn9BwPd+JHxpGh53i4g4c7eLjzx8Ptf6t/9wznj4f7t3pW+60+TubEx8mc+DiZEx8nc+LjZE58nMyJkBEyQkbISBkpI2WkjJSRMlJGykgZKaNklIySUTJKRskoGSWjZJSM9j7aO2/vXM/xcAcPd/BwBw93Qs9Dz/FwJ/Q89Dz0PPQcD3fwcAcPdz4/3O9Khp6Hnoee4+HO54f7XcnQ89Dz0HM83MHDHTzc+fxwv6u00g89Dz3Hw53PD/e7kqHnoeeh53i4g4c7eLjz+eF+V2Nlr/Q89RwPdz4/3O8qrcqqra7VWD2r7znwcOfzw/2uwiqtykrGkXFkHBnO83Sep/M8nefpPP/8cL+rtrpWY/WsZKSMlJEynOfpPE/neTrP03n++eF+V95H2auyV87z9Lv988P9rmSUDOd5Os/TeZ7O83Sep55/frjflb1qe+U8x8MdPNzBwx083MHDndTz1PPUczzc+fxwvyvvQ89Tz1PP8XDn88P9rmToeep56jke7uDhDh7ufH6435X3oeep56nneLjz+eF+VzL0PPU89RwPd/BwBw93Pj/c78r70PPU89RzPNwp3+el56Xnpeel53i4g4c7eLhTzvNynpeel56XnuPhTjnPS89Lz0vPS8/xcAcPd/Bwp0LGd99+Ss9Lz0vP8XCnfJ+Xnpeel56XnuPhDh7u4OFOpYzvvv2Unpeel57j4U75Pi89Lz0vPS89x8MdPNzBw51ynpfzvPS89Lz0HA93ynleel56Xnpeeo6HO3i4g4c7dWVc70PPS89Lz/Fwp3yfl56Xnpeel57j4Q4e7uDhzueH+115H3peel56joc75fu89Lz0vPS89BwPd/BwBw93Pj/c78r70PPS89JzPNwp3+el563nreet53i4g4c7eLjTfrd/frjf1bP69qr1HA932u/21vPW89bz1nM83MHDHTzcafdwnx/udxVWaVVWMnyft563nreet57j4Q4e7uDhTruH+/xwvyt7peet53i4077PW89bz1vPW8/xcAcPd/Bwp93DfX64/6/0vPW89RwPd9rv9tbz1vPW89ZzPNzBwx083Gn3cJ8f7ndlr/S89RwPd9r3eet563nrees5Hu7g4Q4e7rR7uM8P97uyV3reeo6HO+37vPW89bz1vPUcD3fwcAcPd9o93OeH+13ZKz1vPcfDnfZ93nreet56fvUcD3fwcAcPd67v8+v7/Or51fOr53i4c93DXT2/en71/Oo5Hu7g4Q4e7lz3cNd9+9Xzq+dXz/Fw57qHu3p+9fzq+dVzPNzBwx083Lnu4a779qvnV8+vnuPhznUPd/X86vnV86vneLiDhzt4uHPdw1337VfPr55fPcfDHTzcwcMdPNy5eo6HO9c93PV9joc7eLiDhzt4uPPHw+1/q++e4Y+H+7e6VmP1rL57hvtxMud+nMy5Hydz7sfJnDsyRsbIGBkjY2Q8GU/Gk/FkPBlPxpPxZDwZT8bKWBkrY2WsjJWxMlaG3+3X9/n4PsfDHTzcwcMdPNzBw53R89FzPNwZPR89Hz0fPcfDHTzcwcOdcd8+7ttHz0fPR8/xcGd8n4+ej56Pno+e4+EOHu7g4c64bx/37aPno+ej53i4M77PR89Hz0fPR8/xcAcPd/BwZ9y3j/v20fPR89FzPNwZ3+ej5+O+fZzn4zzHw51xno/zHA93xj0cHu7g4Q4e7uDhDh7u4OEOHu6M83yc5+M8H+f5OM/HPdy4bx/37ePvauM8H7/bx/f5+D4f93DjPB/n+TjPx3k+zvNxDzfu28d9+/i72jjPx+/28X0+vs/HPdw4z8d5Ps7zcZ6P8/zp+XPfjoc7eLiDhzt4uIOHO3i4g4c7eLjz9Pzp+dNzPNx57uGev6s9PX96/vQcD3ee7/On50/Pn54/PcfDHTzcwcOd5x7u+bva0/On50/P8XDn+T5/ev70/On503M83MHDHTzcee7hnr+rPT1/ev70HA93nu/zp+dPz5+ePz3Hwx083MHDnec8f87zp+dPz5+e4+HOc54/PX96/vT86Tke7uDhDh7uPPdwz3370/On50/P8XDn+T5/ev70/On503M83MHDHTzcee7hnvv2p+dPz5+e4+HO833+9Pzp+dPzp+d4uIOHO3i485znz3m+er56vnqOhzvrPF89Xz1fPV89x8MdPNzBw511D7fu21fPV89Xz/FwZ32fr56vnq+er57j4Q4e7uDhzrqHW/ftq+er56vneLizvs9Xz1fPV89Xz/FwBw938HBn3cOt+/bV89Xz1XM83Fnf56vnq+er56vneLiDhzt4uLN+t6/79tXz1fPVczzcWb/bV89Xz1fPV8/xcAcPd/BwZ93Drfv21fPV89VzPNxZ3+er56vnq+er53i4g4c7eLiz7uHWffvq+er56jke7qzv89Xz1fPV89VzPNzBwx083Fn3cOu+ffV8v57Hz9fzwMMFP1zwwwU/XPDDBT9c4OECDxd4uOCHC3644IeLn6/n8fP1PPBwwQ8X/HDBDxf8cMEPF3i4wMMFHi744YIfLvjh4ufreXzzUn9XMlJGykgZKSPtVXqO9BzpOVJGeh9lr8pelb0qGSWjZJSMklH2qjxHe472HC2jvY+2V22v2l61jJbRMq6MK+Paq+s5rue4nuPKuN7HtVfXXo29GhkjY2SMjJEx9mo8x3iO8RxPxvM+nr169urZqyfjyXgynownY+3Veo71HOs5VsZ6H2uv1l6tvfp+twceLvBwgYcLfrjAw8X57uGCHy7wcIGHCzxc4OHij4fb/1b/7hnij4f7tyqrtrpWY/Ws9lt9nEycj5OJEzJCRsgIGSEjZISMkJEyUkbKSBkpI2WkjJSRMlJGySgZJaNklIySUd7H930e/HCBhws8XODhAg8XeLg4en70HA8X/HDBDxf8cMEPF3i4wMMFHi744YIfLvjh4uj50XM8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uDh6fvQcDxf8cMEPF/xwwQ8X/HCBhws8XODhgh8u+OGCHy6Onh89x8MFP1zwwwU/XPDDBT9c4OEinOfhPMfDBT9c4OECDxd4uMDDBR4u8HCBhwt+uOCHC364COd5OM/54YIfLvjhIr6/q0U4z/nhgh8u+OGCHy744YIfLvjhIpzn4Tznhwt+uOCHi0h75Tznhwt+uOCHC3644IcLfrjgh4twnofznB8u+OECDxd4uMDDBR4u8HCBhws8XODhgh8u+OEi9BwPF/xwwQ8X/HAReh56jocLfrjghwt+uOCHC364wMMFHi7wcMEPF/xwwQ8Xoeeh53i44IcLfrjghwt+uOCHCzxc4OECDxf8cMEPF/xwEXoeeo6HC3644IcLfrjghwt+uMDDBR4u8HDBDxf8cMEPF6nn/HCBh4t0nvPDRep56nnqOR4u8HCBh4s8Mr779kg9Tz1PPcfDRYYMPU89Tz1PPcfDBR4u8HCRKeO7b4/U89Tz1HM8XGTK0PPU89Tz1HM8XODhAg8X6TxP53nqeep56jkeLtJ5nnqeep56nnqOhws8XODhIq+M633oOT9c8MMFHi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1yknqee4+GCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MNF6nnqOR4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9clJ6XnuPhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDRel56TkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XJSel57j4YIfLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww0Xpeek5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1yUnpee4+GCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MNF6XnpOR4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9clJ6XnuPhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDRet56zkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XLSet57j4YIfLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww0Xrees5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1y0nree4+ECDxd4uMDDBT9c4OGi3cPxwwUeLvBwgYcLPFz88XB/9y9/PFz9tzpWYZVWZdVW12qsntV3l9EjY2SMjJExMkbGyBgZI2NkPBlPxpPxZDwZT8aT8WQ8GU/GylgZK2Nl+N3evs/54QIPF3i4wMMFHi7wcHH1/Oo5Hi744YIfLvjhgh8u8HCBhws8XPDDBT9c8MPF1fOr53i44IcLfrjghwt+uOCHCzxc4OECDxf8cMEPF/xwcfX86jkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XFw9v3qOhwt+uOCHC3644IcLfrjAw8V1nl/nOR4u+OECDxd4uMDDBR4u8HCBhws8XPDDBT9c8MPFdZ5f5zk/XPDDBT9c3LFXznN+uOCHC3644IcLfrjghwt+uLjO8+s854cLfrjgh4v77JXznB8u+OGCHy744YIfLvjhgh8urvP8Os/54YIfLvBwgYcLPFzg4QIPF3i4wMMFHi744YIfLkbP8XDBDxf8cMEPF6Pno+d4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cDF6PnqOhwt+uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxej56PneLjghwt+uOCHC3644IcLPFzg4QIPF/xwwQ8X/HAxes4PF3i4GOc5P1yMno+ej57j4QIPF3i4GPdw47599Hz0fPQcDxfj+3z0fPR89Hz0HA8XeLjAw8W4hxv37aPno+ej53i4GN/no+ej56Pno+d4uMDDBR4uxnk+zvPR89Hz0XM8XDzn+dPzp+dPz5+e4+ECDxd4uHju4Z77dn644IcLfrjAwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4un50/P8XDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OHi6fnTczxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364eHr+9BwPF/xwwQ8X/HDBDxf8cIGHCzxc4OGCHy744YIfLp6ePz3HwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4un50/P8XDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OHi6fnTczxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364WD1fPcfDBT9c8MMFP1zwwwU/XODhAg8XeLjghwt+uOCHi9Xz1XM8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uFg9Xz3HwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4vV89VzPFzwwwU/XPDDBT9c8MMFHi7wcIGHC3644IcLfrhYPV89x8MFP1zwwwU/XPDDBT9c4OECDxd4uOCHC3644IeL1fPVczxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364WD1fPcfDBR4u8HCBhwt+uMTD5c93D5f8cImHSzxc4uESD5d/PNz+t/p3z5B/PNx/q/NjdazCKq3Kqq2u1VjJODJCRsgIGSEjZISMkBEyQkbISBkpI2WkjJSRMlJGykgZKaNklIzyPr7v8+SHSzxc4uESD5d4uMTDpXmpaV5q4uGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9c/lzPcT3HlXFlXBlXxpXx9TzxcImHSzxc8sMlP1zyw+XP1/M0LzXxcMkPl/xwyQ+X/HDJD5d4uMTDJR4u+eGSHy754fJn7dXaq5WxMlbGylgZa6/03LzUNC818XDJD5d4uMTDJR4u8XCJh0s8XOLhkh8u+eGSHy7NS03zUpMfLvnhkh8uz/d3tTQvNfnhkh8u+eGSHy754ZIfLvnh0rzUNC81+eGSHy754fKkvUp7lTJSRspIGSmj7FV5jvIc5Tn0nB8u8XCJh0s8XOLhEg+XeLjEwyUeLvnhkh8uzUtNPFzywyU/XPLD5dFz81ITD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy6PnpuXmni45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xwefTcvNTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vQc364xMNlOM/54TL03LzUNC818XCJh0s8XMaR8d23Z+h56Ll5qYmHywgZeh56bl5qmpeaeLjEwyUeLiNkfPftGXoeem5eauLhMlKGnoeem5ea5qUmHi7xcImHy3Ceh/M89Dz03LzUxMNlOM9Dz0PPzUtN81ITD5d4uMTDZbSM9j70nB8u+eESD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy5Dz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364DD03LzXxcMkPl/xwyQ+X/HDJD5d4uMTDJR4u+eGSHy754TL13LzUxMMlP1zywyU/XPLDJT9c4uESD5d4uOSHS3645IfL1PPUczxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364TD1PPcfDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Tz1HM8XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uEw9Tz3HwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vUc/NSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uU8/NS008XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uEw9Ny818XDJD5f8cMkPl/xwyQ+XeLjEwyUeLvnhkh8u+eGy9Ny81MTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Jz81ITD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy5Lz81LTTxc4uESD5d4uOSHSzxcVsnwfY6HSzxc4uESD5d/PNz+t/ruGf54uH+rZ/XdM9THyWR9nEzWx8lkfZxM1sfJZH2cTNaVcWVcGVfGyBgZI2NkjIyRMTJGxsgYGU/Gk/FkPBlPxpPxZDwZT8aT4Xd7+T7nh0s8XOLhEg+XeLjEw6V5qWleauLhkh8u+eGSHy754RIPl3i4xMMlP1zywyU/XLaem5eaeLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HDZem5eauLhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLDZeu5eamJh0t+uOSHS3645IdLfrjEw6V5qWleauLhkh8u8XCJh0s8XOLhEg+XeLjEwyU/XPLDJT9cmpea5qUmP1zywyU/XPa1V85zfrjkh0t+uOSHS3645IdLfrg0LzXNS01+uOSHS3647GevnOf8cMkPl/xwyQ+X/HDJD5f8cGleapqXmvxwyQ+XeLjEwyUeLvFwiYdLPFzi4RIPl/xwyQ+X5qUmHi754ZIfLvnh8uq5eamJh0t+uOSHS3645IdLfrjEwyUeLvFwyQ+X/HDJD5dXz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364vHpuXmri4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw+XVc364xMPldZ7zw+XVc/NS07zUxMMlHi7xcHndw1337VfPr56bl5p4uLy+z6+eXz03LzXNS008XOLhEg+X1z3cdd9+9fzquXmpiYfL6/v86vnVc/NS07zUxMMlHi7xcHmd59d5fvX86rl5qYmHy+s8v3p+9dy81DQvNfFwiYdLPFyOe7hx384Pl/xwyQ+XeLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HA5em5eauLhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLD5ei5eamJh0t+uOSHS3645IdLfrjEwyUeLvFwyQ+X/HDJD5ej5+alJh4u+eGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9cjp6PnuPhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLD5ej56DkeLvnhkh8u+eGSHy754RIPl3i4xMMlP1zywyU/XI6ej57j4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw+XT86fneLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HD59Ny81MTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy6fn5qUmHi754ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1w+PTcvNfFwyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnh8um5eamJh0t+uOSHS3645IdLfrjEwyUeLvFwyQ+X/HDJD5dPz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364fHpuXmri4RIPl3i4xMMlP1zi4fK5h+OHSzxc4uESD5d4uPzj4fa/1XfP8MfD/Vtdq7F6Vt89w+JkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFyeDhcn2f88MlHi7xcImHSzxc4uHSvNQ0LzXxcMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy5Xz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364XD03LzXxcMkPl/xwyQ+X/HDJD5d4uMTDJR4u+eGSHy754XL13LzUxMMlP1zywyU/XPLDJT9c4uHSvNQ0LzXxcMkPV3i4wsMVHq7wcIWHKzxc4eGKH6744YofrsxLLfNSix+u+OGKH65+vr+rlXmpxQ9X/HDFD1f8cMUPV/xwxQ9X5qWWeanFD1f8cMUPVz9hr9JepYyUkTJSRspIe5WeIz1Heo6SUd5H2auyV2WvSkbJKBklo2S0vWrP0Z6jPUfLaO+j7VXbq7ZXLePKuDKujCvj2qvrOa7nuJ7jyrjex9irsVdjr0bGyBgZI2NkjL0az/E8x/McT8bzPp69evbq2asn48l4MlbGylh7tZ5jPcd6jpWx3sfaKz3nhys8XJ3vPC9+uDp6bl5qmZdaeLjCwxUers6R8d2319Hzo+fmpRYers6RoedHz81LLfNSCw9XeLjCw9UJGd99ex09P3puXmrh4eqkDD0/em5eapmXWni4wsMVHq5OykjvQ8+PnpuXWni4OiVDz4+em5da5qUWHq7wcIWHq9My2vvQc3644ocrPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrg6em5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1dFz81ILD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH66OnpuXWni44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xwFXoeeo6HK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV6Hnoed4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cBV6HnqOhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1eh56HneLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HAVem5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHDVei5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1eh5+alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9cpZ6bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cJV6bl5q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cNV6rl5qYWHKzxc4eEKD1f8cIWHqywZJUPP8XCFhys8XP3xcPvf6t89Q/3xcP9WZdVW12qsntV+q4+Tqfw4mcor48q4Mq6MK+PKuDKujJExMkbGyBgZI2NkjIyRMTKejCfjyXgynownw+/2fN758871HA9XeLjCwxUersxLLfNSCw9X/HDFD1f8cMUPV3i4wsMVHq744YofrvjhqvTcvNTCwxU/XPHDFT9c8cMVP1zh4QoPV3i44ocrfrjih6vSc/NSCw9X/HDFD1f8cMUPV/xwhYcrPFzh4Yofrvjhih+uSs/NSy08XPHDFT9c8cMVP1zxwxUersxLLfNSCw9X/HCFhys8XOHhCg9XeLjCwxUervjhih+u+OHKvNQyL7X44Yofrvjhqq69cp7zwxU/XPHDFT9c8cMVP1zxw5V5qWVeavHDFT9c8cNVjb1ynvPDFT9c8cMVP1zxwxU/XPHDlXmpZV5q8cMVP1zh4QoPV3i4wsMVHq7wcIWHKzxc8cMVP1yZl1p4uOKHK3644oer1nPzUgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744YofrlrPzUstPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrhqPTcvtfBwxQ9X/HDFD1f8cMUPV3i4wsMVHq744YofrvjhqvWcH67wcNXOc364aj03L7XMSy08XOHhCg9X7R6u2/vQ89Zz81ILD1ft+7z1vPXcvNQyL7XwcIWHKzxctXu4Hu9Dz1vPzUstPFy17/PW89Zz81LLvNTCwxUervBw1c7zdp63nreem5daeLhq53nreeu5eallXmrh4QoPV3i4uu7hrvt2frjihyt+uMLDFT9c8cMVP1zxwxU/XOHhCg9XeLjihyt+uOKHq6vn5qUWHq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cMVP1xdPTcvtfBwxQ9X/HDFD1f8cMUPV3i4wsMVHq744Yofrvjh6uq5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1dXz6+e4+GKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV1fOr53i44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xwdfX86jkervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XI2ej57j4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw9XouXmphYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9Xo+fmpRYervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XI2em5daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HA1em5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1ei5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1ej5+alFh6u8HCFhys8XPHDFR6uxj0cP1zh4QoPV3i4wsPVHw/3d//yx8PVf6tjFVZpVVZtda3G6ll9dxnvyDgyjowj48g4Mo6MI+PIODJCRsgIGSEjZISMkBEyQkbISBkpI2WkDL/bn+9zfrjCwxUervBwhYcrPFyZl1rmpRYervjhih+u+OGKH67wcIWHKzxc8cMVP1zxw9XTc/NSCw9X/HDFD1f8cMUPV/xwhYcrPFzh4Yofrvjhih+unp6bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cPX03LzUwsMVP1zxwxU/XPHDFT9c4eHKvNQyL7XwcMUPV3i4wsMVHq7wcIWHKzxc4eGKH6744YofrsxLLfNSix+u+OGKH67W39XMSy1+uOKHK3644ocrfrjihyt+uDIvtcxLLX644ocrfrhaf1czL7X44Yofrvjhih+u+OGKH6744cq81DIvtfjhih+u8HCFhys8XOHhCg9XeLjCwxUervjhih+uzEstPFzxwxU/XPHD1eq5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1er5+alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9crZ6bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cLV6zg9XeLha5zk/XP98PW/zUtu81MbDNR6u8XD9893D9c93394/X8/75+t5m5faeLj+OTKOjCPjyPh63ni4xsM1Hq5/QsZ3394/X8/75+t5m5faeLj+CRkhI2SEjLRX6TnSc6TnSBnfed4/aa/SXqW9Shklo2SUjJJR9qo8R3mO8hwlo7yPtldtr9petYyW0TJaRstoe9We43qO6zmujOt9XHt17dW1V1fGlXFljIyRMfZqPMd4jvEcI2O8j7FXY6+evXoynown48l4Mp69ep7jeY7nOVbGeh9rr9Zerb1aGStjZawMPeeHazxc4+EaD9f8cM0P1/xwffT86Dkervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XB89P3qOh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9dHz4+e4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88P10fOj53i45odrfrjmh2t+uOaHazxc4+EaD9f8cM0P1/xwffTcvNTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+uj5+alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cHz03L7XxcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754Tr03LzUxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr0HPzUhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754ZofrkPPzUttPFzj4RoP13i45odrPFxHySgZeo6Hazxc4+H6j4fb/1b/7hn6j4f7b9U/VscqrNKqrNrqWo2VjJZxZVwZV8aVcWVcGVfGlXFlXBkjY2SMjJExMkbGyBgZI2NkPBlPxvM+nnf+vHM9x8M1Hq7xcI2Ha/NS27zUxsM1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364Tj03L7XxcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754Tr13LzUxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr1HPzUhsP1/xwzQ/X/HDND9f8cI2Ha/NS27zUxsM1P1zj4RoP13i4xsM1Hq7xcI2Ha3645odrfrg2L7XNS21+uOaHa364zrZXznN+uOaHa3645odrfrjmh2t+uDYvtc1LbX645odrfrjOsVfOc3645odrfrjmh2t+uOaHa364Ni+1zUttfrjmh2s8XOPhGg/XeLjGwzUervFwjYdrfrjmh2vzUhsP1/xwzQ/X/HBdem5eauPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPDdem5eamNh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9el5+alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cl57zwzUerst5zg/XpefmpbZ5qY2Hazxc4+G6WkZ7H3peem5eauPhunyfl56XnpuX2ualNh6u8XCNh+u6Mq73oeel5+alNh6uy/d56XnpuXmpbV5q4+EaD9d4uC7neTnPS89Lz81LbTxcl/O89Lz03LzUNi+18XCNh2s8XNfKWO9Dz/nhmh+u8XDND9f8cM0P1/xwzQ/XeLjGwzUervnhmh+u+eG69dy81MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Zz81IbD9f8cM0P1/xwzQ/X/HCNh2s8XOPhmh+u+eGaH65bz81LbTxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364bj1vPcfDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69bz1nM8XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uG49bz3HwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vW89ZzPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfri+em5eauPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPD9dVz81IbD9f8cM0P1/xwzQ/X/HCNh2s8XOPhmh+u+eGaH66vnpuX2ni45odrfrjmh2t+uOaHazxc4+EaD9f8cM0P1/xwffXcvNTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+ur5+alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cXz03L7XxcI2Hazxc4+GaH67xcH3dw/HDNR6u8XCNh2s8XP/xcPvf6rtn+OPh/q2e1XfPMB8n0/NxMj0fJ9PzcTI9HyfT83EyPR8n0/NxMj0fJ9PzI+PIODKOjCPjyDgyjowj48g4MkJGyAgZISNkhIyQETJCRsjwu318n/PDNR6u8XCNh2s8XOPh2rzUNi+18XDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+uR8/NS208XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uB49Ny+18XDND9f8cM0P1/xwzQ/XeLjGwzUervnhmh+u+eF69Ny81MbDNT9c88M1P1zzwzU/XOPh2rzUNi+18XDND9d4uMbDNR6u8XCNh2s8XOPhmh+u+eGaH67NS23zUpsfrvnhmh+un7+rmZfa/HDND9f8cM0P1/xwzQ/X/HBtXmqbl9r8cM0P1/xw/fxdzbzU5odrfrjmh2t+uOaHa3645odr81LbvNTmh2t+uMbDNR6u8XCNh2s8XOPhGg/XeLjmh2t+uDYvtfFwzQ/X/HDND9dPz81LbTxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364fnpuXmrj4Zofrvnhmh+u+eGaH67xcI2Hazxc88M1P1zzw/XTc/NSGw/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+un57zwzUerp/znB+un56bl9rmpTYervFwjYfrdQ+37ttXz1fPzUttPFyv7/PV89Vz81LbvNTGwzUervFwve7h1n376vnquXmpjYfr9X2+er56bl5qm5faeLjGwzUertd5vs7z1fPVc/NSGw/X6zxfPV89Ny+1zUttPFzj4RoP1+sebt2388M1P1zzwzUervnhmh+u+eGaH6754RoP13i4xsP9j6d7y5UcOYIguqXOzHjuf2NS9TTPX0DAwEGyXSzmNVgkP1zywyU/XK6e25eaeLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HC5em5fauLhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLD5eq5famJh0t+uOSHS3645IdLfrjEwyUeLvFwxQ9X/HDFD1d/vp7Xn6/nhYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9Xf76e15+v54WHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV3+ee/XcqyfjyXgynown47lXz3WE6wjXETLC8wj3KtyrcK9CRsgIGSkjZaR7la4jXUe6jpSRnke6V+lelXtVMkpGySgZJaPcq3Id5TrKdbSM9jzavWr3qt2rltEyWkbLaBnjXo3rGNcxrmNkjOcx7tW4V+NejYyVsTJWxspY92pdx7qOdR0r4ztvL364OnpuX2rh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw9XRc/tSCw9X/HDFD1f8cMUPV/xwhYcrPFzh4Yofrvjhih+ujp7bl1p4uMLDFR6u8HDFD1d4uDpPxpOh53i4wsMVHq7+8nD73/TvnKH+8nD/pjK1aUz7TR8nU+fjZOp8nEydj5OpkzJSRspIGSkjZZSMklEySkbJKBklo2SUjJLRMlpGy2gZLaNltIyW0Z5He+bjmes5Hq7wcIWHKzxc2Zda9qUWHq744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV0XP7UgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744Yofrq6e25daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HB19dy+1MLDFT9c8cMVP1zxwxU/XOHhyr7Usi+18HDFD1d4uMLDFR6u8HCFhys8XOHhih+u+OGKH67sSy37Uosfrvjhih+ubrpX3uf8cMUPV/xwxQ9X/HDFD1f8cGVfatmXWvxwxQ9X/HB1y73yPueHK3644ocrfrjihyt+uOKHK/tSy77U4ocrfrjCwxUervBwhYcrPFzh4QoPV3i44ocrfriyL7XwcMUPV/xwxQ9XV8/tSy08XPHDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uHp6bl9q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV03P7UgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744Yofrp6e88MVHq6e9zk/XD09ty+17EstPFzh4QoPVy9lpOeh50/P7UstPFy9lKHnT8/tSy37UgsPV3i4wsPVKxnleej503P7UgsPV69l6PnTc/tSy77UwsMVHq7wcPW8z5/3+dPzp+f2pRYerp73+dPzp+f2pZZ9qYWHKzxc4eHqrYz1PPScH6744QoPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744YofrkLP7UstPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrgKPbcvtfBwxQ9X/HDFD1f8cMUPV3i4wsMVHq744YofrvjhKvTcvtTCwxU/XPHDFT9c8cMVP1zh4QoPV3i44ocrfrjih6vQ89BzPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrgKPQ89x8MVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oer0PPQczxc8cMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364Cj0PPcfDFT9c8cMVP1zxwxU/XOHhCg9XeLjihyt+uOKHq9Rz+1ILD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH65Sz+1LLTxc8cMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364Sj23L7XwcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744Sr13L7UwsMVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oer1HP7UgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744YofrlLP7UstPFzh4QoPV3i44ocrPFylczh+uMLDFR6u8HCFh6u/PNz+N33nDH95uH9TmNJUpjaN6TvLqI+Tqfo4maqPk6n6OJmqj5Op+jiZqo+Tqfo4maqPk6n6I+PIODKOjCPjyDgyjowj48g4Mq6MK+PKuDKujCvD7/byfc4PV3i4wsMVHq7wcIWHK/tSy77UwsMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364Kj23L7XwcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744ar03L7UwsMVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oer0nP7UgsPV/xwxQ9X/HDFD1f8cIWHK/tSy77UwsMVP1zh4QoPV3i4wsMVHq7wcIWHK3644ocrfriyL7XsSy1+uOKHK364an9Xsy+1+OGKH6744Yofrvjhih+u+OHKvtSyL7X44Yofrvjhqv1dzb7U4ocrfrjihyt+uOKHK3644ocr+1LLvtTihyt+uMLDFR6u8HCFhys8XOHhCg9XeLjihyt+uLIvtfBwxQ9X/HDFD1et5/alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9ctZ7bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cNV6bl9q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cNV6zk/XOHhqr3P+eGq9dy+1LIvtfBwhYcrPFy1c7h23j56PnpuX2rh4Wp8n4+ej57bl1r2pRYervBwhYercQ43zttHz0fP7UstPFyN7/PR89Fz+1LLvtTCwxUervBwNd7n430+ej56bl9q4eFqvM9Hz0fP7Ust+1ILD1d4uMLD1TiHG+ft/HDFD1f8cIWHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV6Pn9qUWHq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cMVP1yNntuXWni44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xwNXpuX2rh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw9Xo+eo5Hq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cMVP1ytnq+e4+GKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV6vnqOR6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9crZ6vnuPhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1eq5famFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1er5/alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9crZ7bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cLV6bl9q4eGaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88P1n6/nbV9q4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88P1n6/nbV9q4+EaD9d4uMbDNT9c4+H6z5PxZDzX8VzHk/Fcx6/n+3eKf+cM/ZeH+zdd0zOFKU1latOY9ptSRspIGSkjZaSMlJEyUkbKKBklo2SUjJJRMkpGySgZJaNltIyW0TLa82jPvD3z9jza82j/rsa/q/HMxzMfz3xkjGc+nvnIGBkjY2WsjJWxMlbGuo51HStjZeg5P1zzwzU/XOPhGg/XeLjmh2t+uOaH66Pn9qU2Hq754Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1wfPbcvtfFwzQ/X/HDND9f8cM0P13i4ti+17UttPFzzwzUervFwjYdrPFzj4RoP13i45odrfrjmh2v7Utu+1OaHa3645ofrk+5VulcpI2WkjJSRMtK9StdRrqNcR8koz6Pcq3Kvyr0qGSWjZLSMltHuVbuOdh3tOvScH67xcI2Hazxc4+EaD9d4uMbDNR6u+eGaH67tS208XPPDNT9c88P10XP7UhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754Zofrq+e25faeLjmh2t+uOaHa3645odrPFzj4RoP1/xwzQ/X/HB99dy+1MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH66vn/HCNh+vrfc4P11fP7Utt+1IbD9d4uMbD9Q0Z4Xno+dVz+1IbD9c3Zej51XP7Utu+1MbDNR6u8XB9S0Z5Hnp+9dy+1MbD9S0Zen713L7Uti+18XCNh2s8XF/v8+t9fvX86rl9qY2H6+t9fvX86rl9qW1fauPhGg/XeLi+I2M8Dz3nh2t+uMbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH66fn9qU2Hq754Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1w/PbcvtfFwzQ/X/HDND9f8cM0P13i4xsM1Hq754Zofrvnh+um5famNh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9dPz5+e4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88P10/On53i45odrfrjmh2t+uOaHazxc4+EaD9f8cM0P1/xw/fT86Tkervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XD89f3qOh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9eh5/alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9ch57bl9p4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cB16bl9q4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88N16Ll9qY2Ha3645odrfrjmh2t+uMbDNR6u8XDND9f8cM0P16Hn9qU2Hq754Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1yHntuX2ni4xsM1Hq7xcM0P13i4jpHh+xwP13i4xsM1Hq7/8nD73/SdM/zl4f6b9o/pmK7pmcKUpjK1ScbHyXR+nEznx8l0fpxM58fJdH6cTOfHyXR+nEznx8l0fpxM5x8ZR8aRcWQcGUfGkXFkHBlHxpFxZVwZfren73N+uMbDNR6u8XCNh2s8XNuX2valNh6u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPDdeq5famNh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9ep5/alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cp57bl9p4uOaHa3645odrfrjmh2s8XNuX2valNh6u+eEaD9d4uMbDNR6u8XCNh2s8XPPDNT9c88O1faltX2rzwzU/XPPDdX5/V2v7Upsfrvnhmh+u+eGaH6754Zofru1LbftSmx+u+eGaH67r+7ta25fa/HDND9f8cM0P1/xwzQ/X/HBtX2rbl9r8cM0P13i4xsM1Hq7xcI2Hazxc4+EaD9f8cM0P1/alNh6u+eGaH6754br03L7UxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr0nP7UhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754ZofrkvP7UttPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrguPeeHazxcl/c5P1yXntuX2valNh6u8XCNh+tyDlfO20vPS8/tS208XLfv89bz1nP7Utu+1MbDNR6u8XDdzuHaeXvreeu5famNh+v2fd563npuX2rbl9p4uMbDNR6u2/u8vc9bz1vP7UttPFy393nreeu5faltX2rj4RoP13i4budw7bydH6754ZofrvFwzQ/X/HDND9f8cM0P13i4xsM1Hq754ZofrvnhuvXcvtTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vWc/tSGw/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+uW8/tS208XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uG49bz3HwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vR89FzPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrgePR89x8M1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr0fPRczxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364Hj23L7XxcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754Xr03L7UxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr0XP7UhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754ZofrkfP7UttPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrhePbcvtfFwzQ/X/HDND9f8cM0P13i4xsM1Hq754ZofrvnhevXcvtTGwzUervFwjYdrfrjGw/U6h+OHazxc4+EaD9d4uP7Lw+1/03fO8JeH+zeN6TtnWJzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE4GD9fr+5wfrvFwjYdrPFzj4RoP1/altn2pjYdrfrjmh2t+uOaHazxc4+EaD9f8cM0P1/xwvXpuX2rj4Zofrvnhmh+u+eGaH67xcIOHGzzc8MMNP9zww82fr+djX+rg4YYfbvjhhh9u+OGGH27wcIOHGzzc8MMNP9zww82fr+djX+rg4YYfbvjhhh9u+OGGH27wcGNf6tiXOni44YcbPNzg4QYPN3i4wcMNHm7wcMMPN/xwww839qWOfanDDzf8cMMPN3/CvQr3KmSkjJSRMlJGulfpOtJ1pOtIGel5lHtV7lW5VyWjZJSMklEyyr0q19Guo11Hy2jPo92rdq/avWoZLaNljIyRMe7VuI5xHeM6RsZ4HuNejXu17tXKWBkrY2WsjHWv1nWs69Bzfrjhhxt+uDl6bl/q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MPN0XP7UgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbo6e88MNHm7Ok6HnR8/tSx37UgcPN3i4wcPNCRnheej50XP7UgcPNydk6PnRc/tSx77UwcMNHm7wcHNSRnoeen703L7UwcPNKRl6fvTcvtSxL3XwcIOHGzzcnJbRnoeeHz23L3XwcHNahp4fPbcvdexLHTzc4OEGDzdnZIznoef8cMMPN3i44Ycbfrjhhxt+uOGHGzzc4OEGDzf8cMMPN/xwc/XcvtTBww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5ur5/alDh5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/cXD23L3XwcMMPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744ebq+dVzPNzwww0/3PDDDT/c8MMNHm7wcIOHG3644Ycbfri5en71HA83/HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9urp5fPcfDDT/c8MMNP9zwww0/3ODhBg83eLjhhxt+uOGHm6vnV8/xcMMPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744ebquX2pg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83T8/tSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uHl6bl/q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MPN03P7UgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbp6e25c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HDz9Ny+1MHDDR5u8HCDhxt+uMHDzWsZLUPP8XCDhxs83Pzl4fa/6d85w/zl4f5NZWrTmPabPk5m3sfJzPs4mXkfJzNvZayMlbEyVsbHyUx8nMzEx8lMfJzMxMfJTHyczMTHyUx8nMzEx8lMfJzMxB8ZR8aRcWQcGUfGkXFkHBl+t4fvc364wcMNHm7wcIOHGzzc2Jc69qUOHm744YYfbvjhhh9u8HCDhxs83PDDDT/c8MNN6Ll9qYOHG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPN6Hn9qUOHm744YYfbvjhhh9u+OEGDzd4uMHDDT/c8MMNP9yEntuXOni44Ycbfrjhhxt+uOGHGzzc2Jc69qUOHm744QYPN3i4wcMNHm7wcIOHGzzc8MMNP9zww419qWNf6vDDDT/c8MNNrHvlfc4PN/xwww83/HDDDzf8cMMPN/aljn2pww83/HDDDzf5/V1t7Esdfrjhhxt+uOGHG3644YcbfrixL3XsSx1+uOGHGzzc4OEGDzd4uMHDDR5u8HCDhxt+uOGHG/tSBw83/HDDDzf8cJN6bl/q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MNN6rl9qYOHG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPN6nn9qUOHm744YYfbvjhhh9u+OEGDzd4uMHDDT/c8MMNP9yknvPDDR5u0vucH25Sz+1LHftSBw83eLjBw006h8v1PPQ89dy+1MHDTfo+Tz1PPbcvdexLHTzc4OEGDzflHK6ct5eel57blzp4uCnf56Xnpef2pY59qYOHGzzc4OGmvM/L+7z0vPTcvtTBw015n5eel57blzr2pQ4ebvBwg4ebcg5Xztv54YYfbvjhBg83/HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9uSs/tSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uCk9ty918HDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OGm9Ny+1MHDDT/c8MMNP9zwww0/3ODhBg83eLjhhxt+uOGHm9Lz0nM83PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uGk9bz3Hww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5vW89ZzPNzwww0/3PDDDT/c8MMNHm7wcIOHG3644YcbfrhpPW89x8MNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yeb1nP7UgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfblrP7UsdPNzwww0/3PDDDT/c8MMNHm7wcIOHG3644YcbfrhpPbcvdfBwww83/HDDDzf8cMMPN3i4wcMNHm744YYfbvjhpvXcvtTBww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5vRc/tSBw83/HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9uRs/tSx083ODhBg83eLjhhxs83IxzOH64wcMNHm7wcIOHm7883P43fecMf3m4f1OY0lSmNo3pO8uYj5OZ+TiZmZARMkJGyAgZISNkhIyUkTJSRspIGSkjZaSMlJEySkbJKBklo2SUDL/bx/c5P9zg4QYPN3i4wcMNHm7sSx37UgcPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744Wb03L7UwcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yeb1XP7UgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfblbP7UsdPNzwww0/3PDDDT/c8MMNHm7sSx37UgcPN/xwg4cbPNzg4QYPN3i4wcMNHm744YYfbvjhxr7UsS91+OGGH2744Wb9Xc2+1OGHG3644Ycbfrjhhxt+uOGHG/tSx77U4Ycbfrjhh5v1dzX7Uocfbvjhhh9u+OGGH2744YYfbuxLHftShx9u+OEGDzd4uMHDDR5u8HCDhxs83ODhhh9u+OHGvtTBww0/3PDDDT/crJ7blzp4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cLNfz9e+1MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH2z9fz9e+1MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH2z9fz5cfbvFw++fJeDKejCfjuVfPdTzX8VzHk/E8j3Cvwr0K9ypkhIyQETJCRrhX4TrSdaTrSBnpeaR7le5VulcpI2WkjJJRMsq9KtdRrqNcR8koz6Pcq3Kv2r1qGS2jZbSMltHuVbuOdh3tOkbGeB7jXo17Ne7VyBgZI2NkjIx1r9Z1rOtY17Ey1vNY92rdq3Wvvt/tyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnh9ui5famLh1t+uOWHW3645YdbfrjFwy0ebvFwyw+3/HDLD7dHz+1LXTzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364PXp+9BwPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfbo+eHz3Hwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9uj50fP8XDLD7f8cMsPt/xwyw+3eLjFwy0ebvnhlh9u+eH26PnRczzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364PXpuX+ri4ZYfbvnhlh9u+eGWH27xcIuHWzzc8sMtP9zyw+3Vc/tSFw+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9ur57bl7p4uOWHW3645Ydbfrjlh1s83OLhFg+3/HDLD7f8cHv13L7UxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfbq+f2pS4ebvnhlh9u+eGWH2754RYPt3i4xcMtP9zywy0/3F49ty918XCLh1s83OLhlh9u8XB7W0bL0HM83OLhFg+3f3m4/TvNv3OG/cvD/Zuu6ZnClKYytWlM+00rY2WsjJWxMlbGylgZK+PjZPZ9nMy+j5PZ93Ey+z5OZt/Hyez7OJl9Hyez7+Nk9n2czL4/Mo6MI+PIODL8bn/f9/nywy0ebvFwi4dbPNzi4da+1LUvdfFwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfbp+e25e6eLjlh1t+uOWHW3645YdbPNzi4RYPt/xwyw+3/HD79Ny+1MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH26fn9qUuHm754ZYfbvnhlh9u+eEWD7f2pa59qYuHW364xcMtHm7xcIuHWzzc4uEWD7f8cMsPt/xwa1/q2pe6/HDLD7f8cPvWvfI+54dbfrjlh1t+uOWHW3645Ydb+1LXvtTlh1t+uOWH2/j+rrb2pS4/3PLDLT/c8sMtP9zywy0/3NqXuvalLj/c8sMtHm7xcIuHWzzc4uEWD7d4uMXDLT/c8sOtfamLh1t+uOWHW364DT23L3XxcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754Tb03L7UxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb0HP7UhcPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfbkPP+eEWD7fhfc4Pt6Hn9qWufamLh1s83OLhNkbGeB56HnpuX+ri4TZ8n4eeh57bl7r2pS4ebvFwi4fbdA6X33n7pp6nntuXuni4Td/nqeep5/alrn2pi4dbPNzi4Ta9z9P7PPU89dy+1MXDbXqfp56nntuXuvalLh5u8XCLh9t0Dpffefvywy0/3PLDLR5u+eGWH2754ZYfbvnhFg+3eLjFwy0/3PLDLT/cpp7bl7p4uOWHW3645Ydbfrjlh1s83OLhFg+3/HDLD7f8cJt6bl/q4uGWH2754ZYfbvnhlh9u8XCLh1s83PLDLT/c8sNt6rl9qYuHW3645Ydbfrjlh1t+uMXDLR5u8XDLD7f8cMsPt6nnqed4uOWHW3645Ydbfrjlh1s83OLhFg+3/HDLD7f8cFt6XnqOh1t+uOWHW3645YdbfrjFwy0ebvFwyw+3/HDLD7el56XneLjlh1t+uOWHW3645YdbPNzi4RYPt/xwyw+3/HBbel56jodbfrjlh1t+uOWHW364xcMtHm7xcMsPt/xwyw+3pef2pS4ebvnhlh9u+eGWH2754RYPt3i4xcMtP9zywy0/3Jae25e6eLjlh1t+uOWHW3645YdbPNzi4RYPt/xwyw+3/HBbem5f6uLhlh9u+eGWH2754ZYfbvFwi4dbPNzywy0/3PLDbem5famLh1t+uOWHW3645YdbfrjFwy0ebvFwyw+3/HDLD7el5/alLh5u+eGWH2754ZYfbvnhFg+3eLjFwy0/3PLDLT/ctp7bl7p4uMXDLR5u8XDLD7d4uG3ncPxwi4dbPNzi4RYPt395uP1v+s4Z/vJw/03vj+mYrumZwpSmMrVJxpMRMkJGyAgZISNkhIyQETJCRspIGSkjZaSMlJEyUkbKSBklo2T43d6+z/nhFg+3eLjFwy0ebvFwa1/q2pe6eLjlh1t+uOWHW364xcMtHm7xcMsPt/xwyw+3ref2pS4ebvnhlh9u+eGWH2754RYPt3i4xcMtP9zywy0/3Lae25e6eLjlh1t+uOWHW3645YdbPNzi4RYPt/xwyw+3/HA7em5f6uLhlh9u+eGWH2754ZYfbvFwa1/q2pe6eLjlh1s83OLhFg+3eLjFwy0ebvFwyw+3/HDLD7f2pa59qcsPt/xwyw+34+9q9qUuP9zywy0/3PLDLT/c8sMtP9zal7r2pS4/3PLDLT/cjr+r2Ze6/HDLD7f8cMsPt/xwyw+3/HBrX+ral7r8cMsPt3i4xcMtHm7xcIuHWzzc4uEWD7f8cMsPt/alLh5u+eGWH2754Xb03L7UxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb0XP7UhcPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfblfP7UtdPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645YdbfrhdPeeHWzzcrvc5P9yuntuXuvalLh5u8XCLh9t1DrfO21fPV8/tS1083K7v89Xz1XP7Ute+1MXDLR5u8XC7zuHWefvq+eq5famLh9v1fb56vnpuX+ral7p4uMXDLR5u1/t8vc9Xz1fP7UtdPNyu9/nq+eq5falrX+ri4RYPt3i4Xedw67ydH2754ZYfbvFwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnhdvXcvtTFwy0/3PLDLT/cfn64/5/C/ev5bzqma3qm/zJ+U5rK1KYxyTgyjowj48j41/PflKYytUnGv/P2/0//ev6bjumaZFwZV8aVcWX86/lvch3PdTzX8WT8O2//Te7Vc6+ee/VkPBlPRsgIGeFehesI1xGuI2SE5xHuVbhX6V6ljJSRMlJGykj3Kl1Huo50HSWjPI9yr8q9KveqZJSMklEySka7V+062nW062gZ7Xm0e9XuVbtXLWNkjIyRMTLGvRrXMa5jXMfIGM9j3at1r9a9WhkrY2WsjJWx7pWeHz0/ev754X7TM4UpTWVq/+2YZOj50fOj50fPj54fPf/8cL+pTWP67tXR84+H+00y9Pzo+dHzo+dHz4+eHz3//HC/6ZjcKz0/ev7xcL9Jhp4fPT96fvT86PnR86Pnnx/uN3keen70/Oj5x8P9f0oZen70/Oj50fOj50fPj55/frjf5Hno+dHzo+cfD/ebXEe5jnIdev7xcL9JRsvQ86PnR88/Hu435d/zl9/03znDb2rTmPab/nEyv+mYrumZwpQmGSNjZIyMlbEyVsbKWBkrY2WsjJWxX8b988d0TNf0TGFKU5naNCYZ53se9xzTNX3P4+r51fPrfX69z6+eXz2/en71/Or51fOr51fPr55fPf/8cL9Jhp5fPb96/vFwv0mGnl89v3p+9fzq+dXzq+efH+43PVOY0lQmGSFDz6+eXz2/en71/Or51fPPD/eb2uRe6fnV84+H+00y9Pzzw/0mGd7nV8+v9/n1Pr96/vnhfpN71e6V9/nHw/0mGS2jZXifX+/z631+vc+v9/nnh/tNnse4V+NeeZ9/frj/TytjZawM7/PrfX69z6/3+fU+//xwv+l7Hp8f7jcd0zV9GZ8f7jelqUxtGtN3Hc/7/HmfPz3//HC/KUxpKpOMI+PIuDL0/On50/On50/PPz/cb2rTmNwrPX9+t39+uN8kQ8+fnj89f3r+9Pzp+eeH+02eh54/PX96/vxu//xwv0mGnj89f3r+9Pzp+dPzzw/3mzwPPX96/vT8+d3++eF+kww9f3r+9Pzp+dPzp+fP+/x5nz89f3r+9Px5nz/v86fnT8+fnj89f3r+9Pzp+RsZ43no+dPzp+fP7/Y3MvT86fnT86fnT8+fnj89fytjPQ89f3oeeh5+t4fv89Dz0PPQ89Dz0PPQ89Dz8D4P7/PQ89Dz0PPwPg/v89Dz0PPQ89Dz0PPQ89DzuDJumsrUpjHJ8H0eeh56Hnoeeh56Hnoeev754X6T56Hnoeeh5+F3e/g+Dz0PPQ89Dz0PPQ89Dz3//HC/yfPQ89Dz0PPwuz18n4eeh56Hnoeeh56Hnoeeh9/tnx/uN7lXeh56Hn63h9/toeeh56Hnoeeh56HnoeefH+43eR56Hnoeeh6+z8P3eeh56Hnoeeh56Hnoeej554f7TZ6Hnoeeh56H7/P0fZ56nnqeep56nnqeep56ns7hPj/c/yc9Tz1PPU+/29Pv9tTz1PPU89Tz1PPU89TzdA73+eF+U5jSVCYZvs9Tz1PPU89Tz1PPU89Tz9M53OeH+03ulZ6nnqff7en7PPU89Tz1PPU89Tz1PPU8ncN9frjf5F7peep5+t2evs9Tz1PPU89Tz1PPU89Tz9P3efo+Tz1PPU89T7/b0zlc6nnqeep56nnqeep56nk6h/v8cP+f9Dz1PPU8/W5P53Cp56nnqeep56nnqeep5+kc7vPD/Sb3Ss9Tz9Pv9nQOl3peel56Xnpeel56XnpezuHKeXvpeel56Xn53V56Xt7n5X1eel5+t5dzuPJ9Xnpeel56Xt7nf3m4/W/6zhn+8nD/pjK1aUzfOUO9P6ZjuqZnkvFkPBlPxpPxZISMkBEyQkbICBkhI2SEjJCRMlJGykgZKSNlpIyU4Xd7+T4v3+el56XnpeflfV7e56Xnpeel56Xnpeel56Xnpeel56Xn5by9nLeXnpeel56X3+3l+7z0vPS89Lz0vPS89Lz0vJy3l/P20vPS89Lz8ru9fJ+Xnpeel563nreet563nrfz9nbe3nreet563n63t+/z1vN23t7e5+193nre3uftfd563s7h2jlc+7tae5+33+3t+7x9n7dzuPY+b+/z9j5v7/P2Pm/ncO28vZ23t7+rtfd5+93evs/b93k7h2vv8/Y+b+/z9j5v7/N2DtfO29t5e/u7Wnuft9/t7fu8fZ+3c7j2Pm/v8/Y+b+/z9j5vPW/n7e28vf1drb3PW8/b93n7Pm/ncK3nreet563nreftHK79Xa31vPW89bz9bm/f563nreet563nreet563n7Ryu/V2t9bz1vPW8/W5v3+et563nreet563no+ej5+McbvxdbfR89Hz0fPxuH9/no+ej56Pno+ej56Pno+fjfT7e56Pno+ej5+N9Pt7no+ej56Pno+ej56Pno+fjHG6ct4+ej56Pno/f7eP7fPR89Hz0fPR89Hz0fPR8nMON8/bR89Hz0fPxu318n4+ej56Pno+ej56Pno+ej/f5eJ+Pno+ej56P9/l4n4+ej56Pno+ej56Pno+ej3O4cd4+ej56Pno+freP7/PR89Hz0fPR89Hz0fPR83EON87bR89Hz0fPx+/28X0+ej56Pno+ej56Pno+er7O4dZ5++r56vnq+frdvr7PV89Xz1fPV89Xz1fPV8/X7/Z13r56vnq+er5+t6/f7avnq+er56vnq+er56vn6xxunbevnq+er56v7/P1fb56vnq+er56vnq+er56vs7h1nn76vnq+er5+j5f3+er56vnq+er56vnq+er5+scbp23r56vnq+er9/t63f76vnq+er56vnq+er56vk6h1vn7avnq+er5+t3+/o+Xz1fPV89Xz1fPV89Xz1f53DrvH31fPV89Xz9bl/f56vnq+er56vnq+er56vn6xzu88P9/4Ts6/n58/X8fPtSf9O/jPP54X5TmsrUpjHtN309P3i48/nhftMzhSlNZZJxZBwZV8aV8fX84OEOHu7g4c7nh/tNbRqTe/XcqyfjyXgynown47lXz3U81/FcR8gIzyPcq3Cvwr0KGSEjZISMkJHuVbqOdB3pOlJGeh7pXqV7le5VyijXUa6jXEfJ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93l4n4eeh9/t0TJ8n4eeh56Hnof3+V8e7u/5y18eLv6bjumanilMaSpTm8b0nWXEylgZK2NlrIyVsTJWxsrYLyP//DEd0zU9U5jSVKY2jUnGkXFkHBlHht/t6fs8fZ+nnqeep56n93l6n6eep56nnqeep56nnqeep56nnqeef3643yRDz1PPU8/T7/b0fZ56nnqeep56nnqeep56/vnhflObxvT1I/U8/W5P3+ep56nnqeep56nnqeep558f7jcdk3ul56nn6Xd7+j5PPf/8cL9Jhvd56nl6n6f3eep5OodL53AfD/eb3Cu/29P3efo+T+dw6X2e3ufpfZ7e5+l9ns7hPj/c/6d1r9a98j5Pv9vT93n6Pk/ncOl9nt7n6X1e3uflfV7O4cp5ezlvrz9pKlP7b8ckwzlceZ+X93l5n5f3eXmfl56X8/Zy3v7xcP+fvM9Lz8v3efk+L+dwpeel56Xnpeel5+Uc7vPD/Sb3Ss9Lz8vv9vJ9Xnpeel56Xnpeel56XnpezuE+P9xvcq/0vPS8/G4v3+el56Xnpeel56Xnpeel5+Uc7vPD/X/S89Lz0vPyu718n5eel56Xnpeel56Xnpeel/d5eZ+Xnpeel56X93l5n5eel56Xnpeel56Xnpeel3O4ct5eel56XnpefreX7/PS89Lz0vPS89Lz0vPS83YO187bW89bz1vP2+/29n3eet563nreet563nreet7e5+193nreet563t7n7X3eet563nreet563nreet7O4dp5e+t563nrefvd3r7PW89bz1vPW89bz1vPW8/bOVw7b289bz1vPW+/29v3eet563nreet563nreet5O4dr5+2t563nreftd3v7Pm89bz1vPW89bz1vPW89b7/b23l763nreet5+93efre3nreet563nreet563nrdzuHbe3nreet563r7P2/d563nreet563nreet563k7h2vn7aPno+ej5+P7fHyfj56Pno+ej56Pno+ej56Pc7hx3j56Pno+ej5+t4/f7aPno+ej56Pno+ej56Pn4xxunLePno+ej56P3+3j+3z0fPR89Hz0fPR89Hz0fJzDjfP20fPR89Hz8bt9fJ+Pno+ej56Pno+ej56Pno9zuHHePno+ej56Pn63j+/z0fPR89Hz0fPR89Hz0fPxfT6+z0fPR89Hz8fv9nEON3o+ej56Pno+ej56Pno+zuHGefvo+ej56Pn43T7O4UbPR89Hz0fPR89Hz0fPxzncOG8fPR89Xz1fv9vXOdzq+er56vnq+er56vnq+TqHW+ftq+er56vn63f76vl6n6/3+er5+t2+zuHW9/nq+er56vl6n//l4fa/6Ttn+MvD/Te9P6ZjuqZnClOaytQmGTiZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZNbv9vV9vr7PV89Xz1fP1/t8vc9Xz1fPV89Xz1fPV89Xz1fPV89Xz9d5+zpvXz1fPV89X7/b1/f56vnq+er56vnq+er56vk6b1/n7avnq+er53i48/nhftMxXdMzhSlNZWrTv4zz+eH+P309P3++np9vX+pvknFkHBlHxpHxvc8PHu58+1J/k+u4Mr5zuIOHO3i4g4c7eLiDhzt4uIOHO58f7je5V891PNfxXMeT8Z23n88P95vcq3CvQkbICBkhI2SEexWuI1xHuI6UkZ5HulfpXqV7lTJSRspIGSmj3KtyHeU6ynWUjPI8yr0q96rcq5LRMlpGy2gZ7V6162jX0a6jZbTnMe7VuFfjXo2MkTEyRsbIGPdqXMe6jnUdK2M9j3Wv1r1a92plrAw9P3p+9PzoOR7u4OEOHu58frjf1KYxfffq6Dke7nx+uN8kQ8+Pnh89x8MdPNzBw53PD/ebjumanilMMq4MPT96fvT86Dke7uDhDh7unCfjO28/R8+Pnh89x8OdEzL0/Oj50fOj53i4g4c7eLhzQkZ4Hnp+9PzoOR7unJSh50fPj54fPcfDHTzcwcOdUzLK89Dzo+dHz/Fw55QMPT96fvT86Dke7uDhDh7unJbRnoeeHz0/eo6HO58f7jfJ0POj50fP8XAHD3fwcOfzw/0mz0PPj54fPcfDnc8P95tk6PnR86vneLiDhzt4uPP54X5TmsrUpjHJODL0/Or51fOr53i4g4c7eLjz+eF+0/c8rp5fPb96joc7nx/uN8nQ86vnV8/xcAcPd/Bw5/PD/aZncq/0/Oo5Hu58frjfJEPPr55fPcfDHTzcwcOdzw/3mzwPPb96fvUcD3c+P9xvkqHnV8+vnuPhDh7u4OHO54f7TZ6Hnl89v3qOhzufH+43ydDzq+dXz/FwBw938HDn88P9Js9Dz6+eXz3Hw/2Pp3tJrhxHgii6JSF+QOx/Y91SJc8MkzQ3guWFR+jajfP54X5XMvQ89Dz0HA938HAHD3c+P9zvyvvQ89Dz0HM83Pn8cL8rGXoeeh56joc7eLiDhzufH+53lVZl1VZjdf3bZyVDz1PPU8/xcAcPd/Bw5/PD/a6u1bP69ir1HA93Pj/c70qGnqeep57j4Q4e7uDhzueH+10dK3ul56nneLjz+eF+VzL0PPU89RwPd/BwBw93Pj/c78r70PPU89RzPNz5/HC/Kxl6nnqeeo6HO3i4g4c7nx/ud+V96Hnqeeo5Hu7g4Q4e7uDhTuo5Hu7kyLgy9BwPd/BwBw93/ni4/W/1757h/PFw/1bPar/Vx8mc/DiZkx8nc/LjZE5+nMzJj5M5+WQ8GU/Gk7EyVsbKWBkrY2WsjJWxMj5O5tTHyZz6OJlTHydz6uNkTn2czKmPkzn1cTKnPk7m1MfJnPqR4Xd7+T4v3+d4uIOHO3i4g4c7eLhTel56joc7peel56Xnped4uIOHO3i48/nhflcy9Lz0vPQcD3fK93npeel56XnpOR7u4OEOHu58frjfVVqVVVuNlQzf56Xnpeel56XneLiDhzt4uPP54X5X18pe6XnpOR7ulO/z0vPPD/e7kuE8x8Odcp6X8xwPdz4/3O/KXl175TzHwx083MHDHTzcKed5Oc/LeV7O83Kef36435X38ezVs1fO8/K7vXyfl+/zzw/3u5LhPC/neTnPy3n++eF+V9/7+Pxwv6tjFVZfRvs+b9/n7R6uneftPG/neTvP23neev754X5XZdVWYyXD9zke7uDhDh7utJ63nree4+FOu4f7/HC/q2dlr/QcD3fa93nreet563nrOR7u4OEOHu60e7jPD/e7sld63nqOhzvt+7z1vPW89bz1HA938HAHD3faPdznh/td2Ss9bz3Hw532fd563nreet56joc7eLiDhzvtPG/neet563nrOR7utPO89bz1vPW89RwPd/BwBw932j1cP+9Dz1vPW8/xcKd9n7eet563nree4+EOHu7g4U67h+v1PvS89Xz0HA93xvf56Pno+ej56Dke7uDhDh7ujPN8nOej56Pno+d4uDPO89Hz0fPR89FzPNzBwx083Bn3cOO+ffR89Hz0HA93xvf56Pno+ej56Dke7uDhDh7ujHu4cd8+ej56PnqOhzvj+3z0fPR89Hz0HA938HAHD3fGPdy4bx89Hz0fPcfDnfF9Pno+ej56PnqOhzt4uIOHO+N3+7hvHz0fPR89x8Od8bt99Hz0fPR89BwPd/BwBw93xj3cuG8fPR89Hz3Hw53xfT56Pno+ej56joc7eLiDhzvjHm7ct4+ej56PnuPhzvV9fvX86vnV86vneLiDhzt4uHPdw1337VfPr55fPcfDnet3+9Xzq+dXz6+e4+EOHu7g4c51D3fdt189v3p+9RwPd67v86vnV8+vnl89x8MdPNzBw53rHu66b796fvX86jke7lzf51fPr55fPb96joc7eLiDhzvXPdx13371/Or51XM83Lm+z6+eXz2/en71HA938HAHD3eu7/Pr+/zq+dXzq+d4uHPdw109v3p+9fzqOR7u4OEOHu5c93DXffvV86vnV8/xcOe6h7t6fvX86vnVczzcwcMdPNy57uGu+/ar51fPr57j4c51D3f1/On50/On53i4g4c7eLjz3MM99+1Pz5+ePz3Hwx083MHDHTzceXqOhzvPPdzzfY6HO3i4g4c7eLjzx8Ptf6vvnuGPh/u3Gqtr9ay+e4b3cTLnfZzMeR8nc97HyZyXMlJGykgZKSNllIySUTJKRskoGSWjZJSMktEyWkbLaBkto2W0jJbhd/vzff58n+PhDh7u4OEOHu7g4c7T86fneLjz9Pzp+dPzp+d4uIOHO3i489y3P/ftT8+fnj89x8Od5/v86fnT86fnT8/xcAcPd/Bw57lvf+7bn54/PX96joc7z/f50/On50/PV8/xcAcPd/BwZ923r/v21fPV89VzPNxZ3+er5+u+fZ3n6zzHw511nq/zHA931j0cHu7g4Q4e7uDhDh7u4OEOHu6s83yd5+s8X+f5Os/XPdy6b1/37evvaus8X7/b1/f5+j5f93DrPF/n+TrP13m+zvN1D7fu29d9+/q72jrP1+/29X2+vs/XPdw6z9d5vs7zdZ6v83z1fN234+EOHu7g4Q4e7uDhDh7u4OEOHu6snq+er57j4c66h1t/V1s9Xz1fPcfDnfV9vnq+er56vnqOhzt4uIOHO+sebv1dbfV89Xz1HA931vf56vnq+er56jkeLvBwgYcLfrjghwt+uPj5eh7fvNTf1fVvn5WMI+PI+HoeeLjAwwUeLvjhgh8u+OHi5+t58MMFHi5+QkbICBkh4+t54OECDxd4uPhJGd99e/ykvUp7lfYqZaSMlJEyUkbZq/Ic5TnKc5SM8j7KXpW9KntVMlpGy2gZLaPtVXuO9hztOVpGex9jr8Zejb0aGSNjZIyMkTH2ajzH9RzXc1wZ1/u49uraq2uvrowr48p4Mp6MZ6+e53ie43mOJ+N5H89ePXu19mplrIyVsTJWxtqr9RzrOfScHy744YIfLo6eHz3HwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4uj50fP8XDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OHi6PnRczxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364OHp+9BwPF/xwwQ8X/HDBDxf8cIGHCzxc4OGCHy744YIfLo6eHz3HwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4uj50fP8XDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OHi6PnRczxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364CD0PPcfDBT9c8MMFP1zwwwU/XODhAg8XeLjghwt+uOCHi9Dz0HM8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uAg9Dz3HwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4vQ89BzPFzwwwU/XPDDBT9c8MMFHi7wcIGHC3644IcLfrgIPQ89x8MFHi7wcIGHC364wMNFjIyRoed4uMDDBR4u/ni4/W/1754h/ni4f6uyaquxulbPar/Vx8lEfJxMxJPxZDwZT8aT8WQ8GU/GylgZK2NlrIyVsTJWxsr4OJnIj5OJ/DiZyI+Tifw4mciPk4n8OJnAw0V+3+fBDxd4uMDDBR4u8HCBh4vU89RzPFzwwwU/XPDDBT9c4OECDxd4uOCHC3644IeL1PPUczxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364SD1PPcfDBT9c8MMFP1zwwwU/XODhAg8XeLjghwt+uOCHi9Tz1HM8XPDDBT9c8MMFP1zwwwUeLtJ5ns5zPFzwwwUeLvBwgYcLPFzg4QIPF3i44IcLfrjgh4t0nqfznB8u+OGCHy7y2SvnOT9c8MMFP1zwwwU/XPDDBT9cpPM8nef8cMEPF/xwkWuvnOf8cMEPF/xwwQ8X/HDBDxf8cFHO83Ke88MFP1zg4QIPF3i4wMMFHi7wcIGHCzxc8MMFP1yUnuPhgh8u+OGCHy5Kz0vP8XDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OGi9Lz0HA8X/HDBDxf8cMEPF/xwgYcLPFzg4YIfLvjhgh8uSs9Lz/FwwQ8X/HDBDxf8cMEPF3i4wMMFHi744YIfLvjhovScHy7wcFHOc364KD0vPS89x8MFHi7wcFFXxvU+9Lz0vPQcDxfl+7z0vPS89Lz0HA8XeLjAw0WtjPU+9Lz0vPQcDxfl+7z0vPW89bz1HA8XeLjAw0U7z9t53nreet56joeLdp63nreet563nuPhAg8XeLho93D93bcHP1zwwwU/XODhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDRet56zkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XLSet57j4YIfLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww0Xrees5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1y0nree4+GCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MNF63nrOR4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9cjJ6PnuPhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDxej56DkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XIyej57j4YIfLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww8Xo+eg5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1yMno+e4+GCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MPF6PnoOR4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9cjJ6PnuPhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDxdXzq+d4uMDDBR4u8HDBDxd4uLju4fjhAg8XeLjAwwUeLv54uL/7lz8erv5bHauwSquyaquxulbP6rvLuCkjZaSMlJEyUkbKSBkpI2WUjJJRMkpGySgZJaNklIyS0TJaRstoGX63X9/n/HCBhws8XODhAg8XeLi4en71HA8X/HDBDxf8cMEPF3i4wMMFHi744YIfLvjh4ur51XM8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uLh6fvUcDxf8cMEPF/xwwQ8X/HCBhws8XODhgh8u+OGCHy6enj89x8MFP1zwwwU/XPDDBT9c4OHiOc+f8xwPF/xwgYcLPFzg4QIPF3i4wMMFHi744YIfLvjh4jnPn/OcHy744YIfLp6/qz3nOT9c8MMFP1zwwwU/XPDDBT9cPOf5c57zwwU/XPDDxfN3tec854cLfrjghwt+uOCHC3644IeL5zx/znN+uOCHCzxc4OECDxd4uMDDBR4u8HCBhwt+uOCHi6fneLjghwt+uOCHi6fnT8/xcMEPF/xwwQ8X/HDBDxd4uMDDBR4u+OGCHy744eLp+dNzPFzwwwU/XPDDBT9c8MMFHi7wcIGHC3644IcLfrhYPV89x8MFP1zwwwU/XPDDBT9c4OECDxd4uOCHC3644IeL1XN+uMDDxTrP+eFi9Xz1fPUcDxd4uMDDxbqHW/ftq+er56vneLhY3+er56vnq+er53i4wMMFHi7WPdy6b189Xz1fPcfDxfo+Xz1fPV89Xz3HwwUeLvBwsc7zdZ6vnq+er57j4WKd56vnq+er56vneLjAwwUeLtY93Lpv54cLfrjghws8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uFg9Xz3HwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4v9ep7mpSYeLvnhkh8u+eGSHy754RIPl3i4xMMlP1zywyU/XP58PU/zUhMPl/xwyQ+X/HDJD5f8cImHSzxc4uGSHy754ZIfLn++nufP1/PEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8ufsldlr0pGySgZJaNklL0qz9Geoz1Hy2jvo+1V26u2Vy2jZbSMkTEyxl6N5xjPMZ5jZIz3MfZq7NW1V1fGlXFlXBlXxrVX13Ncz3E9x5PxvI9nr569evbqyXgynown48lYe7WeYz3Heo6Vsd7H2qu1V2uvvt/tyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnh8ui5eamJh0t+uOSHS3645IdLfrjEwyUeLvFwyQ+X/HDJD5dHz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364PHpuXmri4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw+XRc/NSEw+XeLjEwyUeLvnhEg+XZ2SMDD3HwyUeLvFw+cfD7X+rf/cM+cfD/be6P1bHKqzSqqzaaqyulYwr48l4Mp6MJ+PJeDKejCfjyXgyVsbKWBkrY2WsjJWxMlbGx8lkfJxMxsfJJB4u4/s+T364xMMlHi7xcImHSzxcmpea5qUmHi754ZIfLvnhkh8u8XCJh0s8XPLDJT9c8sNl6Ll5qYmHS3645IdLfrjkh0t+uMTDJR4u8XDJD5f8cMkPl6Hn5qUmHi754ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1yGnpuXmni45IdLfrjkh0t+uOSHSzxcmpea5qUmHi754RIPl3i4xMMlHi7xcImHSzxc8sMlP1zyw6V5qWleavLDJT9c8sNlXHvlPOeHS3645IdLfrjkh0t+uOSHS/NS07zU5IdLfrjkh8tYe+U854dLfrjkh0t+uOSHS3645IdL81LTvNTkh0t+uMTDJR4u8XCJh0s8XOLhEg+XeLjkh0t+uDQvNfFwyQ+X/HDJD5ep5+alJh4u+eGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9cpp6bl5p4uOSHS3645IdLfrjkh0s8XOLhEg+X/HDJD5f8cJl6bl5q4uGSHy754ZIfLvnhkh8u8XCJh0s8XPLDJT9c8sNl6jk/XOLhMp3n/HCZem5eapqXmni4xMMlHi7zyrjeh56nnpuXmni4zCdDz1PPzUtN81ITD5d4uMTDZT4Zz/vQ89Rz81ITD5e5MvQ89dy81DQvNfFwiYdLPFyW87yc56XnpefmpSYeLst5Xnpeem5eapqXmni4xMMlHi7ryPju25MfLvnhkh8u8XDJD5f8cMkPl/xwyQ+XeLjEwyUeLvnhkh8u+eGy9Ny81MTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Jz81ITD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy5Lz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364LD0vPcfDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Lz0nM8XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uGw9bz3HwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vW89ZzPFzywyU/XPLDJT9c8sMlHi7xcImHS3645IdLfrhsPTcvNfFwyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnhsvXcvNTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vWc/NSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uW8/NS008XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uGw9Ny818XDJD5f8cMkPl/xwyQ+XeLjEwyUeLvnhkh8u+eFy9Ny81MTDJR4u8XCJh0t+uMTD5biH44dLPFzi4RIPl3i4/OPh9r/Vd8/wx8P9Wz2r755hPk4m5+Nkcj5OJufjZHI+Tibn42RyQkbICBkhI2WkjJSRMlJGykgZKSNlpIySUTJKRskoGSWjZJSMklEy/G4f3+f8cImHSzxc4uESD5d4uDQvNc1LTTxc8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Fz81ITD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy5Hz81LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364HD03LzXxcMkPl/xwyQ+X/HDJD5d4uDQvNc1LTTxc8sMlHi7xcImHSzxc4uESD5d4uOSHS3645IdL81LTvNTkh0t+uOSHy+vvaualJj9c8sMlP1zywyU/XPLDJT9cmpea5qUmP1zywyU/XF5/VzMvNfnhkh8u+eGSHy754ZIfLvnh0rzUNC81+eGSHy7xcImHSzxc4uESD5d4uMTDJR4u+eGSHy7NS008XPLDJT9c8sPl1XPzUhMPl/xwyQ+X/HDJD5f8cImHSzxc4uGSHy754ZIfLq+em5eaeLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HB59dy81MTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy6fn/HCJh8vnPOeHy6fn5qWmeamJh0s8XOLh8rmHe+7bn54/PTcvNfFw+XyfPz1/em5eapqXmni4xMMlHi6fe7jnvv3p+dNz81ITD5fP9/nT86fn5qWmeamJh0s8XOLh8jnPn/P86fnTc/NSEw+Xz3n+9PzpuXmpaV5q4uESD5d4uHzu4Z77dn645IdLfrjEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8un5+alJh4u+eGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9cPj03LzXxcMkPl/xwyQ+X/HDJD5d4uMTDJR4u+eGSHy754XL13LzUxMMlP1zywyU/XPLDJT9c4uESD5d4uOSHS3645IfL1fPVczxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364XD1fPcfDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Xz1XM8XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uFw9Xz3HwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vVc/NSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uV8/NS008XPLDJT9c8sMlP1zxwxUervBwhYcrfrjihyt+uPr5el7mpRYervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XP18PS/zUgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744Yofrn7SXqW9ShkpI2WUjJJR9qo8R3mO8hwlo7yPsldlr9petYz2HO052nO0jJbRMlpGe47xHCNjPMdvz/e/1b97hvrj4f6txupaPav9Vh8nUz8fJ1M/HydTPx8nUz9XxpVxZVwZV8aV8WQ8GU/Gk/FkPBlPxpPxZDwZK2NlrIyVsTJWxspYGet9fN/nxQ9XeLjCwxUervBwhYcr81LLvNTCwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrg6em5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1dFz81ILD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH66OnpuXWni44ocrfrjihyt+uOKHKzxcmZda5qUWHq744QoPV3i4wsMVHq7wcIWHKzxc8cMVP1zxw5V5qWVeavHDFT9c8cPVufbq2qsr48q4Mp6MJ+PZq+c5nud4nuPJeN7Hs1fPXq29WhkrY2WsjJWx9mo9x3oO5zk/XPHDFR6u8HCFhys8XOHhCg9XeLjCwxU/XPHDlXmphYcrfrjihyt+uAo9Ny+18HDFD1f8cMUPV/xwxQ9XeLjCwxUervjhih+u+OEq9Ny81MLDFT9c8cMVP1zxwxU/XOHhCg9XeLjihyt+uOKHq9Bz81ILD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH65Cz/nhCg9X4Tznh6vQc/NSy7zUwsMVHq7wcBVXxvU+9Dz03LzUwsNVXBl6HnpuXmqZl1p4uMLDFR6u4sl43oeeh56bl1p4uIqVoeeh5+allnmphYcrPFzh4Sqc5+E8Tz1PPTcvtfBwlc7z1PPUc/NSy7zUwsMVHq7wcJVHxnffXvxwxQ9X/HCFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1ep5+alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9cpZ6bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cJV6bl5q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cNV6nnqOR6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9cpZ6nnuPhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHDVep56Tkervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XJWel57j4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw1XpuXmphYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9XpefmpRYervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XJWem5daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HBVem5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHDVem5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1el5+alFh6u8HCFhys8XPHDFR6u2j0cP1zh4QoPV3i4wsPVHw+3/62+e4Y/Hu7fqqzaaqyu1bP67jL642SqP06mOmSEjJARMkJGyAgZISNlpIyUkTJSRspIGSkjZaSMklEySkbJKBklw+/29n3OD1d4uMLDFR6u8HCFhyvzUsu81MLDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uGo9Ny+18HDFD1f8cMUPV/xwxQ9XeLjCwxUervjhih+u+OGq9dy81MLDFT9c8cMVP1zxwxU/XOHhCg9XeLjihyt+uOKHq9Zz81ILD1f8cMUPV/xwxQ9X/HCFhyvzUsu81MLDFT9c4eEKD1d4uMLDFR6u8HCFhyt+uOKHK364Mi+1zEstfrjihyt+uJrv72plXmrxwxU/XPHDFT9c8cMVP1zxw5V5qWVeavHDFT9c8cPVpL1ynvPDFT9c8cMVP1zxwxU/XPHDlXmpZV5q8cMVP1zh4QoPV3i4wsMVHq7wcIWHKzxc8cMVP1yZl1p4uOKHK3644oer0XPzUgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744YofrkbPzUstPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrgaPTcvtfBwxQ9X/HDFD1f8cMUPV3i4wsMVHq744Yofrvjh6uo5P1zh4eo6z/nh6uq5eallXmrh4QoPV3i4uu7hrvv2q+dXz81LLTxcXd/nV8+vnpuXWualFh6u8HCFh6vrHu66b796fvXcvNTCw9X1fX71/Oq5eallXmrh4QoPV3i4us7z6zy/en713LzUwsPVdZ5fPb96bl5qmZdaeLjCwxUerq57uOu+nR+u+OGKH67wcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744erquXmphYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9XV8/NSy08XPHDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uHp6bl5q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV0/On53i44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xw9fT86Tkervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XD09f3qOhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1dPz5+e4+GKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV03PzUgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744Yofrp6em5daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HC1em5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1eq5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1er5+alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9crZ6bl1p4uMLDFR6u8HDFD1d4uFr3cPxwhYcrPFzh4QoPV3883N/9yx8PV/+tjlVYpVVZtdVYXatn9d1lLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJ4OFqfZ/zwxUervBwhYdrPFzj4dq81DYvtfFwzQ/X/HDND9f8cI2Hazxc4+GaH6754Zofrn++nrd5qY2Ha3645odrfrjmh2t+uMbDNR6u8XDND9f8cM0P1z9fz9u81MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH65+yV2WvSkbJKBklo2S0vWrP0Z6jPUfLaO+j7VXbq7ZXLWNkjIyRMTLGXo3nGM8xnmNkjPdx7dW1V9deXRlXxpVxZVwZ115dz/E8x/McT8bzPp69evbq2asn48l4MlbGylh7tZ5jPcd6jpWx3sfaq+/vao2Hazxc4+EaD9d4uMbDNT9c88O1eamNh2t+uOaHa364PnpuXmrj4Zofrvnhmh+u+eGaH67xcI2Hazxc88M1P1zzw/XRc/NSGw/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+uj56bl9p4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cH30nB+u8XB9WoaeHz03L7XNS208XOPhGg/XZ2SM96HnR8/NS208XJ8rQ8+PnpuX2ualNh6u8XCNh+vzZDzvQ8+PnpuX2ni4Pk+Gnh89Ny+1zUttPFzj4RoP12dlrPeh50fPzUttPFyH8zz0PPTcvNQ2L7XxcI2Hazxcx3cP1/Hdtzc/XPPDNT9c4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88N16Ll5qY2Ha3645odrfrjmh2t+uMbDNR6u8XDND9f8cM0P16Hn5qU2Hq754Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1yHnpuX2ni45odrfrjmh2t+uOaHazxc4+EaD9f8cM0P1/xwHXoeeo6Ha3645odrfrjmh2t+uMbDNR6u8XDND9f8cM0P16Hnoed4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cB16HnqOh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9ep56nneLjmh2t+uOaHa3645odrPFzj4RoP1/xwzQ/X/HCdem5eauPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPDdeq5eamNh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9ep5+alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cp56bl9p4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cJ16bl5q4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88N16rl5qY2Hazxc4+EaD9f8cI2H6/ru4ZofrvFwjYdrPFzj4fqPh9v/Vv/uGfqPh/tvdX6sjlVYpVVZtdVYXSsZR0bICBkhI2SEjJARMkJGyAgZKSNlpIyUkTJSRspIGSkjZZSMkuF3e/k+54drPFzj4RoP13i4xsO1ealtXmrj4Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1yXnpuX2ni45odrfrjmh2t+uOaHazxc4+EaD9f8cM0P1/xwXXpuXmrj4Zofrvnhmh+u+eGaH67xcI2Hazxc88M1P1zzw3XpuXmpjYdrfrjmh2t+uOaHa364xsO1ealtXmrj4ZofrvFwjYdrPFzj4RoP13i4xsM1P1zzwzU/XJuX2ualNj9c88M1P1z393e1Ni+1+eGaH6754Zofrvnhmh+u+eHavNQ2L7X54ZofrvnhutNeOc/54Zofrvnhmh+u+eGaH6754dq81DYvtfnhmh+u8XCNh2s8XOPhGg/XeLjGwzUervnhmh+uzUttPFzzwzU/XPPDdeu5eamNh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9et5+alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9ct56bl9p4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cD16zg/XeLge5zk/XI+em5fa5qU2Hq7xcI2H63EPN+7bR89Hz81LbTxcj+/z0fPRc/NS27zUxsM1Hq7xcD3u4cZ9++j56Ll5qY2H6/F9Pno+em5eapuX2ni4xsM1Hq7HeT7O89Hz0XPzUhsP1+M8Hz0fPTcvtc1LbTxc4+EaD9fjHm7ct/PDNT9c88M1Hq754Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1yPnpuX2ni45odrfrjmh2t+uOaHazxc4+EaD9f8cM0P1/xwPXpuXmrj4Zofrvnhmh+u+eGaH67xcI2Hazxc88M1P1zzw/XVc/NSGw/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+ur55fPcfDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH66vnV8/xcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754frq+dVzPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfri+en71HA/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+ur56bl9p4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cH313LzUxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofrq+fmpTYervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XD89Ny+18XDND9f8cM0P1/xwzQ/XeLjGwzUervnhmh+u+eH66bl5qY2Ha3645odrfrjmh2t+uMbDNR6u8XDND9f8cM0P10/PzUttPFzj4RoP13i45odrPFw/93D8cI2Hazxc4+EaD9d/PNz+t/ruGf54uH+rZ/XdM7yPk+n3cTL9Pk6m38fJ9Ps4mX4fJ9NvZIyMkTEyrowr48q4Mq6MK+PKuDKujCvjyXgynown48l4Mp6MJ+PJeDL8bn++z/nhGg/XeLjGwzUervFwbV5qm5faeLjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/Xq+fmpTYervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XK+em5faeLjmh2t+uOaHa3645odrPFzj4RoP1/xwzQ/X/HC9em5eauPhmh+u+eGaH6754ZofrvFwbV5qm5faeLjmh2s8XOPhGg/XeLjGwzUervFwzQ/X/HDND9fmpbZ5qc0P1/xwzQ/X6+9q5qU2P1zzwzU/XPPDNT9c88M1P1ybl9rmpTY/XPPDNT9cr7+rmZfa/HDND9f8cM0P1/xwzQ/X/HBtXmqbl9r8cM0P13i4xsM1Hq7xcI2Hazzc4OEGDzf8cMMPN+alDh5u+OGGH2744ebn6/mYlzp4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cPPz9XzMSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uPlJe5X2KmWUjJJRMkpG2avyHOU5ynOUjPI+2l61vWp71TJaRstoGS2j7VV7jvEc4zlGxngfY6/GXo29GhkjY2RcGVfGtVfXc1zPcT3HlXG9j2uvrr169urJeDKejCfjyXj26nmO5zme51gZ632svVp7tfZqZayMlbEy9Ny81MHDDR5u8HBzvnu4Od99+/DDDT/c8MMNHm744YYfbvjhhh9u+OEGDzd4uMHDDT/c8MMNP9wcPTcvdfBwww83/HDDDzf8cMMPN3i4wcMNHm744YYfbvjh5ui5eamDhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzdHz81LHTzc8MMNP9zwww0/3PDDDR5u8HCDhxt+uOGHG364OXp+9BwPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbo6eHz3Hww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5uj50fP8XDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OEm9Dz0HA83/HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9uQs/NSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uAk9Ny918HDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OEm9Ny81MHDDT/c8MMNP9zwww0/3ODhBg83eLjhhxt+uOGHm9Bz81IHDzf8cMMPN/xwww83/HCDhxs83ODhhh9u+OGGH25Cz81LHTzc8MMNP9zwww0/3PDDDR5u8HCDhxt+uOGHG364CT03L3XwcIOHGzzc4OGGH27wcBMrY2XoOR5u8HCDh5s/Hm7/W/27Z5g/Hu7faqyu1bPab/VxMpMfJzP5cTKTHyczeWQcGUfGkXFkHBkhI2SEjJARMkJGyAgZISNkpIyUkTJSRspIGSkjZfjdnt/3+fDDDR5u8HCDhxs83ODhxrzUMS918HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9uUs/NSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uEk9Ny918HDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OEm9dy81MHDDT/c8MMNP9zwww0/3ODhxrzUMS918HDDDzd4uMHDDR5u8HCDhxs83ODhhh9u+OGGH27MSx3zUocfbvjhhh9u6vu72piXOvxwww83/HDDDzf8cMMPN/xwY17qmJc6/HDDDzf8cFNhr5zn/HDDDzf8cMMPN/xwww83/HBjXuqYlzr8cMMPN3i4wcMNHm7wcIOHGzzc4OEGDzf8cMMPN+alDh5u+OGGH2744ab03LzUwcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yeb0nPzUgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbkrPzUsdPNzwww0/3PDDDT/c8MMNHm7wcIOHG3644YcbfrgpPeeHGzzctPOcH25az81LHfNSBw83eLjBw027h+vvvn1az1vPzUsdPNy07/PW89Zz81LHvNTBww0ebvBw0+7h+rtvn9bz1nPzUgcPN+37vPW89dy81DEvdfBwg4cbPNy087yd563nrefmpQ4ebtp53nreem5e6piXOni4wcMNHm7aPVy396Hn/HDDDzd4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cNN6bl7q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MNN67l5qYOHG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPN63n5qUOHm744YYfbvjhhh9u+OEGDzd4uMHDDT/c8MMNP9yMno+e4+GGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MPN6PnoOR5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/cjJ6PnuPhhh9u+OGGH+73ELWyV3qOhxs83PDDDT/c8MPN6PnoOR5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/cjJ6blzp4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cDN6bl7q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MPN6Ll5qYOHG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPN1fPzUsdPNzwww0/3PDDDT/c8MMNHm7wcIOHG3644Ycbfri5em5e6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDzdVz81IHDzd4uMHDDR5u+OEGDzfXPRw/3ODhBg83eLjBw80fD7f/rb57hj8e7t+qrNpqrK7Vs/ruMu7Hycz9OJm5I2NkjIyRMTJGxsgYGVfGlXFlXBlXxpVxZVwZV8aV8WQ8GU/Gk/FkPBl+t1/f5/xwg4cbPNzg4QYPN3i4MS91zEsdPNzwww0/3PDDDT/c4OEGDzd4uOGHG3644Yebp+fmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3Dw9Ny918HDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OHm6bl5qYOHG3644Ycbfrjhhxt+uMHDjXmpY17q4OGGH27wcIOHGzzc4OEGDzd4uMHDDT/c8MMNP9yYlzrmpQ4/3PDDDT/cPH9XMy91+OGGH2744YYfbvjhhh9u+OHGvNQxL3X44YYfbvjh5vm7mnmpww83/HDDDzf8cMMPN/xwww835qWOeanDDzf8cIOHGzzc4OEGDzd4uMHDDR5u8HDDDzf8cGNe6uDhhh9u+OGGH25Wz81LHTzc8MMNP9zwww0/3PDDDR5u8HCDhxt+uOGHG364WT03L3XwcMMPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744Wb13LzUwcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yeb1XN+uMHDzTrP+eFm9dy81DEvdfBwg4cbPNyse7h13756vnpuXurg4WZ9n6+er56blzrmpQ4ebvBwg4ebdQ+37ttXz1fPzUsdPNys7/PV89Vz81LHvNTBww0ebvBws87zdZ6vnq+em5c6eLhZ5/nq+eq5ealjXurg4QYPN3i4+/Pdw92f77798sNdfrjLD3fxcJcf7vLDXX64yw93+eEuHu7i4S4e7vLDXX64yw93f76eX/NSLx7u8sNdfrjLD3f54S4/3MXDXTzcxcNdfrjLD3f54e5P2qu0VykjZaSMlJEy0l6l5yjPUZ6jZJT3Ufaq7FXZq5JRMkpGy2gZba/ac7TnaM/RMtr7aHvV9mrs1cgYGSNjZIyMsVfjOcZzjOe4Mq73ce3VtVfXXl0ZV8aVcWVcGc9ePc/xPMfzHE/G8z6evXr26tmrJ2NlrIyVsTLWXq3nWM+xnmNlfPftlx/uHj0/eo6Hu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfrh79Ny81IuHu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfrh79Ny81IuHu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfrh79Ny81IuHu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfrh79Ny81IuHu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfrh79Ny81IuHu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfrh79Ny81IuHu3i4i4e7eLjLD3fxcPesjJWh53i4i4e7eLj7x8P93r/cPx6u/lsdq7BKq7Jqq7G6Vs9qv9WRcWQcGUfGkXFkHBlHxpFxZISMkBEyQkbICBkhI2SEjJCRMlJGykgZ3+/2G9/3+eWHu3i4i4e7eLiLh7t4uGte6jUv9eLhLj/c5Ye7/HCXH+7i4S4e7uLhLj/c5Ye7/HA39Ny81IuHu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfrgbem5e6sXDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9wNPTcv9eLhLj/c5Ye7/HCXH+7yw1083DUv9ZqXevFwlx/u4uEuHu7i4S4e7uLhLh7u4uEuP9zlh7v8cNe81Gte6uWHu/xwlx/u5vd3tWte6uWHu/xwlx/u8sNdfrjLD3f54a55qde81MsPd/nhLj/cze/vate81MsPd/nhLj/c5Ye7/HCXH+7yw13zUq95qZcf7vLDXTzcxcNdPNzFw1083MXDXTzcxcNdfrjLD3fNS714uMsPd/nhLj/cTT03L/Xi4S4/3OWHu/xwlx/u8sNdPNzFw1083OWHu/xwlx/upp6bl3rxcJcf7vLDXX64yw93+eEuHu7i4S4e7vLDXX64yw93U8/NS714uMsPd/nhLj/c5Ye7/HAXD3fxcBcPd/nhLj/c5Ye7qef8cBcPd9N5zg93S8/NS73mpV483MXDXTzcre8e7tZ3335Lz0vPzUu9eLhbvs9Lz0vPzUu95qVePNzFw1083K2Q8d2339Lz0nPzUi8e7pbv89Lz0nPzUq95qRcPd/FwFw93y3lezvPS89Jz81IvHu6W87z0vPTcvNRrXurFw1083MXD3SoZ5X3oOT/c5Ye7eLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu6Xn5qVePNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3dJz81IvHu7yw11+uMsPd/nhLj/cxcNdPNzFw11+uMsPd/nhbum5eakXD3f54S4/3OWHu/xwlx/u4uEuHu7i4S4/3OWHu/xwt/W89RwPd/nhLj/c5Ye7/HCXH+7i4S4e7uLhLj/c5Ye7/HC39bz1HA93+eEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cLf1vPUcD3f54S4/3OWHu/xwlx/u4uEuHu7i4S4/3OWHu/xwt/W89RwPd/nhLj/c5Ye7/HCXH+7i4S4e7uLhLj/c5Ye7/HC39dy81IuHu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfrjbem5e6sXDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9xtPTcv9eLhLj/c5Ye7/HCXH+7yw1083MXDXTzc5Ye7/HCXH+6OnpuXevFwlx/u8sNdfrjLD3f54S4e7uLhLh7u8sNdfrjLD3dHz81LvXi4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7uj5+alXjzcxcNdPNzFw11+uIuHu+Mejh/u4uEuHu7i4S4e7v7xcPvf6rtn+OPh/lv1j9WxCqu0Kqu2GqtrJaNljIyRMTJGxsgYGSNjZIyMkXFlXBlXxpVxZVwZV8aVcWVcGU/Gk+F3+/g+54e7eLiLh7t4uIuHu3i4a17qNS/14uEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cPfquXmpFw93+eEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cPfquXmpFw93+eEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cPfquXmpFw93+eEuP9zlh7v8cJcf7uLhrnmp17zUi4e7/HAXD3fxcBcPd/FwFw938XAXD3f54S4/3OWHu+alXvNSLz/c5Ye7/HD3+ruaeamXH+7yw11+uMsPd/nhLj/c5Ye75qVe81IvP9zlh7v8cPf6u5p5qZcf7vLDXX64yw93+eEuP9zlh7vmpV7zUi8/3OWHu3i4i4e7eLiLh7t4uIuHu3i4i4e7/HCXH+6al3rxcJcf7vLDXX64+/TcvNSLh7v8cJcf7vLDXX64yw938XAXD3fxcJcf7vLDXX64+/TcvNSLh7v8cJcf7vLDXX64yw938XAXD3fxcJcf7vLDXX64+/TcvNSLh7v8cJcf7vLDXX64yw938XAXD3fxcJcf7vLDXX64+/ScH+7i4e5znvPD3afn5qVe81IvHu7i4S4e7j73cM99+9Pzp+fmpV483H2+z5+ePz03L/Wal3rxcBcPd/Fw97mHe+7bn54/PTcv9eLh7vN9/vT86bl5qde81IuHu3i4i4e7z3n+nOdPz5+em5d68XD3Oc+fnj89Ny/1mpd68XAXD3fxcPe5h3vu2/nhLj/c5Ye7eLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu6vn5qVePNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3dVz81IvHu7yw11+uMsPd/nhLj/cxcNdPNzFw11+uMsPd/nh7uq5eakXD3f54S4/3OWHu/xwlx/u4uEuHu7i4S4/3OWHu/xwd/V89RwPd/nhLj/c5Ye7/HCXH+7i4S4e7uLhLj/c5Ye7/HB39Xz1HA93+eEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cHf1fPUcD3f54S4/3OWHu/xwlx/u4uEuHu7i4S4/3OWHu/xwd/V89RwP9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HDv5+v5My/14eEeP9zjh3v8cI8f7vHDPTzcw8M9PNzjh3v8cI8f7v18PX/mpT483OOHe/xwjx/u8cM9friHh3t4uIeHe/xwjx/u8cO9n7RXZa9KRskoGSWjZJS9Ks9RnqM8R8to76PtVdurtlcto2W0jJbRMsZejecYzzGeY2SM9zH2auzV2KuRcWVcGVfGlXHt1fUc13Ncz3FlXO/j2atnr569ejKe53ie43mOJ+PJeDJWxnqO9RwrYz3Hb8/3v9W/e4b3x8P9Wz2rf/cM73yczDsfJ/POx8m883Ey73yczDsfJ/POx8m883Ey73yczDs/Mo6MI+PIODKOjCPjyDgyjowjI2SEjJARMkJGyAgZISNkhIzvd/s73/f544d7eLiHh3t4uIeHe3i4Z17qMy/14eEeP9zjh3v8cI8f7uHhHh7u4eEeP9zjh3v8cO/ouXmpDw/3+OEeP9zjh3v8cI8f7uHhHh7u4eEeP9zjh3v8cO/ouXmpDw/3+OEeP9zjh3v8cI8f7uHhHh7u4eEeP9zjh3v8cO/ouXmpDw/3+OEeP9zjh3v8cI8f7uHhnnmpz7zUh4d7/HAPD/fwcA8P9/BwDw/38HAPD/f44R4/3OOHe+alPvNSHz/c44d7/HAvvr+rPfNSHz/c44d7/HCPH+7xwz1+uMcP98xLfealPn64xw/3+OFefH9Xe+alPn64xw/3+OEeP9zjh3v8cI8f7pmX+sxLffxwjx/u4eEeHu7h4R4e7uHhHh7u4eEeHu7xwz1+uGde6sPDPX64xw/3+OFe6Ll5qQ8P9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HAv9Ny81IeHe/xwjx/u8cM9frjHD/fwcA8P9/Bwjx/u8cM9frgXem5e6sPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9wLPeeHe3i4F85zfrgXem5e6jMv9eHhHh7u4eFefvdwL7/79pd6nnpuXurDw738vs9f6nnquXmpz7zUh4d7eLiHh3t5ZHz37S/1PPXcvNSHh3sZMvQ89dy81Gde6sPDPTzcw8O9dJ6n8zz1PPXcvNSHh3vpPE89Tz03L/WZl/rwcA8P9/BwL0tGeR96zg/3+OEeHu7xwz1+uMcP9/jhHj/cw8M9PNzDwz1+uMcP9/jhXuq5eakPD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xwL/XcvNSHh3v8cI8f7vHDPX64xw/38HAPD/fwcI8f7vHDPX64l3puXurDwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/cKz0vPcfDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9wrPS89x8M9frjHD/f44R4/3OOHe3i4h4d7eLjHD/f44R4/3Cs9Lz3Hwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/cKz0vPcfDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9wrPTcv9eHhHj/c44d7/HCPH+7xwz083MPDPTzc44d7/HCPH+6VnpuX+vBwjx/u8cM9frjHD/f44R4e7uHhHh7u8cM9frjHD/dKz81LfXi4xw/3+OEeP9zjh3v8cA8P9/BwDw/3+OEeP9zjh3ut5+alPjzc44d7/HCPH+7xwz1+uIeHe3i4h4d7/HCPH+7xw73Wc/NSHx7u8cM9frjHD/f44R4/3MPDPTzcw8M9frjHD/f44V7ruXmpDw/38HAPD/fwcI8f7uHhXruH44d7eLiHh3t4uIeHe3883P63+u4Z/ni4f6uxulbP6rtn6I+Tef1xMq8/Tub1x8m8bhkto2W0jJbRMkbGyBgZI2NkjIyRMTJGxsi4Mq6MK+PKuDKujCvjyvC7vX2f88M9PNzDwz083MPDPTzcMy/1mZf68HCPH+7xwz1+uMcP9/BwDw/38HCPH+7xwz1+uNd6bl7qw8M9frjHD/f44R4/3OOHe3i4h4d7eLjHD/f44R4/3Bs9Ny/14eEeP9zjh3v8cI8f7vHDPTzcw8M9PNzjh3v8cI8f7o2em5f68HCPH+7xwz1+uMcP9/jhHh7umZf6zEt9eLjHD/fwcA8P9/BwDw/38HAPD/fwcI8f7vHDPX64Z17qMy/18cM9frjHD/em7ZXznB/u8cM9frjHD/f44R4/3OOHe+alPvNSHz/c44d7/HBvxl45z/nhHj/c44d7/HCPH+7xwz1+uGde6jMv9fHDPX64h4d7eLiHh3t4uIeHe3i4h4d7eLjHD/f44Z55qQ8P9/jhHj/c44d7o+fmpT483OOHe/xwjx/u8cM9friHh3t4uIeHe/xwjx/u8cO9q+fmpT483OOHe/xwjx/u8cM9friHh3t4uIeHe/xwjx/u8cO9q+fmpT483OOHe/xwjx/u8cM9friHh3t4uIeHe/xwjx/u8cO9q+f8cA8P967znB/uXT03L/WZl/rwcA8P9/Bw77qHu+7br55fPTcv9eHh3vV9fvX86rl5qc+81IeHe3i4h4d71z3cdd9+9fzquXmpDw/3ru/zq+dXz81LfealPjzcw8M9PNy7zvPrPL96fvXcvNSHh3vXeX71/Oq5eanPvNSHh3t4uIeHe9c93HXfzg/3+OEeP9zDwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/ce3puXurDwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/ce3puXurDwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/ce3puXurDwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/ce3r+9BwP9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HDv6fnTczzc44d7/HCPH+7xwz1+uIeHe3i4h4d7/HCPH+7xw72n50/P8XCPH+7xwz1+uMcP9/jhHh7u4eEeHu7xwz1+uMcP956ePz3Hwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/cWz03L/Xh4R4/3OOHe/xwjx/u8cM9PNzDwz083OOHe/xwjx/urZ6bl/rwcI8f7vHDPX64xw/3+OEeHu7h4R4e7vHDPX64xw/3Vs/NS314uMcP9/jhHj/c44d7/HAPD/fwcA8P9/jhHj/c44d7q+fmpT483OOHe/xwjx/u8cM9friHh3t4uIeHe/xwjx/u8cO91XPzUh8e7vHDPX64xw/3+OEeP9zDwz083MPDPX64xw/3+OHe6rl5qQ8P9/BwDw/38HCPH+7h4d66h+OHe3i4h4d7eLiHh3t/PNz+t/ruGf54uH+rsmqrsbpWz+rfXcb+fJzM/nyczP58nMz+fJzM/nyczP58nMz+fJzM/nyczP58nMz+/Mg4Mo6MI+PIODKOjCPjyDgyjoyQETJCRsgIGSHj+92+P9/3+fLDLR5u8XCLh1s83OLh1rzUNS918XDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uf8pzlOcoGS2jZbSMlvH1fPFwi4dbPNzywy0/3PLD7c/X8zUvdfFwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnh9ufaq2uvrowr48p4Mp6MZ6+e53ie43mOJ+N5H89ePXu19mplrIyVsTJWxtqr9RzrOb7zfPnhlh9u+eH2fH9XW/NSlx9u+eGWH2754ZYfbvnhlh9uzUtd81KXH2754ZYfbs/3d7U1L3X54ZYfbvnhlh9u+eGWH2754da81DUvdfnhlh9u8XCLh1s83OLhFg+3eLjFwy0ebvnhlh9uzUtdPNzywy0/3PLD7dFz81IXD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH26PnpuXuni45Ydbfrjlh1t+uOWHWzzc4uEWD7f8cMsPt/xwe/TcvNTFwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9uj5/xwi4fbszL0/Oi5ealrXuri4RYPt3i4PSvju2/f0PPQc/NSFw+38X2fb+h56Ll5qWte6uLhFg+3eLiNI+O7b9/Q89Bz81IXD7dxZOh56Ll5qWte6uLhFg+3eLgN53k4z0PPQ8/NS1083IbzPPQ89Ny81DUvdfFwi4dbPNxGySjvQ8/54ZYfbvFwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnhNvTcvNTFwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9vQc/NSFw+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uQ8/NS1083PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uA09Tz3Hwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9vU89RzPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645YdbfrhNPU89x8MtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb1PPUczzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364TT03L3XxcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754Tb13LzUxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb1HPzUhcPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfblPPzUtdPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645YdbfrgtPTcvdfFwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnhtvTcvNTFwy0ebvFwi4dbfrjFw22lDN/neLjFwy0ebvFw+8fD7d+qvnuGPx7u3yqs0qqs2mqsrtWz+u4yqmW0jJbRMlpGy2gZLaNltIyRMTJGxsgYGSNjZIyMkTEyrowr48q4MvxuL9/n/HCLh1s83OLhFg+3eLg1L3XNS1083PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9vSc/NSFw+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uW8/NS1083PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uG09Ny918XDLD7f8cMsPt/xwyw+3eLg1L3XNS1083PLDLR5u8XCLh1s83OLhFg+3eLjlh1t+uOWHW/NS17zU5Ydbfrjlh9tue+U854dbfrjlh1t+uOWHW3645Ydb81LXvNTlh1t+uOWH2x575Tznh1t+uOWHW3645Ydbfrjlh1vzUte81OWHW364xcMtHm7xcIuHWzzc4uEWD7d4uOWHW364NS918XDLD7f8cMsPt63n5qUuHm754ZYfbvnhlh9u+eEWD7d4uMXDLT/c8sMtP9yOnpuXuni45Ydbfrjlh1t+uOWHWzzc4uEWD7f8cMsPt/xwO3puXuri4ZYfbvnhlh9u+eGWH27xcIuHWzzc8sMtP9zyw+3oOT/c4uF2nOf8cDt6bl7qmpe6eLjFwy0ebsc93LhvHz0fPTcvdfFwO77PR89Hz81LXfNSFw+3eLjFw+24hxv37aPno+fmpS4ebsf3+ej56Ll5qWte6uLhFg+3eLgd5/k4z0fPR8/NS1083I7zfPR89Ny81DUvdfFwi4dbPNyOe7hx384Pt/xwyw+3eLjlh1t+uOWHW3645YdbPNzi4RYPt/xwyw+3/HB79dy81MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH26vn5qUuHm754ZYfbvnhlh9u+eEWD7d4uMXDLT/c8sMtP9xePTcvdfFwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnh9ur51XM83PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uL16fvUcD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH26vnl89x8MtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfbq+dXz/Fwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnh9um5eamLh1t+uOWHW3645YdbfrjFwy0ebvFwyw+3/HDLD7dPz81LXTzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364fXpuXuri4ZYfbvnhlh9u+eGWH27xcIuHWzzc8sMtP9zyw+3Tc/NSFw+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9un56bl7p4uOWHW3645Ydbfrjlh1s83OLhFg+3/HDLD7f8cPv03LzUxcMtHm7xcIuHW364xcPtcw/HD7d4uMXDLR5u8XD7x8Ptf6vvnuGPh/tvtT9Wxyqs0qqs2mqsrpUMnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyeLhd3+f8cIuHWzzc4uEWD7d4uDUvdc1LXTzc8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH29Vz81IXD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25Xz81LXTzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364XT03L3XxcMsPt/xwyw+3/HDLD7d4uDUvdc1LXTzc8sMtHm7xcIuHWzzc4uEWD7d4uOWHW3645Ydb81LXvNTlh1t+uOWH2/33d7Xfcak/Vv9l/K7CKq3Kqq3G6lo9q/1WR8a/+/bfVVilVVnJODKOjCPjyPh3nv+uPEd4jvAcIePfffvvaqyu1bOSkTJSRspIGWmv0nOk50jPkTLS+yh7Vfaq7FXJKBklo2SUjLJX5Tnac7TnaBntfbS9anvV9qpltIyWMTJGxtir8RzjOcZzjIzxPsZejb269urKuDKujCvjyrj26nqO6zmu53gynvfx7NWzV89ePRlPxpPxZDwZa6/Wc6znWM+xMtb7WHu19mrt1X4Z5+fH6liFVVqVVVuN1bX6Ms7P9z6Onh89P3r+8XC/Kxl6fvT86PnR86PnR8+Pnp+QEWlVVm01VjJChp4fPT96fvT86PnR86PnJ2XktbJXen70/OPhflcy9Pzo+dHzo+dHz4+eHz3//HC/K+9Dz4+eHz3/eLjflQw9P3p+9Pzo+dHzo+dHzz8/3O/K+9Dzo+dHzz8e7ndQtgw9P3p+9Pzo+dHzo+dHzz8/3O/K+9Dzo+dHzz8e7nclQ8+Pnh89P3p+9Pzo+dHzzw/3u/I+9Pzo+dHzj4f7XcnQ89Dz0PPQ89Dz0PPQ888P97u6Vs/q26vQ84+H+13J0PPQ89Dz0PPQ89Dz0PPPD/e7OlZhlVZlJSNk6Hnoeeh56Hnoeeh56Pnnh/tdtZW90vPQ84+H+x3PLkPPQ89Dz0PPQ89Dz0PPPz/c78r70PPQ89Dzj4f7XcnQ89Dz0PPQ89Dz0PPQ888P97vyPvQ89Dz0/OPhflcy9Dz0PPQ89Dz0PPQ89Pzzw/2uvA89Dz0PPf94uN+VDD0PPQ89Dz0PPQ89Dz3//HC/K+9Dz0PPQ88/Hu53JUPPQ89Dz1PPU89Tz1PPPz/c76qtxupaPSsZR4aep56nnqeep56nnqeef36439X3PlLPU89Tz9Pv9tTzdJ6n8zz1PP1uz5CRMvQ89Tz1PJ3nfzzc/rf6757hd3WtntV+q3+czO/qWIVVWpVVW8koGSWjZLSMltEyWkbLaBkto2W0jJYxMkbGyBgZI2NkjIyRMTJGht/teb3z653reep56nk6z9N5nnqeep56nnqeep56nnqeep56nnr++eF+VzL0PPU89Tz9bv/8cL8rGXqeep56nnpeel56/vnhfldpVVZtNVbXv31WMvS89Lz0vPS89Lz0/PPD/a6u1bP69qr0vPxuL9/npeefH+53JcN5XnpezvNynpeef36435W9SnvlPC+/28v3efk+/3i435UM53k5z8t5Xs7zzw/3u/I+yl6VvXKel9/t5fu8fJ9/frjflQzneTnPy3lezvPPD/e78j7GXo29cp6X3+3l+7x8n39+uN+VDOd5Oc/LeV7O89Lzzw/3u7JX1145z0vPy/d5+T7/eLjflQw9Lz0vPS89//xwvyvvQ89Lz0vPy+/28n1eel56Xnpeel56Xnpeet7u4T4/3O8qrNKqrNq/Hatr9axk6Hnreet563m7h/v8cL+rsbpWz0qG7/PW89bz1vPW89bz1vPW83aet/O89bz1vPW8neftPG89bz1vPW89bz1vPW89b/dwXd6Hnreet5633+3t+7z1vPW89bz1vPW89bz1vN3DdXsfet563nrefre37/PW89bz1vPW89bz1vPW83aet/O89bz1vPW8neftPG89bz1vPW89bz1vPW89b/dw/bwPPW89bz1vv9vb93nreet563nreet563nrebuHa/fto+ej56Pn43f7+D4fPR89Hz0fPR89Hz0fPR/3cOO+ffR89Hz0fPxuH9/no+ej56Pno+ej56Pno+fjd/u4bx89Hz0fPR+/28fv9tHz0fPR89Hz0fPR89HzcQ837ttHz0fPR8/H9/n4Ph89Hz0fPR89Hz0fPR89H/dw47599Hz0fPR8fJ+P7/PR89Hz0fPR89Hz0fPR83EPN+7bR89Hz0fPx+/28bt99Hz0fPR89Hz0fPR89Hzcw4379tHz0fPR8/G7fXyfj56Pno+ej56Pno+ej56Pe7hx3z56Pnp+9fz63X59n189v3p+9fzq+dXzq+dXz697uOu+/er51fOr59fv9uv7/Or51fOr51fPr55fPb96fn2fX9/nV8+vnl89v363X/dwV8+vnl89v3p+9fzq+dXz6x7uum+/en71/Or59bv9uoe7en71/Or51fOr51fPr55f93DXffvV86vnV8+v3+3XPdzV86vnV8+vnl89v3p+9fy6h7vu26+eXz2/en79br96fp3n13l+9fz63X7dw13f51fPr55fPb/O8z8ebv9bffcMfzzcv9VYXatn9d0z3P2xOlZhlVYyVsbKWBkrY7+M9/NjdazCKq3Kqq3G6lo9KxlHxpFxZBwZR8aRcWQcGX63P9/nz/f50/On50/Pn/P8Oc+fnj89f3r+9Pzp+dPzp+dPz5+ePz1/7tuf+/an50/Pn54/v9uf7/On50/Pn54/PX96/vT86flz3/7ctz89f3r+9Pz53f58nz89f3r+9Pzp+dPzp+dPz5/79ue+/en50/On58/v9uf7/On5c9/+nOfPef70/DnPn/P86flzD/fcwz1/V3vO8+d3+/N9/nyfP/dwz3n+nOfPef6c5895/tzDPfftz33783e15zx/frc/3+fP9/m6h1vn+TrP13m+zvN1nq97uHXfvu7b19/V1nm+frev7/P1fb7u4dZ5vs7zdZ6v83yd56vn67593bevv6ut83z1fH2fr+/zdQ+3er56vnq+er56vu7h1t/VVs9Xz1fP1+/29X2+er56vnq+er56vnq+er7u4dbf1VbPV89Xz9fv9vV9vnq+er56vnq+er56vnq+7uHW39VWz1fPV8/X7/b1fb56vnq+er56vnq+er56vs7zdZ6vnq+er56v83yd56vnq+er56vnq+er56vn6x5u3bevnq+er56v3+3r+3z1fPX8m5f6/1/UX88PHu7g4Q4e7vx893Dn57tvPz9fz8/P1/PzzUv9Xck4Mo6MI+PI+Hp+8HAHD3fwcOfnyPjO8/Pz9fz8fD0/37zU35WMkBEyQkbI+Hp+8HAHD3fwcOcnZXz37efzw/2u7FXaq5SRMlJGySgZZa/Kc5TnKM9RMsr7KHtV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0znc54f7Te6Vnqeep9/t6fs89Tz1PPU89Tz1PPU89Tydw31+uN/kXul56nn63Z6+z1PPU89Tz1PPU89Tz1PP0/d5+j5PPU89Tz1Pv9vTOVzqeep56nnqeep56nnqeTqH+/xwv8m90vPU8/S7vZzDlZ6Xnpeel56Xnpeel56Xc7hy3l56Xnpeel5+t5dzuNLz0vPS89Lz0vPS89Lzcg5XzttLz0vPS8/L7/bS8/I+L+/z0vPyu72cw5Xv89Lz0vPS8/I+/8vD/T1/+cvDxX/TMV3TM4UpTWVq05i+s4xKGSkjZaSMlJEyUkbKSBkpo2SUjJJRMkpGySgZJaNklIyW0TJaRsvwu718n5fv89Lz0vPS8/I+L+/z0vPS89Lz0vPS89Lz0vPS89Lz0vNy3l7O20vPS89Lz8vv9vJ9Xnreet563nreet563nreztvbeXvreet563n73d6+z1vPW89bz1vPW89bz1vP23l7O29vPW89bz1vv9vb93nreTtvb+/z9j5vPW/v8/Y+bz1v53DtHK79Xa29z9vv9vZ93r7P2zlce5+393l7n7f3eXuft3O4dt7eztvb39Xa+7z9bm/f5+37vJ3Dtfd5e5+393l7n7f3eTuHa+ft7by9/V2tvc/b7/b2fd6+z9s5XHuft/d5e5+393l7n7eet/P2dt7e/q7W3uet5+37vH2ft3O41vPW89bz1vPW83YO1/6u1nreet563n63t+/z1vPW89bz0fPR89Hz0fNxDjf+rjZ6Pno+ej5+t4/v89Hz0fPR89Hz0fPR89HzcQ43/q42ej56Pno+freP7/PR89Hz0fPR89Hz0fPR8/E+H+/z0fPR89Hz8T4f7/PR89Hz0fPR89Hz0fPR83EON87bR89Hz0fPx+/28X0+ej56Pno+ej56Pno+ej7O4cZ5++j56Pno+fjdPr7PR89Hz0fPR89Hz0fPR8/H+3y8z0fPR89Hz8f7fLzPR89Hz0fPR89Hz0fPR8/HOdw4bx89Hz0fPR+/28f3+ej56Pno+ej56Pnq+er5Oodb5+2r56vnq+frd/v6Pl89Xz1fPV89Xz1fPV89X+dw67x99Xz1fPV8/W5f3+er56vnq+er56vnq+er5+t3+zpvXz1fPV89X7/b1+/21fPV89Xz1fPV89Xz1fN1DrfO21fPV89Xz9f3+fo+Xz1fPV89Xz1fPV89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3nreet5+t7ff7a3nreet563nreet563n4xxunLePno+ej56P7/PxfT56Pno+ej56Pno+ej56Ps7hxnn76Pno+ej5+D4f3+ej56Pno+ej56Pno+ej5+Mcbpy3j56Pno+ej9/t43f76Pno+ej56Pno+ej56Pk4hxvn7aPno+ej5+N3+/g+Hz0fPR89Hz0fPR89Hz0f53DjvH30fPR89Hz8bh/f56Pno+ej56Pno+ej56Pn4xxunLePno+ej56P3+3j+3z0fPR89Hz0fPR89Hz0fHyfj+/z0fPR89Hz8bt9nMONno+ej56Pno+ej56Pno9zuHHevnq+er56vn63r3O41fPV89Xz1fPV89Xz1fN1DrfO21fPV89Xz9fv9nUOt3q+er56vnq+er56vnq+zuHWefvq+er56vn63b56vt7n632+er5+t69zuPV9vnq+er56vt7nf3m4/W/6zhn+8nD/pjK1aUzfOcPiZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcms3+3r+3x9n6+er56vnq/3+Xqfr56vnq+er56vnq+er56vnq+er56v8/Z13r56vl/Pz7cv9Tf9yzifH+43PVOY0lSmNo1pv+nI+M7bz+eH+03PFCYZR8aRcWQcGV/PDx7u4OEOHu58frjflKYytWlMMp6MJ+PJeDKee/Vcx3Mdz3U8Gc/zCPcq3Ktwr0JGyAgZISNkhHsVriNdR7qOlJGeR7pX6V6le5UyUkbKKBklo9yrch3lOsp1lIzyPMq9Kveq3auW0TJaRstoGe1eteto19GuY2SM5zHu1bhX416NjJExMkbGyFj3al3Huo51HStjPY91r9a9Wvfq+91+Pj/cbzqma3qmMKWpTG36Mj4/3E8K98d0TNck48jQ86PnR8+PnuPhDh7u4OHO54f7Tc8UpjSVScaVoedHz4+eHz3Hwx083MHDnc8P95va5F7p+dFzPNw5IUPPj54fPT96joc7eLiDhzsnZaTnoedHz4+e4+HOSRl6fvT86PnRczzcwcMdPNw5JaM8Dz0/en70HA93TsvQ86PnR8+PnuPhDh7u4OHOaRnteej50fOj53i4c0aGnh89P3p+9BwPd/BwBw93zspYz0PPj54fPcfDnc8P95u+jKvnV8+vnuPhDh7u4OHO54f7TW0a03evrp7j4c7nh/tNMvT86vnVczzcwcMdPNz5/HC/6Ziu6ZnCJOPK0POr51fPr57j4Q4e7uDhzueH+01pcq/0/Oo5Hu58frjfJEPPr55fPcfDHTzcwcOdzw/3mzwPPb96fvUcD3c+P9xvkqHnV8+vnuPhDh7u4OHO54f7TZ6Hnl89v3qOhzufH+43ydDzq+dXz/FwBw938HDn88P9Js9Dz6+eXz3Hw53PD/ebZOj51fOr53i4g4c7eLjz+eF+k+eh51fPr57j4c7nh/tNMvT86vnTczzcwcMdPNz5/HC/KU1latOYZBwZev70/On503M83MHDHTzc+fxwv+l7Hk/Pn54/PcfDnc8P95tk6PnT86fneLiDhzt4uPP54X7TM7lXev70HA93Pj/cb5Kh50/Pn57j4Q4e7uDhzueH+02eh54/PX96joc7nx/uN8nQ86fnT8/xcAcPd/Bw5/PD/SbPQ8+fnj89x8Odzw/3m2To+dPzp+d4uIOHO3i48/nhfpPnoedPz5+e4+EOHu7g4Q4e7jw9x8OdNzJGhp7j4Q4e7uDhzl8ebv+b/p0znL883L8pTGkqU5vG9O8s48THyZz4OJkTHydz4uNkTnyczImPkznxcTInPk7mxMfJnPgj48g4Mo6MI+PIODKOjCPjyDgyrowr48q4Mq6MK8Pv9vB9Hr7P8XAHD3fwcAcPd/BwJ/Q89BwPd0LPQ89Dz0PP8XAHD3fwcOfzw/0mGXoeeh56joc74fs89Dz0PPQ89BwPd/BwBw93Pj/cb/r+WxJ6Hnoeeo6HO+H7PPQ89Dz0PPQcD3fwcAcPdz4/3G96JvdKz0PP8XAnfJ+Hnn9+uN8kw/scD3fC+zy8z/Fw5/PD/Sb3atwr73M83MHDHTzcwcOd8D4P7/PwPg/v8/A+T+dwnx/uN13TM4Up/bNlatOYZHifp/d5ep+n93k6h/v8cL+pTG0akwzf5+n7PJ3Dpfd5ep+n93l6n6f3eer554f7ic3dq+deeZ/j4Q4e7uDhDh7u4OFO6nnqeeo5Hu6kc7jPD/eb3Cs9Tz3Hw530fZ56nnqeep56joc7eLiDhzvpHO7zw/0m90rPU8/xcCd9n6eep56nnqee4+EOHu7g4U46h/v8cL/JvdLz1HM83Enf56nnqeep56nneLiDhzt4uJPe5+l9nnqeep56joc76X2eep56nnqeeo6HO3i4g4c76RwunbeXnpeel57j4U75Pi89Lz0vPS89x8MdPNzBw51yDlfO20vPS89Lz/Fwp3yfl56Xnpeel57j4Q4e7uDhTnmfl/d56Xnpeek5Hu6U93npeel56XnpOR7u4OEOHu6Uc7hy3l56Xnpeeo6HO+X7vPS89Lz0vPQcD3fwcAcPd8o5XDlvLz0vPS89x8Od8n1eel56Xnpeeo6HO3i4g4c75RyunLeXnpeel57j4U75Pi89Lz0vPS89x8MdPNzBw53yu72ct5eel56XnuPhTvndXnpeel56XnqOhzt4uIOHO+Ucrpy3l56Xnree4+FO+z5vPW89bz1vPcfDHTzcwcOddg7Xzttbz1vPW8/xcKd9n7eet563nree4+EOHu7g4U47h2vn7a3nreet53i40363t563nreet57j4Q4e7uDhTjuHa+ftreet563neLjTvs9bz1vPW89bz/FwBw938HCnncO18/bW89bz1nM83Gnf563nreet563neLiDhzt4uNPO4dp5e+t563nrOR7utO/z1vPW89bz1nM83MHDHTzcad/n7fu89bz1vPUcD3faOVzreet563nrOR7u4OEOHu60c7h23t563nreeo6HO+McbvR89Hz0fPQcD3fwcAcPd8Y53DhvHz0fPR89x8OdcQ43ej56Pno+eo6HO3i4g4c74xxunLePno+ej57j4Q4e7uDhDh7ujJ7j4c44hxvf53i4g4c7eLiDhzt/ebi/5y9/ebj4bzqma3qmMKWpTG0a03eWMSkjZaSMlJEyUkbKSBkpI2WUjJJRMkpGySgZJaNklIyS0TJaRstoGX63j+/z8X2Ohzt4uIOHO3i4g4c7o+ej53i4M3o+ej56PnqOhzt4uIOHO+O8fZy3j56Pno+e4+HO+D4fPV89Xz1fPcfDHTzcwcOddd6+zttXz1fPV8/xcGd9n6+er56vnq+e4+EOHu7g4c46b1/n7avnq+er53i4s77PV8/Xeft6n6/3OR7urPf5ep/j4c46h8PDHTzcwcP9j6hzSXJkV5bklir8C9//xrpf3kPVGUZlEmC5MRJUUXzwcB883AcP98HDfcf3+fF9fnyfH9/nx/f5cQ53nLcf5+3H72rH9/nx3n78fX78fX6cwx3f58f3+fF9fnyfH9/nxznccd5+nLcfv6sd3+fHe/vx9/nx9/lxDnd8nx/f58f3+fF9fnyfH3N+nLfDw33wcB883AcP98HDffBwHzzcBw/3HXN+zPkx5/Bw33EOd/yudsz5MefHnMPDfcff58ecH3OOHy7wwwU8XMDDBTxc4IcL/HCBHy7+/eY8fvel/t+KjI+Mj4yPjI+M35wHPFzAwwU8XOCHC/xwgR8u/v3mPH73pf7fiowgI8gIMoKM35wHPFzAwwU8XOCHC/xwgR8u/iV7lexVkpFkJBlFRpFR7FXxHMVzFM9RZBSfR7FXxV41e9VkNBlNRpPRZDR71TxH8xzNcwwZw+cx7NWwV8NeDRlDxpAxZAwZy14tz7E8x/IcS8byeSx7tezVsldLxiPjkfHIeGQ89urxHI/neDzHI+PxeRx7dezVsVdHxpFxZBwZR8axV8w5PFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jhIpjzYM7h4QI/XOCHC/xwgR8u8MMFPFzAwwU8XOCHC/xwgR8ugjkP5hweLvDDBX64wA8X+OECP1zAwwU8XMDDBX64wA8X+OEimPNgzuHhAj9c4IcL/HCBHy7wwwU8XMDDBTxc4IcL/HCBHy6COQ/mHB4u8MMFfrjADxf44QI/XMDDBTxcwMMFfrjADxf44SKY82DO4eECP1zghwv8cIEfLvDDBTxcwMMFPFzghwv8cIEfLoI5D+YcHi7g4QIeLuDhAj9cwMNFPDIeGcw5PFzAwwU8XPzxcPe/1X/nDPHHw/1vdf9YfayCVbIqVs1qWC0rMn6cTOSPk4n8cTKRP04m8sfJRP44mcgfJxP542Qif5xM5I+TifxHxkfGR8ZHxkfGR8ZHxkfGR8ZHxkdGkBFk8N6ev7/PAz9cwMMFPFzAwwU8XMDDRTLnyZzDwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jhIpnzZM7h4QI/XOCHC/xwgR8u8MMFPFzAwwU8XOCHC/xwgR8ukjlP5hweLvDDBX64wA8X+OECP1zAwwU8XMDDBX64wA8X+OEimfNkzuHhAj9c4IcL/HCBHy7wwwU8XCTf58n3OTxc4IcLeLiAhwt4uICHC3i4gIcLeLjADxf44QI/XCTf58n3OX64wA8X+OEif7+rRfF9jh8u8MMFfrjADxf44QI/XOCHi+L7vPg+xw8X+OECP1zU73e1KL7P8cMFfrjADxf44QI/XOCHC/xwUXyfF9/n+OECP1zAwwU8XMDDBTxcwMMFPFzAwwU8XOCHC/xwUcw5PFzghwv8cIEfLoo5L+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jhopjzYs7h4QI/XOCHC/xwgR8u8MMFPFzAwwU8XOCHC/xwgR8uijkv5hweLvDDBX64wA8X+OECP1zAwwU8XMDDBX64wA8X+OGimHP8cAEPF8X3OX64KOa8mPNizuHhAh4u4OGijozj82DOizkv5hweLpq/z5s5b+a8mfNmzuHhAh4u4OGiOYfr33l7NHPezHkz5/Bw0fx93sx5M+fNnDdzDg8X8HABDxfN93nzfd7MeTPnzZzDw0Xzfd7MeTPnzZw3cw4PF/BwAQ8XzTlc/87bAz9c4IcL/HABDxf44QI/XOCHC/xwgR8u4OECHi7g4QI/XOCHC/xw0cx5M+fwcIEfLvDDBX64wA8X+OECHi7g4QIeLvDDBX64wA8XzZw3cw4PF/jhAj9c4IcL/HCBHy7g4QIeLuDhAj9c4IcL/HDRzHkz5/BwgR8u8MMFfrjADxf44QIeLuDhAh4u8MMFfrjADxfNnDdzDg8X+OECP1zghwv8cIEfLuDhAh4u4OECP1zghwv8cDHM+TDn8HCBHy7wwwV+uMAPF/jhAh4u4OECHi7wwwV+uMAPF8OcD3MODxf44QI/XOCHC/xwgR8u4OECHi7g4QI/XOCHC/xwMcz5MOfwcIEfLvDDBX64wA8X+OECHi7g4QIeLvDDBX64wA8Xw5wPcw4PF/jhAj9c4IcL/HCBHy7g4QIeLuDhAj9c4IcL/HAxzPkw5/BwgR8u8MMFfrjADxf44QIeLuDhAh4u8MMFfrjADxfDnA9zDg8X+OECP1zghwv8cIEfLuDhAh4u4OECP1zghwv8cDHM+TDn8HCBHy7wwwV+uMAPF/jhAh4u4OECHi7wwwV+uMAPF8ucL3MODxf44QI/XOCHC/xwgR8u4OECHi7g4QI/XOCHC/xwscz5MufwcAEPF/BwAQ8X+OECHi6Wczj8cAEPF/BwAQ8X8HDxx8Pd/1a/c4Y/Hu6/1WP1O2fYHycT++NkYn+cTOyPk4n9cTKxP04mtsgoMoqMIqPJaDKajCajyWgymowmo8loMoaMIWPIGDKGjCFjyBgyhowhg/f25e9z/HABDxfwcAEPF/BwAQ8Xy5wvcw4PF/jhAj9c4IcL/HABDxfwcAEPF/jhAj9c4IeLZc6XOYeHC/xwgR8u8MMFfrjADxfwcAEPF/BwgR8u8MMFfrh4zPljzuHhAj9c4IcL/HCBHy7wwwU8XMDDBTxc4IcL/HCBHy4ec/6Yc3i4wA8X+OECP1zghwv8cAEPF4/v88f3OTxc4IcLeLiAhwt4uICHC3i4gIcLeLjADxf44QI/XDy+zx/f5/jhAj9c4IeLx+9qj+9z/HCBHy7wwwV+uMAPF/jhAj9cPL7PH9/n+OECP1zgh4vH72qP73P8cIEfLvDDBX64wA8X+OECP1w8vs8f3+f44QI/XMDDBTxcwMMFPFzAwwU8XMDDBTxc4IcL/HDxmHN4uMAPF/jhAj9cPOb8MefwcIEfLvDDBX64wA8X+OECHi7g4QIeLvDDBX64wA8Xx5wfcw4PF/jhAj9c4IcL/HCBHy7g4QIeLuDhAj9c4IcL/HBxzPkx5/BwgR8u8MMFfrjADxf44QIeLuDhAh4u8MMFfrjADxfHnOOHC3i4OL7P8cPFMefHnB9zDg8X8HABDxfHOdxx3n7M+THnx5zDw8Xx9/kx58ecH3N+zDk8XMDDBTxcHOdwx3n7MefHnB9zDg8Xx9/nx5wfc37M+THn8HABDxfwcHF8nx/f58ecH3N+zDk8XBzf58ecH3N+zPkx5/BwAQ8X8HBxnMMd5+344QI/XOCHC3i4wA8X+OECP1zghwv8cAEPF/BwAQ8X+OECP1zih8t/vzlP7ktNeLjED5f44RI/XOKHS/xwCQ+X8HAJD5f44RI/XOKHy3+/OU/uS014uMQPl/jhEj9c4odL/HAJD5fwcAkPl/jhEj9c4ofLf8FeJXuVZCQZSUaSkWQke5U8R/IcyXMUGcXnUexVsVfFXhUZRUaRUWQUGc1eNc/RPEfzHE1G83k0e9XsVbNXTcaQMWQMGUPGsFfDcwzPMTzHkDF8HsteLXu17NWSsWQsGUvGkrHs1fIcj+d4PMcj4/F5PPbqsVePvXpkPDIeGUfGkXHs1fEcx3Mcz3FkHJ/HsVfMOfelJjxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw+XHnHNfasLDJX64xA+X+OESP1zih0t4uISHS3i4xA+X+OESP1x+zDn3pSY8XOKHS/xwiR8u8cMlfriEh0t4uISHS/xwiR8u8cPlx5xzX2rCwyV+uMQPl/jhEj9c4odLeLiEh0t4uMQPl/jhEj9cfsw596UmPFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHD5cecc19qwsMlPFzCwyU8XOKHS3i4/JaMJYM5h4dLeLiEh8s/Hu7+t/rvnCH/eLj/VsNqWT1W91v9OJn8fpxMfj9OJr8fJ5PfkXFkHBlHxpHx42QyfpxMxo+TyfhxMhk/Tibjx8lk/DiZjB8nk/HjZDJ+nEzGPzI+Mj4yPjI+Mj4yPjI+Mj4yfu/tGb+/zxM/XMLDJTxcwsMlPFzCwyX3pSb3pSY8XOKHS/xwiR8u8cMlPFzCwyU8XOKHS/xwiR8ugznnvtSEh0v8cIkfLvHDJX64xA+X8HAJD5fwcIkfLvHDJX64DOac+1ITHi7xwyV+uMQPl/jhEj9cwsMlPFzCwyV+uMQPl/jhMphz7ktNeLjED5f44RI/XOKHS/xwCQ+X3Jea3Jea8HCJHy7h4RIeLuHhEh4u4eESHi7h4RI/XOKHS/xwyX2pyX2piR8u8cMlfriMY6/4PscPl/jhEj9c4odL/HCJHy7xwyX3pSb3pSZ+uMQPl/jhMn+/qyX3pSZ+uMQPl/jhEj9c4odL/HCJHy65LzW5LzXxwyV+uISHS3i4hIdLeLiEh0t4uISHS3i4xA+X+OGS+1ITHi7xwyV+uMQPl8mcc19qwsMlfrjED5f44RI/XOKHS3i4hIdLeLjED5f44RI/XCZzzn2pCQ+X+OESP1zih0v8cIkfLuHhEh4u4eESP1zih0v8cJnMOfelJjxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw2Uy5/jhEh4uk+9z/HCZzDn3pSb3pSY8XMLDJTxc5pFxfB7MeTLn3Jea8HCZRwZznsw596Um96UmPFzCwyU8XNbvHC7rd96exZwXc859qQkPl8Xf58WcF3POfanJfakJD5fwcAkPl8X3efF9Xsx5Mefcl5rwcFl8nxdzXsw596Um96UmPFzCwyU8XFaS8TtvT/xwiR8u8cMlPFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHDZTHn3Jea8HCJHy7xwyV+uMQPl/jhEh4u4eESHi7xwyV+uMQPl8Wcc19qwsMlfrjED5f44RI/XOKHS3i4hIdLeLjED5f44RI/XBZzzn2pCQ+X+OESP1zih0v8cIkfLuHhEh4u4eESP1zih0v8cFnMeTHn8HCJHy7xwyV+uMQPl/jhEh4u4eESHi7xwyV+uMQPl82cN3MOD5f44RI/XOKHS/xwiR8u4eESHi7h4RI/XOKHS/xw2cx5M+fwcIkfLvHDJX64xA+X+OESHi7h4RIeLvHDJX64xA+XzZw3cw4Pl/jhEj9c4odL/HCJHy7h4RIeLuHhEj9c4odL/HDZzDn3pSY8XOKHS/xwiR8u8cMlfriEh0t4uISHS/xwiR8u8cNlM+fcl5rwcIkfLvHDJX64xA+X+OESHi7h4RIeLvHDJX64xA+XzZxzX2rCwyV+uMQPl/jhEj9c4odLeLiEh0t4uMQPl/jhEj9cNnPOfakJD5f44RI/XOKHS/xwiR8u4eESHi7h4RI/XOKHS/xwOcw596UmPFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHD5TDn3Jea8HAJD5fwcAkPl/jhEh4uh3M4/HAJD5fwcAkPl/Bw+cfD3f9Wv3OGPx7uv1WxalbDalk9Vr+zjPlxMjk/TianyCgyiowio8goMoqMIqPJaDKajCajyWgymowmo8loMoaMIWPIGDKGjCGD9/bh73P8cAkPl/BwCQ+X8HAJD5fcl5rcl5rwcIkfLvHDJX64xA+X8HAJD5fwcIkfLvHDJX64HOac+1ITHi7xwyV+uMQPl/jhEj9cwsMlPFzCwyV+uMQPl/jhcplz7ktNeLjED5f44RI/XOKHS/xwCQ+X8HAJD5f44RI/XOKHy2XOuS814eESP1zih0v8cIkfLvHDJTxccl9qcl9qwsMlfriEh0t4uISHS3i4hIdLeLiEh0v8cIkfLvHDJfelJvelJn64xA+X+OFy+V2N+1ITP1zih0v8cIkfLvHDJX64xA+X3Jea3Jea+OESP1zih8vldzXuS038cIkfLvHDJX64xA+X+OESP1xyX2pyX2rih0v8cAkPl/BwCQ+X8HAJD5fwcAkPl/BwiR8u8cMl96UmPFzih0v8cIkfLpc5577UhIdL/HCJHy7xwyV+uMQPl/BwCQ+X8HCJHy7xwyV+uFzmnPtSEx4u8cMlfrjED5f44RI/XMLDJTxcwsMlfrjED5f44fIx59yXmvBwiR8u8cMlfrjED5f44RIeLuHhEh4u8cMlfrjED5ePOccPl/Bw+fg+xw+XjznnvtTkvtSEh0t4uISHy8c53OO8/THnjznnvtSEh8vH3+ePOX/MOfelJvelJjxcwsMlPFw+zuEe5+2POX/MOfelJjxcPv4+f8z5Y865LzW5LzXh4RIeLuHh8vF9/vg+f8z5Y865LzXh4fLxff6Y88ecc19qcl9qwsMlPFzCw+XjHO5x3o4fLvHDJX64hIdL/HCJHy7xwyV+uMQPl/BwCQ+X8HCJHy7xwyV+uHzMOfelJjxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw+Ux59yXmvBwiR8u8cMlfrjED5f44RIeLuHhEh4u8cMlfrjED5fHnHNfasLDJX64xA+X+OESP1zih0t4uISHS3i4xA+X+OESP1wec37MOTxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw+Ux58ecw8MlfrjED5f44RI/XOKHS3i4hIdLeLjED5f44RI/XB5zfsw5PFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHD5THnx5zDwyV+uMQPl/jhEj9c4odLeLiEh0t4uMQPl/jhEj9cHnPOfakJD5f44RI/XOGHK/xwhR+u4OEKHq7g4Qo/XOGHK/xw9e8358V9qQUPV/jhCj9c4Ycr/HCFH67g4QoeruDhCj9c4Ycr/HD17zfnxX2pBQ9X+OEKP1zhhyv8cIUfruDhCh6u4OEKP1zhhyv8cPUv2atkr5KMIqPIKDKKjGKviuconqN4jiKj+DyavWr2qtmrJqPJaDKajCaj2avmOYbnGJ5jyBg+j2Gvhr0a9mrIGJ5jeI7lOZaMJWPJWDKW51ieY8lYnuP/5vz+Vu+/c4b64+H+WwWrZFWsmtWwWlaP1f1WR8aRcWQcGUfGkXFkHBlHxo+Tqe/HydT342Tq+3Ey9f04mfp+nEx9P06mvh8nU9+Pk6nvx8nU94+Mj4yPjI+Mj4zfe3t9v7/PCz9cwcMVPFzBwxU8XMHDFfelFvelFjxc4Ycr/HCFH67wwxU8XMHDFTxc4Ycr/HCFH64+5pz7UgservDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OHqY865L7Xg4Qo/XOGHK/xwhR+u8MMVPFzBwxU8XOGHK/xwhR+uPuac+1ILHq7wwxV+uMIPV/jhCj9cwcMV96UW96UWPFzhhyt4uIKHK3i4gocreLiChyt4uMIPV/jhCj9ccV9qcV9q4Ycr/HCFH66+Y6+OvToyjowj48g4Mo694vuc+1KL+1ILP1zhhyv8cBW/39WK+1ILP1zhhyv8cIUfrvDDFX64wg9X3Jda3Jda+OEKP1zBwxU8XMHDFTxcwcMVPFzBwxU8XOGHK/xwxX2pBQ9X+OEKP1zhh6tgzrkvteDhCj9c4Ycr/HCFH67wwxU8XMHDFTxc4Ycr/HCFH66COee+1IKHK/xwhR+u8MMVfrjCD1fwcAUPV/BwhR+u8MMVfrgK5pz7UgservDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OEqmHP8cAUPV8H3OX64Cuac+1KL+1ILHq7g4QoeruKR8fg8mPNgzrkvteDhKo4M5jyYc+5LLe5LLXi4gocreLjK3zlc5e+8vZI5T+ac+1ILHq7y9/d5JXOezDn3pRb3pRY8XMHDFTxcJd/nyfd5MufJnHNfasHDVfJ9nsx5Mufcl1rcl1rwcAUPV/BwlUHG77y98MMVfrjCD1fwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9XyZxzX2rBwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cJXPOfakFD1f44Qo/XOGHK/xwhR+u4OEKHq7g4Qo/XOGHK/xwlcw596UWPFzhhyv8cIUfrvDDFX64gocreLiChyv8cIUfrvDDVTLnyZzDwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cFXNezDk8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MNVMefFnMPDFX64wg9X+OEKP1zhhyt4uIKHK3i4wg9X+OEKP1wVc17MOTxc4Ycr/HCFH67wwxV+uIKHK3i4gocr/HCFH67ww1Ux59yXWvBwhR+u8MMVfrjCD1f44QoeruDhCh6u8MMVfrjCD1fFnHNfasHDFX64wg9X+OEKP1zhhyt4uIKHK3i4wg9X+OEKP1wVc859qQUPV/jhCj9c4Ycr/HCFH67g4QoeruDhCj9c4Ycr/HBVzDn3pRY8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MNVMefcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9XzZxzX2rBwxU8XMHDFTxc4YcreLhqzuHwwxU8XMHDFTxcwcPVHw93/1v9zhn+eLj/rfIfq49VsEpWxapZDatlRUaSUWQUGUVGkVFkFBlFRpFRZBQZTUaT0WQ0GU1Gk9FkNBlNRpMxZAwZvLc3f5/jhyt4uIKHK3i4gocreLjivtTivtSChyv8cIUfrvDDFX64gocreLiChyv8cIUfrvDDVTPn3Jda8HCFH67wwxV+uMIPV/jhCh6u4OEKHq7wwxV+uMIPV82cc19qwcMVfrjCD1f44Qo/XOGHK3i4gocreLjCD1f44Qo/XA1zzn2pBQ9X+OEKP1zhhyv8cIUfruDhivtSi/tSCx6u8MMVPFzBwxU8XMHDFTxcwcMVPFzhhyv8cIUfrrgvtbgvtfDDFX64wg9Xk+wV3+f44Qo/XOGHK/xwhR+u8MMVfrjivtTivtTCD1f44Qo/XE2zV3yf44cr/HCFH67wwxV+uMIPV/jhivtSi/tSCz9c4YcreLiChyt4uIKHK3i4gocreLiChyv8cIUfrrgvteDhCj9c4Ycr/HA1zDn3pRY8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MPVMOfcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9Xy5xzX2rBwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cLXOOH67g4Wr5PscPV8ucc19qcV9qwcMVPFzBw9VyDrecty9zvsw596UWPFwtf58vc77MOfelFvelFjxcwcMVPFwt53DLefsy58ucc19qwcPV8vf5MufLnHNfanFfasHDFTxcwcPV8n2+fJ8vc77MOfelFjxcLd/ny5wvc859qcV9qQUPV/BwBQ9Xyzncct6OH67wwxV+uIKHK/xwhR+u8MMVfrjCD1fwcAUPV/BwhR+u8MMVfrha5pz7UgservDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OHqMefcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9XjznnvtSChyv8cIUfrvDDFX64wg9X8HAFD1fwcIUfrvDDFX64esz5Y87h4Qo/XOGHK/xwhR+u8MMVPFzBwxU8XOGHK/xwhR+uHnP+mHN4uMIPV/jhCj9c4Ycr/HAFD1fwcAUPV/jhCj9c4Yerx5w/5hwervDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OHqMeePOYeHK/xwhR+u8MMVfrjCD1fwcAUPV/BwhR+u8MMVfrh6zDn3pRY8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MPVMefcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9Xx5xzX2rBwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cHXPOfakFD1f44Qo/XOGHK/xwhR+u4OEKHq7g4Qo/XOGHK/xwdcw596UWPFzhhyv8cIUfrvDDFX64gocreLiChyv8cIUfrvDD1THn3Jda8HAFD1fwcAUPV/jhCh6ujnM4/HAFD1fwcAUPV/Bw9cfD3f9Wv3OGPx7uv9Vj9TtnODiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZ+3Ey/e/HyfS/HyfT/36cTP/7cTL978fJ9L8fJ9P/fpxM//txMv3vx8n0v39k/N7b+9/v7/PGD9fwcA0P1/BwDQ/X8HDNfanNfakND9f44Ro/XOOHa/xwDQ/X8HAND9f44Ro/XOOH63/JcyTPkWQkGUlGkpFk/Oa84eEaHq7h4Ro/XOOHa/xw/e835819qQ0P1/jhGj9c44dr/HCNH67h4RoeruHhGj9c44dr/HD9r9mrYa+GjCFjyBgyhoxhr4bnGJ5jeI4lY/k8lr1a9mrZqyVjyVgylowl47FXj+d4PMfjOR4Zj8/jsVePvXrs1SPjyDgyjowj49ir4zmO5zie48j4nbc3frj+fr+rNfelNn64xg/X+OEaP1zjh2v8cI0frrkvtbkvtfHDNX64hodreLiGh2t4uIaHa3i4hodreLjGD9f44Zr7UhservHDNX64xg/XH3POfakND9f44Ro/XOOHa/xwjR+u4eEaHq7h4Ro/XOOHa/xw/THn3Jfa8HCNH67xwzV+uMYP1/jhGh6u4eEaHq7xwzV+uMYP1x9zzn2pDQ/X+OEaP1zjh2v8cI0fruHhGh6u4eEaP1zjh2v8cP0x5/jhGh6uvyWDOf+Yc+5Lbe5LbXi4hodreLj+HhmPz4M5/5hz7ktteLj+HhnM+cecc19qc19qw8M1PFzDw/V3ZByfB3P+Mefcl9rwcB2/v887mPNgzrkvtbkvteHhGh6u4eE6+D4Pvs+DOQ/mnPtSGx6ug+/zYM6DOee+1Oa+1IaHa3i4hofrCDJ+5+2NH67xwzV+uIaHa/xwjR+u8cM1frjGD9fwcA0P1/BwjR+u8cM1frgO5pz7UhservHDNX64xg/X+OEaP1zDwzU8XMPDNX64xg/X+OE6mHPuS214uMYP1/jhGj9c44dr/HAND9fwcA0P1/jhGj9c44frYM65L7Xh4Ro/XOOHa/xwjR+u8cM1PFzDwzU8XOOHa/xwjR+ugzkP5hwervHDNX64xg/X+OEaP1zDwzU8XMPDNX64xg/X+OE6mPNgzuHhGj9c44dr/HCNH67xwzU8XMPDNTxc44dr/HCNH66TOU/mHB6u8cM1frjGD9f44Ro/XMPDNTxcw8M1frjGD9f44TqZ82TO4eEaP1zjh2v8cI0frvHDNTxcw8M1PFzjh2v8cI0frpM5577Uhodr/HCNH67xwzV+uMYP1/BwDQ/X8HCNH67xwzV+uE7mnPtSGx6u8cM1frjGD9f44Ro/XMPDNTxcw8M1frjGD9f44TqZc+5LbXi4xg/X+OEaP1zjh2v8cA0P1/BwDQ/X+OEaP1zjh+tkzrkvteHhGj9c44dr/HCNH67xwzU8XMPDNTxc44dr/HCNH66TOee+1IaHa/xwjR+u8cM1frjGD9fwcA0P1/BwjR+u8cM1frgu5pz7UhseruHhGh6u4eEaP1zDw3V9ZPD3OTxcw8M1PFzDw/UfD3f/W/3OGf54uP9Ww2pZPVa/c4b6cTJdP06m68fJdP04ma4kI8lIMpKMJCPJKDKKjCKjyCgyiowio8goMoqMJqPJaDKajCajyWgymgze24u/z/HDNTxcw8M1PFzDwzU8XHNfanNfasPDNX64xg/X+OEaP1zDwzU8XMPDNX64xg/X+OG6mHPuS214uMYP1/jhGj9c44dr/HAND9fwcA0P1/jhGj9c44frYs65L7Xh4Ro/XOOHa/xwjR+u8cM1PFzDwzU8XOOHa/xwjR+umznnvtSGh2v8cI0frvHDNX64xg/X8HDNfanNfakND9f44RoeruHhGh6u4eEaHq7h4RoervHDNX64xg/X3Jfa3Jfa+OEaP1zjh+tO9orvc/xwjR+u8cM1frjGD9f44Ro/XHNfanNfauOHa/xwjR+uu9grvs/xwzV+uMYP1/jhGj9c44dr/HDNfanNfamNH67xwzU8XMPDNTxcw8M1PFzDwzU8XMPDNX64xg/X3Jfa8HCNH67xwzV+uG7mnPtSGx6u8cM1frjGD9f44Ro/XMPDNTxcw8M1frjGD9f44bqZc+5LbXi4xg/X+OEaP1zjh2v8cA0P1/BwDQ/X+OEaP1zjh+thzrkvteHhGj9c44dr/HCNH67xwzU8XMPDNTxc44dr/HCNH66HOccP1/BwPXyf44frYc65L7W5L7Xh4RoeruHhejiHG87bhzkf5pz7Uhseroe/z4c5H+ac+1Kb+1IbHq7h4RoerodzuOG8fZjzYc65L7Xh4Xr4+3yY82HOuS+1uS+14eEaHq7h4Xr4Ph++z4c5H+ac+1IbHq6H7/Nhzoc5577U5r7UhodreLiGh+vhHG44b8cP1/jhGj9cw8M1frjGD9f44Ro/XOOHa3i4hodreLjGD9f44Ro/XA9zzn2pDQ/X+OEaP1zjh2v8cI0fruHhGh6u4eEaP1zjh2v8cL3MOfelNjxc44dr/HCNH67xwzV+uIaHa3i4hodr/HCNH67xw/Uy59yX2vBwjR+u8cM1frjGD9f44RoeruHhGh6u8cM1frjGD9fLnC9zDg/X+OEaP1zjh2v8cI0fruHhGh6u4eEaP1zjh2v8cL3M+TLn8HCNH67xwzV+uMYP1/jhGh6u4eEaHq7xwzV+uMYP18ucL3MOD9f44Ro/XOOHa/xwjR+u4eEaHq7h4Ro/XOOHa/xwvcz5MufwcI0frvHDNX64xg/X+OEaHq7h4RoervHDNX64xg/Xy5xzX2rDwzV+uMYP1/jhGj9c44dreLiGh2t4uMYP1/jhGj9cP+ac+1IbHq7xwzV+uMYP1/jhGj9cw8M1PFzDwzV+uMYP1/jh+jHn3Jfa8HCNH67xwzV+uMYP1/jhGh6u4eEaHq7xwzV+uMYP1485577Uhodr/HCNH67xwzV+uMYP1/BwDQ/X8HCNH67xwzV+uH7MOfelNjxc44dr/HCNH67xwzV+uIaHa3i4hodr/HCNH67xw/VjzrkvteHhGh6u4eEaHq7xwzU8XD/O4fDDNTxcw8M1PFzDw/UfD3f/W/3OGf54uP9WxapZDatl9Vj9zjLej5Pp9+Nk+j0yHhmPjEfGI+OR8ch4ZBwZR8aRcWQcGUfGkXFkHBlwMgcnc3AyBydzcDIHJ3NwMvBwffx9jh+u4eEaHq7h4RoeruHhmvtSm/tSGx6u8cM1frjGD9f44RoeruHhGh6u8cM1frjGD9fHnHNfasPDNX64xg/X+OEaP1zjh2t4uIaHa3i4xg/X+OEaP1wfc859qQ0P1/jhGj9c44dr/HCNH67h4RoeruHhGj9c44dr/HB9zDn3pTY8XOOHa/xwjR+u8cM1friGh2vuS23uS214uMYP1/BwDQ/X8HAND9fwcA0P1/BwjR+u8cM1frjmvtTmvtTGD9f44Ro/XB+/q3FfauOHa/xwjR+u8cM1frjGD9f44Zr7Upv7Uhs/XOOHa/xwffyuxn2pjR9u8MMNfrjBDzf44QY/3OCHG+5LHe5LHfxwgx9u4OEGHm7g4QYebuDhBh5u4OEGHm7www1+uOG+1IGHG/xwgx9u8MPNv9+cD/elDjzc4Icb/HCDH27www1+uIGHG3i4gYcb/HCDH27ww82/ZK+KvSoyiowio8goMoq9Kp6jeI7iOZqM5vNo9qrZq2avmowmo8loMpqMYa+G5xieY3iOIWP4PIa9GvZq2KshY8lYMpaMJWPZq+U5ludYnmPJWD6Px1499uqxV4+MR8Yj45HxyHjs1eM5juc4nuPIOD6PY6+OvTr26sg4MpjzjznnvtThvtSBhxt4uIGHm+/3fT7f7/t8Pub8Y865L3Xg4eb7yGDOP+ac+1KH+1IHHm7g4QYebr4g43fePvjhBj/c4IcbeLjBDzf44QY/3OCHG/xwAw838HADDzf44QY/3OCHm485577UgYcb/HCDH27www1+uMEPN/BwAw838HCDH27www1+uPmYc+5LHXi4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5uPOee+1IGHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrj5mPOPOYeHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrj5mPOPOYeHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrgJ5jyYc3i4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5tgzoM5h4cb/HCDH27www1+uMEPN/BwAw838HCDH27www1+uAnmnPtSBx5u8MMNfrjBDzf44QY/3MDDDTzcwMMNfrjBDzf44SaYc+5LHXi4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5tgzrkvdeDhBj/c4Icb/HCDH27www083MDDDTzc4Icb/HCDH26COee+1IGHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrgJ5pz7UgcebvDDDX64wQ83+OEGP9zAww083MDDDX64wQ83+OEmmXPuSx14uIGHG3i4gYcb/HADDzf5kfGRwZzDww083MDDzR8Pd3+r+O+cYf54uP9WwSpZFatmNayW1WN1v1WSkWQkGUlGkpFkJBlJRpKRZBQZRUaRUWQUGUVGkVFkFBlFRpPRZDQZTQbv7dl85s1nzpzDww083MDDDTzccF/qcF/qwMMNfrjBDzf44QY/3MDDDTzcwMMNfrjBDzf44SaZc+5LHXi4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5tkzrkvdeDhBj/c4Icb/HCDH27www083MDDDTzc4Icb/HCDH26KOee+1IGHG/xwgx9u8MMNfrjBDzfwcMN9qcN9qQMPN/jhBh5u4OEGHm7g4QYebuDhBh5u8MMNfrjBDzfclzrclzr44QY/3OCHm0r2iu9z/HCDH27www1+uMEPN/jhBj/ccF/qcF/q4Icb/HCDH26q2Cu+z/HDDX64wQ83+OEGP9zghxv8cMN9qcN9qYMfbvDDDTzcwMMNPNzAww083MDDDTzcwMMNfrjBDzfclzrwcIMfbvDDDX64Keac+1IHHm7www1+uMEPN/jhBj/cwMMNPNzAww1+uMEPN/jhpphz7ksdeLjBDzf44QY/3OCHG/xwAw838HADDzf44QY/3OCHm2bOuS914OEGP9zghxv8cIMfbvDDDTzcwMMNPNzghxv8cIMfbpo5xw838HDTfJ/jh5tmzrkvdbgvdeDhBh5u4OGmOYfr33n7NHPezDn3pQ483DR/nzdz3sw596UO96UOPNzAww083DTncF18Hsx5M+fclzrwcNP8fd7MeTPn3Jc63Jc68HADDzfwcNN8nzff582cN3POfakDDzfN93kz582cc1/qcF/qwMMNPNzAw01zDtfD58Gc44cb/HADDzf44QY/3OCHG/xwgx9u4OEGHm7g4QY/3OCHG/xw08w596UOPNzghxv8cIMfbvDDDX64gYcbeLiBhxv8cIMfbvDDTTPn3Jc68HCDH27www1+uMEPN/jhBh5u4OEGHm7www1+uMEPN8Occ1/qwMMNfrjBDzf44QY/3OCHG3i4gYcbeLjBDzf44QY/3AxzPsw5PNzghxv8cIMfbvDDDX64gYcbeLiBhxv8cIMfbvDDzTDnw5zDww1+uMEPN/jhBj/c4IcbeLiBhxt4uMEPN/jhBj/cDHM+zDk83OCHG/xwgx9u8MMNfriBhxt4uIGHG/xwgx9u8MPNMOfDnMPDDX64wQ83+OEGP9zghxt4uIGHG3i4wQ83+OEGP9wMc859qQMPN/jhBj/c4Icb/HCDH27g4QYebuDhBj/c4Icb/HAzzDn3pQ483OCHG/xwgx9u8MMNfriBhxt4uIGHG/xwgx9u8MPNMufclzrwcIMfbvDDDX64wQ83+OEGHm7g4QYebvDDDX64wQ83y5xzX+rAww1+uMEPN/jhBj/c4IcbeLiBhxt4uMEPN/jhBj/cLHPOfakDDzf44QY/3OCHG/xwgx9u4OEGHm7g4QY/3OCHG/xws8w596UOPNzAww083MDDDX64gYeb5RwOP9zAww083MDDDTzc/PFw97/V75zhj4f732r/sfpYBatkVaya1bBaVmQsGY+MR8Yj45HxyHhkPDIeGY+MR8aRcWQcGUfGkXFkHBlHxpHx42Tm/TiZeT9OZuDh5vH3OX64gYcbeLiBhxt4uIGHG+5LHe5LHXi4wQ83+OEGP9zghxt4uIGHG3i4wQ83+OEGP9w85pz7UgcebvDDDX64wQ83+OEGP9zAww083MDDDX64wQ83+OHmMefclzrwcIMfbvDDDX64wQ83+OEGHm7g4QYebvDDDX64wQ83jznnvtSBhxv8cIMfbvDDDX64wQ838HDDfanDfakDDzf44QYebuDhBh5u4OEGHm7g4QYebvDDDX64wQ833Jc63Jc6+OEGP9zgh5vH72rclzr44QY/3OCHG/xwgx9u8MMNfrjhvtThvtTBDzf44QY/3Dx+V+O+1MEPN/jhBj/c4Icb/HCDH27www33pQ73pQ5+uMEPN/BwAw838HADDzfwcAMPN/BwAw83+OEGP9xwX+rAww1+uMEPN/jh5phz7ksdeLjBDzf44QY/3OCHG/xwAw838HADDzf44QY/3OCHm2POuS914OEGP9zghxv8cIMfbvDDDTzcwMMNPNzghxv8cIMfbo45577UgYcb/HCDH27www1+uMEPN/BwAw838HCDH27www1+uDnmHD/cwMPN8X2OH26OOee+1OG+1IGHG3i4gYeb4xzuOG8/5vyYc+5LHXi4Of4+P+b8mHPuSx3uSx14uIGHG3i4Oc7hjvP2Y86POee+1IGHm+Pv82POjznnvtThvtSBh1t4uIWH23+/7/P99/s+33+/Od9/vzlf7ktdeLj99/s+33//yPjI+Mj4zfnCwy083MLD7b+PjN95++KHW/xwix9u4eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbv8le5XsVZKRZCQZSUaSUexV8RzFcxTPUWQUn0exV8VeFXtVZDQZTUaT0WQ0e9U8R/MczXM0Gc3nMezVsFfDXg0ZQ8aQMWQMGcNeDc+xPMfyHEvG8nkse7Xs1bJXS8aSsWQ8Mh4Zj716PMfjOR7P8ch4fB6PvXrs1bFXR8aRcWQcGUfGsVfHcxzPwZzjh1v8cIsfbj/m/GPO4eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbj/m/GPO4eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbj/mnPtSFx5u8cMtfrjFD7f44RY/3MLDLTzcwsMtfrjFD7f44fZjzrkvdeHhFj/c4odb/HCLH27xwy083MLDLTzc4odb/HCLH24/5pz7UhcebvHDLX64xQ+3+OEWP9zCwy083MLDLX64xQ+3+OH2Y865L3Xh4RY/3OKHW/xwix9u8cMtPNzCwy083OKHW/xwix9uP+ac+1IXHm7xwy1+uMUPt/jhFj/cwsMtPNzCwy1+uMUPt/jhNphz7ktdeLiFh1t4uIWHW/xwCw+38Y+MjwzmHB5u4eEWHm7/eLj73+q/c4b94+H+Wz1W91v9OJmNHyez8eNkNn6czMaPk9n4cTIbQUaQEWQEGUlGkpFkJBlJRpKRZCQZSUaSUWQUGUVGkVFkFBlFRpFRZBQZzefRfObNZ86cw8MtPNzCwy083HJf6nJf6sLDLX64xQ+3+OEWP9zCwy083MLDLX64xQ+3+OE2mHPuS114uMUPt/jhFj/c4odb/HALD7fwcAsPt/jhFj/c4ofbYM65L3Xh4RY/3OKHW/xwix9u8cMtPNzCwy083OKHW/xwix9ugznnvtSFh1v8cIsfbvHDLX64xQ+38HDLfanLfakLD7f44RYebuHhFh5u4eEWHm7h4RYebvHDLX64xQ+33Je63Je6+OEWP9zih9v8/a623Je6+OEWP9zih1v8cIsfbvHDLX645b7U5b7UxQ+3+OEWP9xmsVd8n+OHW/xwix9u8cMtfrjFD7f44Zb7Upf7Uhc/3OKHW3i4hYdbeLiFh1t4uIWHW3i4hYdb/HCLH265L3Xh4RY/3OKHW/xwm8w596UuPNzih1v8cIsfbvHDLX64hYdbeLiFh1v8cIsfbvHDbTLn3Je68HCLH27xwy1+uMUPt/jhFh5u4eEWHm7xwy1+uMUPt8mcc1/qwsMtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3BZzjh9u4eG2+D7HD7fFnHNf6nJf6sLDLTzcwsNtBRm/8/Yt5ryYc+5LXXi4Lf4+L+a8mHPuS13uS114uIWHW3i4rSTjd96+xZwXc859qQsPt8Xf58WcF3POfanLfakLD7fwcAsPt8X3efF9Xsx5Mefcl7rwcFt8nxdzXsw596Uu96UuPNzCwy083NaQMXwezDl+uMUPt/Bwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7fFnHNf6sLDLX64xQ+3+OEWP9zih1t4uIWHW3i4xQ+3+OEWP9wWc859qQsPt/jhFj/c4odb/HCLH27h4RYebuHhFj/c4odb/HDbzDn3pS483OKHW/xwix9u8cMtfriFh1t4uIWHW/xwix9u8cNtM+fNnMPDLX64xQ+3+OEWP9zih1t4uIWHW3i4xQ+3+OEWP9w2c97MOTzc4odb/HCLH27xwy1+uIWHW3i4hYdb/HCLH27xw20z582cw8MtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3DZz3sw5PNzih1v8cIsfbvHDLX64hYdbeLiFh1v8cIsfbvHDbTPn3Je68HCLH27xwy1+uMUPt/jhFh5u4eEWHm7xwy1+uMUPt82cc1/qwsMtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3A5zzn2pCw+3+OEWP9zih1v8cIsfbuHhFh5u4eEWP9zih1v8cDvMOfelLjzc4odb/HCLH27xwy1+uIWHW3i4hYdb/HCLH27xw+0w59yXuvBwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7fDnHNf6sLDLTzcwsMtPNzih1t4uB3O4fDDLTzcwsMtPNzCw+0fD3f/W/3OGf54uP9Ww2pZPVa/c4b5cTI7P05m58fJ7Pw4mZ0lY8lYMpaMJWPJeGQ8Mh4Zj4xHxiPjkfHIeGQ8Mo6MI+PIODKOjCPjyDgyeG8f/j7HD7fwcAsPt/BwCw+38HDLfanLfakLD7f44RY/3OKHW/xwCw+38HALD7f44RY/3OKH22XOuS914eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbpc5577UhYdb/HCLH27xwy1+uMUPt/BwCw+38HCLH27xwy1+uF3mnPtSFx5u8cMtfrjFD7f44RY/3MLDLfelLvelLjzc4odbeLiFh1t4uIWHW3i4hYdbeLjFD7f44RY/3HJf6nJf6uKHW/xwix9ul9/VuC918cMtfrjFD7f44RY/3OKHW/xwy32py32pix9u8cMtfrhdflfjvtTFD7f44RY/3OKHW/xwix9u8cMt96Uu96UufrjFD7fwcAsPt/BwCw+38HALD7fwcAsPt/jhFj/ccl/qwsMtfrjFD7f44fYx59yXuvBwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7ePOee+1IWHW/xwix9u8cMtfrjFD7fwcAsPt/Bwix9u8cMtfrh9zDn3pS483OKHW/xwix9u8cMtfriFh1t4uIWHW/xwix9u8cPtY87xwy083D6+z/HD7WPOuS91uS914eEWHm7h4fZxDvc4b3/M+WPOuS914eH28ff5Y84fc859qct9qQsPt/BwCw+3j3O4x3n7Y84fc859qQsPt4+/zx9z/phz7ktd7ktdeLiFh1t4uH18nz++z485P+ac+1IXHm6P7/Njzo85577U5b7UhYdbeLiFh9vjHO44b8cPt/jhFj/cwsMtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3B5zzn2pCw+3+OEWP9zih1v8cIsfbuHhFh5u4eEWP9zih1v8cHvMOfelLjzc4odb/HCLH27xwy1+uIWHW3i4hYdb/HCLH27xw+0x59yXuvBwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7fHnB9zDg+3+OEWP9zih1v8cIsfbuHhFh5u4eEWP9zih1v8cHvM+THn8HCLH27xwy1+uMUPt/jhFh5u4eEWHm7xwy1+uMUPt/eb8/fvN+cPHu7hh3v44R5+uIcf7uGHe/BwDx7uwcM9/HAPP9zDD/f+/eb8/fvN+YOHe/jhHn64hx/u4Yd7+OEePNyDh3vwcA8/3MMP9/DDvX+/OX/cl/rg4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cO9fsVfFXhUZRUaRUWQUGcVeFc/RPEfzHE1G83k0e9XsVbNXTUaT0WQMGUPGsFfDcwzPMTzHkDF8HsNeDXu17NWSsWQsGUvGkrHs1fIcy3Msz/HIeHwej7167NVjrx4Zj4xHxiPjkXHs1fEcx3Mcz3FkHJ/HsVfHXh179Xtvf/BwDx7uwcM9/HAPHu59v3O4hx/uwcM9eLgHD/fg4d4fD3f/W/13zvD+eLj/VsWqWQ2rZfVY3W/142Te9+Nk3hdkBBlBRpARZAQZQUaQkWQkGUlGkpFkJBlJRpKRZCQZRUaRUWQUGUVGkVF8Hr+/zx9+uAcP9+DhHjzcg4d78HCP+1If96U+eLiHH+7hh3v44R5+uAcP9+DhHjzcww/38MM9/HDvY865L/XBwz38cA8/3MMP9/DDPfxwDx7uwcM9eLiHH+7hh3v44d7HnHNf6oOHe/jhHn64hx/u4Yd7+OEePNyDh3vwcA8/3MMP9/DDvY85577UBw/38MM9/HAPP9zDD/fwwz14uMd9qY/7Uh883MMP9+DhHjzcg4d78HAPHu7Bwz14uIcf7uGHe/jhHvelPu5LffjhHn64hx/uxe93tcd9qQ8/3MMP9/DDPfxwDz/cww/38MM97kt93Jf68MM9/HAPP9yLZK/4PscP9/DDPfxwDz/cww/38MM9/HCP+1If96U+/HAPP9yDh3vwcA8e7sHDPXi4Bw/34OEePNzDD/fwwz3uS33wcA8/3MMP9/DDvWDOuS/1wcM9/HAPP9zDD/fwwz38cA8e7sHDPXi4hx/u4Yd7+OFeMOfcl/rg4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cC+Yc+5LffBwDz/cww/38MM9/HAPP9yDh3vwcA8e7uGHe/jhHn64l8w5frgHD/eS73P8cC+Zc+5LfdyX+uDhHjzcg4d7+ZHxO29/yZwnc859qQ8e7mWQwZwnc859qY/7Uh883IOHe/BwL5OM33n7S+Y8mXPuS33wcC+TDOY8mXPuS33cl/rg4R483IOHe8n3efJ9nsx5Mufcl/rg4V7yfZ7MeTLn3Jf6uC/1wcM9eLgHD/dyyBg+D+YcP9zDD/fg4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cC+Zc+5LffBwDz/cww/38MM9/HAPP9yDh3vwcA8e7uGHe/jhHn64l8w596U+eLiHH+7hh3v44R5+uIcf7sHDPXi4Bw/38MM9/HAPP9wr5pz7Uh883MMP9/DDPfxwDz/cww/34OEePNyDh3v44R5+uIcf7hVzXsw5PNzDD/fwwz38cA8/3MMP9+DhHjzcg4d7+OEefriHH+4Vc17MOTzcww/38MM9/HAPP9zDD/fg4R483IOHe/jhHn64hx/uFXNezDk83MMP9/DDPfxwDz/cww/34OEePNyDh3v44R5+uIcf7hVzXsw5PNzDD/fwwz38cA8/3MMP9+DhHjzcg4d7+OEefriHH+4Vc859qQ8e7uGHe/jhHn64hx/u4Yd78HAPHu7Bwz38cA8/3MMP94o5577UBw/38MM9/HAPP9zDD/fwwz14uAcP9+DhHn64hx/u4Yd7zZxzX+qDh3v44R5+uIcf7uGHe/jhHjzcg4d78HAPP9zDD/fww71mzrkv9cHDPfxwDz/cww/38MM9/HAPHu7Bwz14uIcf7uGHe/jhXjPn3Jf64OEefriHH+7hh3v44R5+uAcP9+DhHjzcww/38MM9/HCvmXPuS33wcA8e7sHDPXi4hx/uwcO95hwOP9yDh3vwcA8e7sHDvT8e7u/85Y+Hq/+tPlbBKlkVq2Y1rJbVY/U7y+glY8lYMpaMJWPJWDKWjCVjyXhkPDIeGY+MR8Yj45HxyHhkPDKOjCPjyDgyeG9v/j7HD/fg4R483IOHe/BwDx7ucV/q477UBw/38MM9/HAPP9zDD/fg4R483IOHe/jhHn64hx/uDXPOfakPHu7hh3v44R5+uIcf7uGHe/BwDx7uwcM9/HAPP9zDD/eGOee+1AcP9/DDPfxwDz/cww/38MM9eLgHD/fg4R5+uIcf7uGHe8Occ1/qg4d7+OEefriHH+7hh3v44R483OO+1Md9qQ8e7uGHe/BwDx7uwcM9eLgHD/fg4R483MMP9/DDPfxwj/tSH/elPvxwDz/cww/3Ztkrvs/xwz38cA8/3MMP9/DDPfxwDz/c477Ux32pDz/cww/38MO9eewV3+f44R5+uIcf7uGHe/jhHn64hx/ucV/q477Uhx/u4Yd78HAPHu7Bwz14uAcP9+DhHjzcg4d7+OEefrjHfakPHu7hh3v44R5+uLfMOfelPni4hx/u4Yd7+OEefriHH+7Bwz14uAcP9/DDPfxwDz/cW+ac+1IfPNzDD/fwwz38cA8/3MMP9+DhHjzcg4d7+OEefriHH+4tc859qQ8e7uGHe/jhHn64hx/u4Yd78HAPHu7Bwz38cA8/3MMP95Y5xw/34OHe8n2OH+4tc859qY/7Uh883IOHe/BwbzmHW87blzlf5pz7Uh883Fv+Pl/mfJlz7kt93Jf64OEePNyDh3vLOdxy3r7M+TLn3Jf64OHe8vf5MufLnHNf6uO+1AcP9+DhHjzcW77Pl+/zZc6XOee+1AcP9x7f5485f8w596U+7kt98HAPHu7Bw73HOdzjvB0/3MMP9/DDPXi4hx/u4Yd7+OEefriHH+7Bwz14uAcP9/DDPfxwDz/ce8w596U+eLiHH+7hh3v44R5+uIcf7sHDPXi4Bw/38MM9/HAPP9x7zDn3pT54uIcf7uGHe/jhHn64hx/uwcM9eLgHD/fwwz38cA8/3HvMOfelPni4hx/u4Yd7+OEefriHH+7Bwz14uAcP9/DDPfxwDz/ce8z5Y87h4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cO8x5485h4d7+OEefriHH+7hh3v44R483IOHe/BwDz/cww/38MO9x5w/5hwe7uGHe/jhHn64hx/u4Yd78HAPHu7Bwz38cA8/3MMP9445P+YcHu7hh3v44R5+uIcf7uGHe/BwDx7uwcM9/HAPP9zDD/eOOee+1AcP9/DDPfxwDz/cww/38MM9eLgHD/fg4R5+uIcf7uGHe8ecc1/qg4d7+OEefriHH+7hh3v44R483IOHe/BwDz/cww/38MO9Y865L/XBwz38cA8/3MMP9/DDPfxwDx7uwcM9eLiHH+7hh3v44d4x59yX+uDhHn64hx/u4Yd7+OEefrgHD/fg4R483MMP9/DDPfxw75hz7kt98HAPP9zDD/fwwz38cA8/3IOHe/BwDx7u4Yd7+OEefrh3zDn3pT54uAcP9+DhHjzcww938HD373cOd/jhDh7u4OEOHu7g4e6Ph7v/rf47Z7g/Hu5/q+8fq49VsEpWxapZDatlRcZHRpARZAQZQUaQEWQEGUFGkBFkJBlJRpKRZCQZSUaSkWQkGUlGkVFkFJ/H7+/zww938HAHD3fwcAcPd/Bwx32px32pBw93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7t/w3MMzzFkDBlDxpAxZPzm/ODhDh7u4OEOP9zhhzv8cPfvN+fHfakHD3f44Q4/3OGHO/xwhx/u4OEOHu7g4Q4/3OGHO/xw9+/Yq2Ovjowj48g4Mo6MY6+Yc+5LPe5LPXi4ww938HAHD3fwcAcPd/BwBw938HCHH+7wwx1+uOO+1OO+1MMPd/jhDj/cfb/f1Y77Ug8/3OGHO/xwhx/u8MMdfrjDD3fcl3rcl3r44Q4/3OGHuy/Zq2SvkowkI8lIMpKMYq+K5yieo3gO5hw/3MHDHTzcwcMdPNzBwx083MHDHTzc4Yc7/HDHfakHD3f44Q4/3OGHu485577Ug4c7/HCHH+7wwx1+uMMPd/BwBw938HCHH+7wwx1+uPuYc+5LPXi4ww93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7uPOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrgL5hw/3MHDXfB9jh/ugjnnvtTjvtSDhzt4uIOHu/jI+J23XzDnwZxzX+rBw10EGcx5MOfcl3rcl3rwcAcPd/BwF0HG77z9gjkP5pz7Ug8e7iLJYM6DOee+1OO+1IOHO3i4g4e74Ps8+D4P5jyYc+5LPXi4C77PgzkP5pz7Uo/7Ug8e7uDhDh7uosloPg/mHD/c4Yc7eLjDD3f44Q4/3OGHO/xwBw938HAHD3f44Q4/3OGHu2DOuS/14OEOP9zhhzv8cIcf7vDDHTzcwcMdPNzhhzv8cIcf7oI5577Ug4c7/HCHH+7wwx1+uMMPd/BwBw938HCHH+7wwx1+uEvmnPtSDx7u8MMdfrjDD3f44Q4/3MHDHTzcwcMdfrjDD3f44S6Z82TO4eEOP9zhhzv8cIcf7vDDHTzcwcMdPNzhhzv8cIcf7pI5T+YcHu7wwx1+uMMPd/jhDj/cwcMdPNzBwx1+uMMPd/jhLpnzZM7h4Q4/3OGHO/xwhx/u8MMdPNzBwx083OGHO/xwhx/ukjlP5hwe7vDDHX64ww93+OEOP9zBwx083MHDHX64ww93+OEumXPuSz14uMMPd/jhDj/c4Yc7/HAHD3fwcAcPd/jhDj/c4Ye7ZM65L/Xg4Q4/3OGHO/xwhx/u8MMdPNzBwx083OGHO/xwhx/ukjnnvtSDhzv8cIcf7vDDHX64ww938HAHD3fwcIcf7vDDHX64K+ac+1IPHu7wwx1+uMMPd/jhDj/cwcMdPNzBwx1+uMMPd/jhrphz7ks9eLjDD3f44Q4/3OGHO/xwBw938HAHD3f44Q4/3OGHu2LOuS/14OEOHu7g4Q4e7vDDHTzcVZHB3+fwcAcPd/BwBw93fzzc/W/1O2f44+H+Wz1Wv3OG+nEyVz9O5urHyVz9OJmrHydz9eNkroaMIWPIGDKWjCVjyVgylowlY8lYMpaMJeOR8ch4ZDwyHhmPjEfGI+OR8cjgvb34+xw/3MHDHTzcwcMdPNzBwx33pR73pR483OGHO/xwhx/u8MMdPNzBwx083OGHO/xwhx/umjnnvtSDhzv8cIcf7vDDHX64ww938HAHD3fwcIcf7vDDHX64a+ac+1IPHu7wwx1+uMMPd/jhDj/cwcMdPNzBwx1+uMMPd/jhrplz7ks9eLjDD3f44Q4/3OGHO/xwBw933Jd63Jd68HCHH+7g4Q4e7uDhDh7u4OEOHu7g4Q4/3OGHO/xwx32px32phx/u8MMdfrjrYa/4PscPd/jhDj/c4Yc7/HCHH+7wwx33pR73pR5+uMMPd/jhrh97xfc5frjDD3f44Q4/3OGHO/xwhx/uuC/1uC/18MMdfriDhzt4uIOHO3i4g4c7eLiDhzt4uMMPd/jhjvtSDx7u8MMdfrjDD3fDnHNf6sHDHX64ww93+OEOP9zhhzt4uIOHO3i4ww93+OEOP9wNc859qQcPd/jhDj/c4Yc7/HCHH+7g4Q4e7uDhDj/c4Yc7/HA3zDn3pR483OGHO/xwhx/u8MMdfriDhzt4uIOHO/xwhx/u8MPdMOf44Q4e7obvc/xwN8w596Ue96UePNzBwx083A3ncMN5+zDnw5xzX+rBw93w9/kw58Occ1/qcV/qwcMdPNzBw91wDjectw9zPsw596UePNwNf58Pcz7MOfelHvelHjzcwcMdPNwN3+fD9/kw58Occ1/qwcPd8H0+zPkw59yXetyXevBwBw938HC3nMMt5+344Q4/3OGHO3i4ww93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7tlzrkv9eDhDj/c4Yc7/HCHH+7wwx083MHDHTzc4Yc7/HCHH+6WOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrhb5pz7Ug8e7vDDHX64ww93+OEOP9zBwx083MHDHX64ww93+OFumfNlzuHhDj/c4Yc7/HCHH+7wwx083MHDHTzc4Yc7/HCHH+6WOV/mHB7u8MMdfrjDD3f44Q4/3MHDHTzcwcMdfrjDD3f44W6Z82XO4eEOP9zhhzv8cIcf7vDDHTzcwcMdPNzhhzv8cIcf7h5z/phzeLjDD3f44Q4/3OGHO/xwBw938HAHD3f44Q4/3OGHu8ecc1/qwcMdfrjDD3f44Q4/3OGHO3i4g4c7eLjDD3f44Q4/3D3mnPtSDx7u8MMdfrjDD3f44Q4/3MHDHTzcwcMdfrjDD3f44e4x59yXevBwhx/u8MMdfrjDD3f44Q4e7uDhDh7u8MMdfrjDD3ePOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrh7zDn3pR483OGHO/xwhx/u8MMdfriDhzt4uIOHO/xwhx/u8MPdY865L/Xg4Q4e7uDhDh7u8MMdPNw9zuHwwx083MHDHTzcwcPdHw93/1v9zhn+eLj/VsNqWT1Wv3OGg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4GXi4O/4+xw938HAHD3fwcAcPd/Bwx32px32pBw93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7tjzrkv9eDhDj/c4Yc7/HCHH+7wwx083MHDHTzc4Yc7/HCHH+6OOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrg75pz7Ug8e7vDDHX64ww93+OEOP9zBwx33pR73pR483P38cN+/fz8g7m/5uQyX/8v5W5bLdjku1+VzeSz/+2r/W34uTfvv9P1vWS7b5bg07TPtMy1MC9P++5r/W/ps4bOFzxam/XcW/7d8Lt3JdCfTtDQtTUvT0rR0J9NnS58tfbYyrfzcyp0sd7LcyTKtTCvTyrQyrd3J9tnaZ2ufrU1rP7d2J9udbHeyTRvTxrQxbUwbd3J8tvHZxmcb08bPbd3JdSfXnVzT1rQ1bU1b09adXJ/t+WzPZ3umPT+3504+d/K5k8+0Z9oz7Uw7086dPJ/tfLbz2c6083M7d9Iu+eySH3X3twyX6bJctstxuS6fS57t+0z7PpfhMl2WS9M+0+ySzy757JLPLvnsks8u+eySL0yLdjku1+VzaVqaZpd8dslnl3x2yWeXfHbJZ5d8aVr6udkln13y2SU/Pu9vaZpd8tkln13y2SWfXfLZJZ9d8rVp7edml3x2yWeX/Gi9v6Vpdslnl3x2yWeXfHbJZ5d8dslPY/e39HOzSz675LNLfuze39I0u+SzSz675LNLPrvks0s+u+Qntftb+rnZJZ9d8tklP5Lvb2maXfLZJZ9d8tkln13y2SWfXfJT3P0t/dzsks8u+eySH9f3/d9X9z+Xn8twmS7LZbscl+uStJ/x7v+WdknYJWGX/Ci/v6VpdknYJWGXhF0SdknYJWGX/PR3f8t0WS7b5bg0LUyzS8IuCbsk7JKwS8IuCbvkJ8P7W65Ld9IuCbvkRwD+LU2zS8IuCbsk7JKwS8IuCbvkp8b7W/q52SVhl4Rd8uMB/5am2SVhl4RdEnZJ2CVhl4Rd8hPl/S393OySsEvCLvnRgf+3XNPskrBLwi4JuyTskrBLwi75afP+ln5udknYJWGX/FjBv6VpdknYJWGXhF0SdknYJWGX/CR6f0s/N7sk7JKwS37k4N/SNLsk7ZK0S9IuSbsk7ZK0S35Kvb/lunwu2cm0S9K/cX5ivb+laXZJ2iVpl6RdknZJ2iU/wd7f8nMZLtNluTQtTLNL0i5JuyTtkrRL0i5Ju+Sn2/tbtkt30i5JuyT9GyftkvS9JH0vSbsk/Rsny7QyzS5JuyTtkvS95I83vP+W/zvI+Vumy3LZLsflunwuj+V/QNLf8nNp2pg2po1pY9qYNqaNaWvamramrWlr2pq2pq1pa9qa9kx7pj3TnmnPtGeaf+Pk83/J83+JXZJ2Sdol6XtJ+l6SdknaJWmXpF2SdknaJWWXlF1SdknZJT9p39+yXY7LdflcmuZ5SdklZZeUXVJ2SdklZZeUXfJT+P0taa6yS8ouKbuk/BunPC8pu6TskrJLyi4pu6TskrJLfkK/v2W6dCftkrJLyr9xyvOSskt+Yr+/pWm+l5RdUr6XlO8lZZf8/H5/S3ey3EnfS8q/ccrzkvK85Ic1/i1N872kfC8p30vK95Kf7O9v6ec27uS4k76XlH/jlOcl5XnJT/r3tzTN95LyvaR8LynfS37qv7+ln9u6k+tO+l5S/o1TnpeU5yU/BeDf0jTfS8r3kvK9pHwvKbvkZwL8v+W5k+dO+l5Sdkl5XlKel/wAyL+laXZJ2SVtl7Rd0p69/ryAf8ty2S7H5fovPJem2SVtl7Rd0nZJ2yVtl7Rnrz9L4N/yuWQn2y5p/8Zpz0vaLmm7pO2StkvaLmm7pO2S9uz15wz8W7qTdknbJe3fOO15SdslbZe0XdJ2SdslbZe0XdK+l7TvJW2XtF3Sdkn7XtK+l7Rd0nZJ2yVtl7Rd0nZJ2yXt2Wu3n5td0nZJ2yXt3zjteUnbJW2XtF3SdknbJW2XtF3Snr32+rnZJW2XtF3S/o3Tnpe0XdJ2SdslbZe0XdJ2Sdsl7XtJ+17SdknbJW2XtO8l7XtJ2yVtl7Rd0nZJ2yVtl7RdMp69jr/jjF0ydsnYJePfOON5ydglY5eMXTJ2ydglY5eMXTKevY6/44xdMnbJ2CXj3zjjecnYJWOXjF0ydsnYJWOXjF0ynr2Ov+OMXTJ2ydgl498443nJ2CVjl4xdMnbJ2CVjl4xdMv6NM/6OM3bJ2CVjl4x/44x/44xdMnbJ2CVjl4xdMnbJ2CXj2ev4O87YJWOXjF0ynpeM5yVjl4xdMnbJ2CVjl4xdMnbJePY6/o4zdsnYJWOXjOcl43nJ2CVjl4xdMnbJ2CVjl4xdMp69jr/jjF0ydsnYJePfOOPfOGOXjF0ydsnYJWOXjF0ydsl49jr+jrN2ydola5esf+Os5yVrl6xdsnbJ2iVrl6xdsnbJeva6/o6zdsnaJWuXrH/jrOcla5esXbJ2ydola5esXbJ2yXr2uv6Os3bJ2iVrl6x/46znJWuXrF2ydsnaJWuXrF2ydsl6XrKel6xdsnbJ2iXr3zjr2evaJWuXrF2ydsnaJWuXrF2ynr2uv+OsXbJ2ydol698469nr2iVrl6xdsnbJ2iVrl6xdsp69rr/jrF2ydsnaJevfOOvZ69ola5esXbJ2ydola5esXbKeva6/46xdsnbJ2iXr3zhrl6zvJet7ydol698469nrel6ydsnaJWuXrO8lf7zo/87P/oDR+m/5uQyX6bJctstxuS6fS06e3mfaZ9pn2mfaZ9pn2mfaZ9pn2mdamBamhWlhWpgWpoVpYVqYFqalaWlampam+TfO87zkeV7y7JJnlzy75Ple8nwveXbJs0ueXfLskmeXPLvk2SXPLnl2ybNLnr/jPH/HeXbJs0ueXfL8G+d5XvLskmeXPLvk2SXPLnl2ybNLnr/jPH/HeXbJs0ueXfL8G+d5XvLskmeXPLvk2SXPLnl2ybNLnr/jPH/HeXbJs0ueXfL8G+d5XvLskufvOM/3kud7ybNLnu8lz/eSZ5c8z16fZ6/P34Sf7yXPv3HO85LzvOQ8ez3fS873kvO95HwvOd9LzrPX83ec83ec8zfh873k/BvnPC85z0vOs9fzveR8LznfS873kvO95Dx7PX/HOX/HOX8TPt9Lzr9xzvOS87zkPHs930vO95LzveR8LznfS84uOX/HOX/HOX8TPt9Lzi45z0vO85Lz7PXskrNLzi45u+TskvPs9fxN+OySs0vOLjn/xjnPS84uObvk7JKzS84uObvk7JLz7PX8TfjskrNLzi45/8Y5z0vOLjm75OySs0vOLjm75OyS8+z1/E347JKzS84uOf/GOc9Lzi45u+TskrNLzi45u+TskvO95HwvObvk7JKzS873kvO95OiS7x9d8v2jS75/dMkn9/rJvX5yr98/zl6/f/yO8/2jS75/dMn3jy755F6/f59pn2mfaZ9pdMkn9/rJvX5yr9+/MI3fcb5/dMn3jy75/tEln9zr9y9MC9PCtDAt3cn02dJnS58tTeO95PuX7mS6k+lOpmllWplWppVp5U6Wz1Y+W/lsZVr5ubU72e5ku5NtWpvWprVpbVq7k+2zjc82PtuYNn5u406OOznu5Jg2po1pa9qatu7k+mzrs63Ptqatn9u6k+tOPnfymfZMe6Y9055pz518Ptvz2Z7Pdqadn9u5k+dOnjt5pp1pZ9qZZpd8donc6yf3+sm9fh9nr9/H7zjfZ5d8dslnl8i9ft9nml3y2SWfXfLZJXKvn9zrJ/f6fZ9p/I7zfXbJZ5d8donc6/eFaXbJZ5d8dslnl8i9fnKvn9zr96Vp/I7zfXbJZ5d8donc6/elaXbJZ5d8dslnl8i9fnKvn9zr95Vp5edml3x2yWeXyL1+X5tml3x2yWeXfHaJ3Osn9/rJvX7fmDZ+bnbJZ5d8donc6/eNaXbJZ5d8dslnl8i9fnKvn9zr961p6+dml3x2yWeXyL1+3zPNLvnsks8u+ewSuddP7vWTe/2+Z9rzc7NLPrvks0vkXr/vTLNLPrvks0s+u0Tu9ZN7/eRev+Ds9Qt+x/nCLgm7JOwSudcvOHv9wi4JuyTskrBL5F4/uddP7vWLzzR+x/nCLgm7JOwSudcvwjS7JOySsEvCLpF7/eReP7nXL9I0fsf5wi4JuyTsErnXT+71k3v95F6/sEvkXr8o08o0u0Tu9ZN7/eRevz/u9f5b/s6Cvj/u9b9l/3P5uQyX6bJctstxuS5Na9PGtDFtTBvTxrQxbUwb08a0MW1NW9PWtDVtTVvT1rQ1bU1b055pz7Tn5/b8X/L8X2KXyL1+cq+f3Osn9/qFXRJ2idzrF3ZJ2CVhl4RdIvf6yb1+cq9f8jvOl/yO86VdknZJ2iVyr19yXvKlXZJ2SdolaZfIvX5yr5/c65efafyO86VdknZJ2iVyr1+GaXZJ2iVpl6RdIvf6yb1+cq9fhmn8jvOlXZJ2Sdolcq9fpml2SaZpvpek7yVyr1/6XpK+l8i9fll+buVOljvpe4nc6yf3+sm9fnKvX/pekr6XpO8l6XtJ+l6SbVr7ubU72e6k7yXp3zg5po1pY5rvJel7Sfpekr6XpO8luaatn9u6k+tO+l6S/o2Ta9qatqb5XpK+l6TvJel7SfpeknZJPj+3504+d9L3ErnXT+71k3v95F4/udcv7ZK0S9IukXv98kzjN+Gv7JKyS8oukXv9yvOSskvKLim7pOwSuddP7vWTe/3qM43fhL+yS8ouKbtE7vUrz0vKLim7pOySskvkXj+510/u9aswjd+Ev7JLyi4pu0Tu9SvPS8ouKbuk7JKyS+ReP7nXT+71K99LyveSskvKLim7RO71K99Lyi4pu6TskrJL5F4/uddP7vWrNq393OySskvKLpF7/crzkrJLyi4pu6TsErnXT+71k3v9akwbPze7pOySskvkXr/yvKTskrJLyi4pu0Tu9ZN7/eRev/K9pHwvKbuk7JKyS+Rev/K9pOySskvKLim7RO71k3v95F6/OtPOz80uKbuk7RK51689L2m7pO2StkvaLpF7/eReP7nXrz17bX7H+douabuk7RK51689L2m7pO2StkvaLpF7/eReP7nXrz17bX7H+douabuk7RK51689L2m7pO2StkvaLpF7/eReP7nXr/0bp9PPzS5pu6TtErnXr/0bp+2StkvaLmm7RO71k3v95F6/9uy128/NLmm7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+51689e+3xc7NL2i5pu0Tu9WvPS9ouabuk7ZK2S+ReP7nXT+71a89e+/m52SVtl7RdIvf6tX/jtF3SdknbJW2XyL1+cq+f3OvXnr32+bnZJW2XtF0i9/qN5yVjl4xdMnbJ2CVyr5/c6yf3+o1nr+PvOGOXjF0ydonc6zeel4xdMnbJ2CVjl8i9fnKvn9zrN569jr/jjF0ydsnYJXKv33heMnbJ2CVjl4xdIvf6yb1+cq/feF4ynpeMXTJ2ydglcq/fePY6dsnYJWOXjF0i9/rJvX5yr9949jr+jjN2ydglY5fIvX7j2evYJWOXjF0ydonc6yf3+sm9fuPZ6/g7ztglY5eMXSL3+o1nr2OXjF0ydsnYJXKvn9zrJ/f6jWev4+84Y5eMXTJ2idzrJ/f6yb1+cq/f2CVyr9949jqel8i9fnKvn9zrJ/f6/XGv99+Ss6A/7vW3fC45C1pYtW9h1b6FVfsWVu1bWLVvYdW+hVX7FlbtW1i1b/+Z9pn2mfaZ9pn2mfaZ9pn2mfaZ9pkWpoVpYVqYFqaFaWFamBamhWn+jbOel6znJXKvn9zrJ/f6yb1+cq/f2iVrl8i9fmuXrF2ydsnaJXKvn9zrJ/f6rb/jrL/jrF2ydsnaJXKv33pesnbJ2iVrl6xdIvf6yb1+cq/f+jvO+jvO2iVrl6xdIvf6recla5esXbJ2ydolcq+f3Osn9/qtv+Osv+OsXbJ2ydolcq/fel6ydsn6O876XrK+l8i9fut7yfpeIvf6rWevcq+f3Osn9/rJvX5yr5/c6yf3+q3vJc/3kud7yfO95Ple8jx7ff6O8/wd5/mb8PO95Pk3zvO85Hle8jx7fb6XPN9Lnu8lz/eS53vJ8+z1+TvO83ec52/Cz/eS5984z/OS53nJ8+z1+V7yfC95vpc830ue7yXPLnn+jiP3+sm9fnKvn9zrJ/f6yb1+cq+f3Ov37JJnlzy7RO71e569Pn8TfnbJs0ueXSL3+j3PS55d8uySZ5c8u0Tu9ZN7/eRev+fZ6/M34WeXPLvk2SVyr9/zvOTZJc8ueXbJs0vkXj+510/u9XuevT5/E352ybNLnl0i9/o9z0ueXfLskmeXPLtE7vWTe/3kXr/ne8nzveTZJc8ueXaJ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a+p7TX2vqe819b2m3GvKvabca+p7TX2vqe810y5Ju0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l4z7ZK0S+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXTLkm7RO419b2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XrPskrJL5F5T32vqe019r6nvNfW9ptxryr2m3Gvqe019r6nvNcsuKbtE7jX1vaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpes+ySskvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe81yy4pu0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7JKyS+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXLLim7RO415V5T7jXlXlPfa8q9Zj3TPC+Re02515R7TbnX/ONe778lZ0F/3Ot/y/vn8nMZLtNluWyX43Jdmgarlg2rlg2rlg2rlg2rlg2rlg2rlg2rlg2rlg2rlv3PtM+0z7TPtM+0z7TPtM+0z7TPtM+0MC1M82+c9rxE32vKvabca8q9ptxryr1m2yVtl8i9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7ZK2S+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXbLmm7RO419b2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XrPtkrZL5F5T32vqe019r6nvNfW9ptxrtu8l7XuJ3Gvqe02515R7TbnXlHtNudeUe02519T3mvpeU99rtu8l7XuJvtfU95r6XrP5TTjH9xJ9r6nvNfW9pr7X1Pea+l5T32uO7yXje4m+19T3mvpec/hNOMf3En2vqe819b2mvtfU95r6XlPfa47vJeN7ib7X1Peacq8p95pyryn3mnKvKfeacq8p95r6XlPfa45dIvea+l5T32vqe82xS8YukXtNfa+p7zX1vaa+19T3mnKvKfeacq+p7zX1vaa+1xy7ZOwSudfU95r6XlPfa+p7TX2vKfeacq8p95r6XlPfa+p7zbFLxi6Re019r6nvNfW9pr7X1Peacq8p95pyr6nvNfW9pr7XHLtE32vKveb4XqLvNccuGbtk7BK515R7TbnXHM9ex99xxi4Zu2TsErnXXM9L1i5Zu2TtkrVL5F5T7jXlXnM9e11/x1m7ZO2StUvkXnM9L1m7ZO2StUvWLpF7TbnXlHvN9b1kfS9Zu2TtkrVL5F5zfS9Zu2TtkrVL1i6Re02515R7zfXsdf0dR99r6ntNfa8p95r6XlPfa+p7TX2vqe815V5T7jXlXlPfa+p7TX2vuXbJ2iVyr6nvNfW9pr7X1Pea+l5T7jXlXlPuNfW9pr7X1Peaa5esXSL3mvpeU99r6ntNfa+p7zXlXlPuNeVeU99r6ntNfa+5dsnaJXKvqe819b2mvtfU95r6XlPuNeVeU+419b2mvtfU95prl6xdIvea+l5T32vqe019r6nvNeVeU+415V5T32vqe019r/nskmeXyL2mvtfU95r6XlPfa+p7TbnXlHtNudfU95r6XlPfaz675Nklcq+p7zX1vaa+19T3mvpeU+415V5T7jX1vaa+19T3ms8ueXaJ3Gvqe019r6nvNfW9pr7XlHtNudeUe019r6nvNfW95rNLnl0i95r6XlPfa+p7TX2vqe815V5T7jXlXlPfa+p7TX2v+eySZ5fIvaa+19T3mvpeU99r6ntNudeUe02519T3mvpeU99rPrvk2SVyr6nvNfW9pr7X1Pea+l5T7jXlXlPuNfW9pr7X1Peazy55donca+p7TX2vqe819b2mvteUe02515R7TX2vqe819b3m2SVnl8i9pr7X1Pea+l5T32vqe02515R7TbnX1Pea+l5T32ueXXJ2idxryr2m3GvKvaa+15R7zfPsVd9ryr2m3GvKvabca/5xr/ffkrOgP+71t3wuOQs6WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1WTe83zvETfa8q9ptxryr2m3GvKvebZJWeXyL2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XvPskrNL5F5T32vqe019r6nvNfW9ptxryb2W3Gvpey19r6Xvtf7RJfWPLim519L3WvpeS99r6Xstfa8l91pyryX3WvpeS99r6Xutf3RJ/aNLSu619L2WvtfS91r6Xkvfa8m91r/w2cJnS9M4ey2515J7LbnXknstudeSey2519L3WvpeS99r/SufrXy2Mq383MqdLHey3MkyrU1r09q0Nq3dyfbZ2mdrn61Naz+3cSfHnRx3ckwb08a0MW1MG3dyfLb12dZnW9PWz23dyXUn151c09a0Ne2Z9kx77uTz2Z7P9ny2Z9rzc3vu5HMnz5080860M+1MO9POnTyf7Xw2u0Tfa+l7rc8u+eySzy6Rey19r6XvtfS9lr7X0vdacq8l91pyr6XvtfS9lr7X+uySzy6Rey19r6XvtfS9lr7X0vdacq8l91pyr6XvtfS9lr7X+uwSfa8l91pfmmaXfHbJZ5d8donca8m9ltxrfWVa+bnZJZ9d8tklcq/1lWl2yWeXfHbJZ5fIvZbca8m91temtZ+bXfLZJZ9dIvda35hml3x2yWeXfHaJ3GvJvZbca31r2vq52SWfXfLZJXKv9a1pdslnl3x2yWeXyL2W3GvJvdb3THt+bnaJvtfS91pyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaYZeEXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa8VdknYJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91phl4RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19rxV2Sdglcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmGXhF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vFXZJ2CVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaYZeEXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa8VdknaJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91ppl6RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19r5V2Sdolcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmmXpF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vlXZJ2iVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaaZekXSL3WnKvJfdacq+l77XkXivXtDXNLpF7LbnXknutP+71/lv+zoLqj3v9LcflunwujyWsWiWsWiWsWiWsWuWZdqadaWfamQarVgWrVgWrVgWrVgWrVgWrVgWrVgWrVgWrVgWrVvXPtM+0z7TPtM+0z7TPtM+0zzT/xinPS/S9ltxryb2W3GvJvZbca5VdUnaJ3Gvpey19r6XvtfS9ltxryb2W3Gvpey19r6XvtcouKbtE7rX0vZa+19L3WvpeS99ryb2W3GvJvZa+19L3Wvpeq+ySskvkXkvfa+l7LX2vpe+19L2W3GvJvZbca+l7LX2vpe+1yi4pu0TutfS9lr7X0vda+l5L32vJvVb5XlK+l8i9lr7XknstudeSey2515J7LbnXknstfa+l77X0vVb5XlK+l+h7LX2vpe+16txJ30v0vZa+19L3WvpeS99r6Xstfa/Vvpe07yX6Xkvfa+l7reY34WrfS/S9lr7X0vda+l5L32vpey19r9W+l7TvJfpeS99ryb2W3GvJvZbca8m9ltxryb2W3Gvpey19r9V2idxr6Xstfa+l77XaLmm7RO619L2WvtfS91r6Xkvfa8m9ltxryb2WvtfS91r6XqvtkrZL5F5L32vpey19r6XvtfS9ltxryb2W3Gvpey19r6XvtdouabtE7rX0vZa+19L3WvpeS99ryb2W3GvJvZa+19L3Wvpeq+0Sfa8l91rte4m+12q7pO2StkvkXkvuteReqz177fNzs0vaLmm7RO612vOStkvaLmm7ZOwSudeSey251xrPXsffccYuGbtk7BK51xrPS8YuGbtk7JKxS+ReS+615F5rfC8Z30vGLhm7ZOwSudca30vGLhm7ZOySsUvkXkvuteReazx7HX/H0fda+l5L32vJvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rjV0ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2CVjl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32uNXTJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbYJWOXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa61dsnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91tola5fIvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rrV2ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2iVrl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32utXbJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbaJWuXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa61dsnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91rNLnl0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2v9eySZ5fIvZbca8m9ltxr6Xstudd6nr3qey2515J7LbnXknutP+71/ltyFvTHvf6W5bJdjst1+Vxy8vRg1erBqtUr08q0Mq1MK9PKtDKtTGvT2rQ2rU1r09q0Nq1Na9PatDFtTBvTxrQxbUzzb5zneYm+15J7LbnXknstudeSe61nlzy7RO619L2WvtfS91r6XkvuteReS+619L2WvtfS91rPLnl2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbZJWeXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa51dcnaJ3Gvpey19r6XvtfS9lr7Xknut873kfC+Rey19ryX3WnKvJfdacq8l91pyryX3WvpeS99r6Xut873kfC/R91r6Xkvfa52/CZ/vJfpeS99r6Xstfa+l77X0vZa+1zrfS873En2vpe+19L3W+Zvw+V6i77X0vZa+19L3WvpeS99r6Xut873kfC/R91r6XkvuteReS+615F5L7rXkXkvuteReS99r6Xuts0vkXkvfa+l7LX2vdXbJ2SVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaR5f0P7qk5V5b32vre219r63vtfW9ttxry7223Gvre219r63vtf/RJf2PLmm519b32vpeW99r63ttfa8t99pyry332vpeW99r63vtf3RJ63ttudf+l6alaWlampbuZPps6bOlz5ampZ9buZPlTpY7WaaVaWVamVamlTtZPlv7bO2ztWnt59buZLuT7U62aW1amzamjWnjTo7PNj7b+Gxj2vi5jTs57uS6k2vamramrWlr2rqT67Otz7Y+2zPt+bk9d/K5k8+dfKY9055pz7Rn2rmT57Odz3Y+25l2fm7nTp47ee4kf+O0vtfW99r6XvuzSz67RO615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32mGXhF0i99r6Xlvfa+t7bX2vre+15V5b7rXlXlvfa+t7bX2vHXZJ2CVyr63vtfW9tr7X1vfa+l5b7rXlXlvutfW9tr7X1vfaYZeEXSL32vpeW99r63ttfa+t77XlXlvuteVeW99r63ttfa8ddknYJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99phl4RdIvfacq8t99pyr63vteVeO9a0Nc0ukXttudeWe+0/7vX+t3y/s6D+415/y3CZLstluxyX6/K5PJZn2pl2pp1pZ9qZdqadaWcarFonrFonrFonrFonrFonrFonrFonrFonrFonrFrnP9M+0z7TPtM+0/wbJzkvaX2vLffacq8t99pyry332mmXpF0i99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bRL0i6Re219r63vtfW9tr7X1vfacq8t99pyr63vtfW9tr7XTrsk7RK519b32vpeW99r63ttfa8t99pyry332vpeW99r63vttEvSLpF7bX2vre+19b22vtfW99pyr52+l6TvJXKvre+15V5b7rXlXlvuteVeW+615V5b32vre219r52+l6TvJfpeW99r63vtPHfS9xJ9r63vtfW9tr7X1vfa+l5b32uX7yXle4m+19b32vpeu/hNuMv3En2vre+19b22vtfW99r6Xlvfa5fvJeV7ib7X1vfacq8t99pyry332nKvLffacq8t99r6Xlvfa5ddIvfa+l5b32vre+2yS8oukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1y67pOwSudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bJLyi6Re219r63vtfW9tr7X1vfacq8t99pyr63vtfW9tr7XLrtE32vLvXb5XqLvtcsuKbuk7BK515Z7bbnXrmfa83OzS8ouKbtE7rXL85KyS8ouKbuk7BK515Z7bbnXbs9em99xuu2StkvaLpF77fa8pO2StkvaLmm7RO615V5b7rXb95L2vaTtkrZL2i6Re+32vaTtkrZL2i5pu0TuteVeW+6127PX5nec1vfa+l5b32vLvba+19b32vpeW99r63ttudeWe22519b32vpeW99rt13Sdonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b122yVtl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32u3XdJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vXbbJW2XyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa49dMnaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99tglY5fIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rj10ydonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b322CVjl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32uPXTJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfbYJWOXyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa49dMnaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99tgla5fIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rr12ydonca8u9ttxry722vteWe+317FXfa8u9ttxry7223Gv/ca/335KzoD/u9b9l/nP5uQyX6bJctstxuS5NS9PKtDKtTCvTyrQyrUwr08q0Mq1Na9PatDatTWvT2rQ2rU1r08a0Mc2/cdbzEn2vLffacq8t99pyry332muXrF0i99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bVL1i6Re219r63vtfW9tr7X1vfacq8t99pyr63vtfW9tr7XXrtk7RK519b32vpeW99r63ttfa8t99pyry332vpeW99r63vtZ5c8u0TutfW9tr7X1vfa+l5b32vLvfbzveT5XiL32vpeW+615V5b7rXlXlvuteVeW+619b22vtfW99rP95Lne4m+19b32vpe+/mb8PO9RN9r63ttfa+t77X1vba+19b32s/3kud7ib7X1vfa+l77+Zvw871E32vre219r63vtfW9tr7X1vfaz/eS53uJvtfW99pyry332nKvLffacq8t99pyry332vpeW99rP7tE7rX1vba+19b32s8ueXaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99rNLnl0i99r6Xlvfa+t7bX2vre+15V5b7rXlXlvfa+t7bX2vfXbJ2SVyr63vtfW9tr7X1vfa+l5b7rXlXlvutfW9tr7X1vfaZ5foe2251z7fS/S99tklZ5ecXSL32nKvLffa59nr+TvO2SVnl5xdIvfa53nJ2SVnl5xdcnaJ3GvLvbbca59nr+fvOGeXnF1ydonca5/nJWeXnF1ydsnZJXKvLffacq99vpec7yVnl5xdcnaJ3Guf7yVnl5xdcnbJ2SVyry332nKvfZ69nr/j6Httfa+t77XlXlvfa+t7bX2vre+19b223GvLvbbca+t7bX2vre+1zy45u0TutfW9tr7X1vfa+l5H3+vIvY7c68i9jr7X0fc6+l7nH10y/+iSkXsdfa+j73X0vY6+19H3OnKvI/c6cq+j73X0vY6+1/lHl8w/umTkXkff6+h7HX2vo+919L2O3OvIvY7c6+h7HX2vo+91/qU7me5kmpampWllWplW7mT5bOWzlc9WppWfW7mT5U62O9mmtWltWpvWprU72T5b+2zts41p4+c27uS4k+NOjmlj2pg2po1p606uz7Y+2/psa9r6ua07ue7kupNr2jPtmfZMe6Y9d/L5bM9nez7bM+35uZ07ee7kuZNn2pl2pp1pZ9q5k3aJ3OvIvY6+19H3Op9d8tkln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zpyryP3OnKvo+915F7nG9PWNLtE7nXkXkfudf641/tv+TsLmj/u9bd8Lo8lrNp8sGrzwarNB6s2H6zafLBq8z3TnmnPtGfamXamnWln2pl2pp1pZ9qZBqs2Aas2Aas2Aas2Aas2Aas2Aas2Aas2Aas2Aas28c80/saZ4Lxk9L2O3OvIvY7c68i9jtzrhF0Sdonc6+h7HX2vo+919L2O3OvIvY7c6+h7HX2vo+91wi4J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AksCS3ivHWsbliSWJJYklvBem/favNdO55J0LkksSSxJLOG9djqXJJYkliSWJJbwXpv32rzXzrDt+47Teq+t99p6r817bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332okliSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r51YkljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qJJYklvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq+dWJJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffaiSWJJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvXVhSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332oUlhSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r11YUljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qFJYUlvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq9dWFJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffahSWFJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvXVhSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332hdLLpbwXpv32rzX5r223mvzXvu6e9V7bd5r816b99q81/7jvf77/dkf77X+Go8xjGks4zU+YxvH+N083bQtbUvb0ra0LW1L29K2tC1tK9vKtrKtbCvbyrayrWwr28q2a9u17dp2bfM3znVfovfavNfmvTbvtXmvzXvtiyUXS3ivrffaeq+t99p6r817bd5r815b77X1XlvvtS+WXCzhvbbea+u9tt5r67223mvzXpv32rzX1nttvdfWe+2LJRdLeK+t99p6r6332nqvrffavNfmvTbvtfVeW++19V77YcnDEt5r67223mvrvbbea+u9Nu+1n3PJcy7hvbbea/Nem/favNfmvTbvtXmvzXttvdfWe229137OJc+5RO+19V5b77VfepPOJXqvrffaeq+t99p6r6332nqv/ZxLnnOJ3mvrvbbea7/yJp1L9F5b77X1XlvvtfVeW++19V77OZc85xK919Z7bd5r816b99q81+a9Nu+1ea/Ne22919Z77YclvNfWe22919Z77YclD0t4r6332nqvrffaeq+t99q81+a9Nu+19V5b77X1XvthycMS3mvrvbbea+u9tt5r670277V5r817bb3X1nttvdduLGks4b223mvrvbbea+u9tt5r816b99q819Z7bb3X1nvtxhK91+a9djuX6L12Y0ljSWMJ77V5r8177Xb32r7jNJY0ljSW8F673Zc0ljSWNJY0lvBem/favNdud6/tO05jSWNJYwnvtdt9SWNJY0ljSWMJ77V5r8177XYuaeeSxpLGksYS3mu3c0ljSWNJY0ljCe+1ea/Ne+1299q+4+i9tt5r670277X1XlvvtfVeW++19V6b99q81+a9tt5r67223ms3ljSW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6712Y8lgCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rD5YMlvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u99mDJYAnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeaw+WDJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZgyWAJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msPlgyW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6732YMlgCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rD5YMlvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u99mLJYgnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeay+WLJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZiyWIJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msvliyW8F6b99q81+a9tt5r81573b3qvTbvtXmvzXtt3mv/8V73r/G7C/rjvf419o/xGMOYxjJe4zO20Tau2nLVlqu2XLXlqi1Xbblqy1Vbrtpy1Zartly15aotV225astVW67actWWq7Zctf1ctfn5XLX5+Vy14b3Oz3dfMnqvw3sd3uvwXof3OrzX+flYMj8fS4b3Onqvo/c6eq+j9zq81+G9Du919F5H73X0XucnPFt4trAtbAvbwraw7WPJ8F6H9zq819F7Hb3X0Xudn48l8/OxZHivo/c6eq+j9zp6r6P3OrzX4b0O73X0XkfvdfRe5+d6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q/e6eq+r97oXSy6W8F5X73X1XlfvdfVeV+91ea/Le13e6+q9rt7r6r3uxZKLJbzX1XtdvdfVe12919V7Xd7r8l6X97p6r6v3unqv+7DkYQnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6z4seVjCe12919V7Xb3X1XtdvdflvS7vdXmvq/e6eq+r97oPSx6W8F5X73X1XlfvdfVeV+91ea/Le13e6+q9rt7r6r3uw5KHJbzX1XtdvdfVe12919V7Xd7r8l6X97p6r6v3unqv+7DkYQnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6z4seVjCe12919V7Xb3X1XtdvdflvS7vdXmvq/e6eq+r97oPSx6W8F5X73X1XlfvdfVeV+91ea/Le13e6+q9rt7r6r1uY0ljCe919V5X73X1XlfvdfVel/e6vNflva7e6+q9rt7rNpY0lvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q9bmNJYwnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6zaWNJbwXpf3urzX5b2u3uvyXrfdveq9Lu91ea/Le13e6/7xXv/9/uyP91p/jccYxjSW8RqfsY1j/G6eum1r29q2tq1ta9vatratbWvbxraxbWwb28a2sW1sG9vGtrFtbVvb1ra1zd847b5E73V5r8t7Xd7r8l6X97qDJYMlvNfVe12919V7Xb3X5b0u73V5r6v3unqvq/e6gyWDJbzX1XtdvdfVe12919V7Xd7r8l6X97p6r6v3unqvO1gyWMJ7Xb3X1XtdvdfVe1291+W9Lu91ea+r97p6r6v3uoMlgyW819V7Xb3X1XtdvdfVe13e645zyTiX8F5X73V5r8t7Xd7r8l6X97q81+W9rt7r6r2u3uuOc8k4l+i9rt7r6r3u+CY8ziV6r6v3unqvq/e6eq+r97p6rzvOJeNcove6eq+r97rjm/A4l+i9rt7r6r2u3uvqva7e6+q97jiXjHOJ3uvqvS7vdXmvy3td3uvyXpf3urzX5b2u3uvqve5iCe919V5X73X1XnexZLGE97p6r6v3unqvq/e6eq/Le13e6/JeV+919V5X73UXSxZLeK+r97p6r6v3unqvq/e6vNflvS7vdfVeV+919V53sWSxhPe6eq+r97p6r6v3unqvy3td3uvyXlfvdfVe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XlPvNfVek/eavNfkvabea+q9pt5rDpYMlvBeU+819V5T7zX1XlPvNXmvyXtN3mvqvabea+q95mDJYAnvNfVeU+819V5T7zX1XpP3mrzX5L2m3mvqvabeaw6WDJbwXlPvNfVeU+819V5T7zV5rznOJeNcwntNvdfkvSbvNXmvyXtN3mvyXpP3mnqvqfeaeq85ziXjXKL3mnqvqfea65vwOpfovabea+q9pt5r6r2m3mvqveY6l6xzid5r6r2m3muub8LrXKL3mnqvqfeaeq+p95p6r6n3mutcss4leq+p95q81+S9Ju81ea/Je03ea/Jek/eaeq+p95qLJbzX1HtNvdfUe83FksUS3mvqvabea+q9pt5r6r0m7zV5r8l7Tb3X1HtNvddcLFks4b2m3mvqvabea+q9pt5r8l6T95q819R7Tb3X1HvNxZLFEt5r6r2m3mvqvabea+q9Ju81ea/Je02919R7Tb3XXCzRe03ea65zid5rLpYsliyW8F6T95q811x3r/t9x6mfjyX187Gkfj6WFO+1fr77kvr5WFI/H0vq52NJ/XwsKd5r8V6L91o/x7bvO079fCypn48l9fOxpHiv9XNsO7aFbWHbx5LivRbvtXiv9RO2feeS+vlYUj/hTaY3mbalbWlb2pa2pTeZni09W3q2sq38buVNljdZ3mTZVraVbWVb2Xa9yevZrme7nu3adv1u15u83uT1Jq9tz7Zn27Pt2fa8yefZnmd7nu3Z9vxu7U22N9neZNvWtrVtbVvb1t5ke7bxbOPZxrbxu403Od7keJNj29g2tq1ta9t6k+vZ1rOtZ1vb1u+23iSWHCzhvZbea+m9lt5r6b2W3mvxXov3WrzX0nstvdc6WHKw5GAJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3msdLDlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaB0sOlvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sGSgyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r3Ww5GAJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3msdLDlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaB0sOlvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m9VmBJYAnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbeawWWBJbwXov3WrzX4r2W3mvxXivStrQNS3ivxXst3mv98V7338f6+y6o/nivf49hTGMZr/EZ2zjG/cZr27Xt2nZtu7Zd265t17Zr27Xt2fZse7Y9255tz7Zn27Pt2fZsa9vatratbWu/W/u3pP1bgiW81+K9Fu+1eK8VWBJYwnstvdfSey2919J7Ld5r8V6L91p6r6X3WnqvFVgSWMJ7Lb3X0nstvdfSey291+K9Fu+1eK+l91p6r6X3WokliSW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r5VYkljCey2919J7Lb3X0nstvdfivVY6l6RzCe+19F6L91q81+K9Fu+1eK/Fey3ea+m9lt5r6b1WOpekc4nea+m9lt5r5fUmnUv0XkvvtfReS++19F5L77X0XiudS9K5RO+19F5L77XyeZPOJXqvpfdaeq+l91p6r6X3Wnqvlc4l6Vyi91p6r8V7Ld5r8V6L91q81+K9Fu+1eK+l91p6r5VYwnstvdfSey2910osSSzhvZbea+m9lt5r6b2W3mvxXov3WrzX0nstvdfSe63CksIS3mvpvZbea+m9lt5r6b0W77V4r8V7Lb3X0nstvdcqLCks4b2W3mvpvZbea+m9lt5r8V6L91q819J7Lb3X0nutwhK91+K9VjmX6L1WYUlhSWEJ77V4r8V7rSrbyu+GJYUlhSW81yr3JYUlhSWFJYUlvNfivRbvterZ9vxuWFJYUljCe61yX1JYUlhSWFJYwnst3mvxXqucS8q5pLCksKSwhPda5VxSWFJYUlhSWMJ7Ld5r8V6rxrbxu2GJ3mvpvRbvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbea10suVjCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91oXSy6W8F5L77X0XkvvtfReS++1eK/Fey3ea+m9lt5r6b3WxZKLJbzX0nstvdfSey2919J7Ld5r8V6L91p6r6X3WnqvdbHkYgnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbea10suVjCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91oXSy6W8F5L77X0XkvvtfReS++1eK/Fey3ea+m9lt5r6b3WxZKLJbzX0nstvdfSey2919J7Ld5r8V6L91p6r6X3Wnqv9bDkYQnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbeaz0seVjCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91oPSx6W8F5L77X0XkvvtfReS++1eK/Fey3ea+m9lt5r6b3Ww5KHJbzX0nstvdfSey2919J7Ld5r8V6L91p6r6X3Wnqv9bDkYQnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbeaz0seVjCey3ea/Fei/daeq/Fe63n7lXvtXivxXst3mvxXuuP97p/jf/YduLf/rf/8P/+p3/9p//0n//5v/4//+F/////8R//r//53/7L//inf/lvf/3H//H//fe//5v//K//9M///E//93/87//6L//lv/6f//Nf/+t//Od/+S9//rt/+z/+7X8B", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "50": { - "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake3_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake3_hashed = std::hash::blake3(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake3_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = blake3_to_field(hash_input_flattened);\n blake3_digest\n}\n", + "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake2s_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake2s_hashed = std::hash::blake2s(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake2s_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake2s_digest = blake2s_to_field(hash_input_flattened);\n blake2s_digest\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_0.snap index 70e680bac1a..91812c5ad1c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_0.snap @@ -114721,7 +114721,7 @@ expression: artifact "EXPR [ (-1, _82942) (-1, _82943) 1 ]", "EXPR [ (1, _82932, _82933) (1, _82931) (-1, _82944) 0 ]", "EXPR [ (1, _82943, _82944) (1, _82942) -1 ]", - "BLACKBOX::BLAKE3 [(_288, 8), (_287, 8), (_286, 8), (_285, 8), (_284, 8), (_283, 8), (_282, 8), (_281, 8), (_280, 8), (_279, 8), (_278, 8), (_277, 8), (_276, 8), (_275, 8), (_274, 8), (_273, 8), (_272, 8), (_271, 8), (_270, 8), (_269, 8), (_268, 8), (_267, 8), (_266, 8), (_265, 8), (_264, 8), (_263, 8), (_262, 8), (_261, 8), (_260, 8), (_259, 8), (_258, 8), (_257, 8), (_611, 8), (_610, 8), (_609, 8), (_608, 8), (_607, 8), (_606, 8), (_605, 8), (_604, 8), (_603, 8), (_602, 8), (_601, 8), (_600, 8), (_599, 8), (_598, 8), (_597, 8), (_596, 8), (_595, 8), (_594, 8), (_593, 8), (_592, 8), (_591, 8), (_590, 8), (_589, 8), (_588, 8), (_587, 8), (_586, 8), (_585, 8), (_584, 8), (_583, 8), (_582, 8), (_581, 8), (_580, 8), (_934, 8), (_933, 8), (_932, 8), (_931, 8), (_930, 8), (_929, 8), (_928, 8), (_927, 8), (_926, 8), (_925, 8), (_924, 8), (_923, 8), (_922, 8), (_921, 8), (_920, 8), (_919, 8), (_918, 8), (_917, 8), (_916, 8), (_915, 8), (_914, 8), (_913, 8), (_912, 8), (_911, 8), (_910, 8), (_909, 8), (_908, 8), (_907, 8), (_906, 8), (_905, 8), (_904, 8), (_903, 8), (_1257, 8), (_1256, 8), (_1255, 8), (_1254, 8), (_1253, 8), (_1252, 8), (_1251, 8), (_1250, 8), (_1249, 8), (_1248, 8), (_1247, 8), (_1246, 8), (_1245, 8), (_1244, 8), (_1243, 8), (_1242, 8), (_1241, 8), (_1240, 8), (_1239, 8), (_1238, 8), (_1237, 8), (_1236, 8), (_1235, 8), (_1234, 8), (_1233, 8), (_1232, 8), (_1231, 8), (_1230, 8), (_1229, 8), (_1228, 8), (_1227, 8), (_1226, 8), (_1580, 8), (_1579, 8), (_1578, 8), (_1577, 8), (_1576, 8), (_1575, 8), (_1574, 8), (_1573, 8), (_1572, 8), (_1571, 8), (_1570, 8), (_1569, 8), (_1568, 8), (_1567, 8), (_1566, 8), (_1565, 8), (_1564, 8), (_1563, 8), (_1562, 8), (_1561, 8), (_1560, 8), (_1559, 8), (_1558, 8), (_1557, 8), (_1556, 8), (_1555, 8), (_1554, 8), (_1553, 8), (_1552, 8), (_1551, 8), (_1550, 8), (_1549, 8), (_1903, 8), (_1902, 8), (_1901, 8), (_1900, 8), (_1899, 8), (_1898, 8), (_1897, 8), (_1896, 8), (_1895, 8), (_1894, 8), (_1893, 8), (_1892, 8), (_1891, 8), (_1890, 8), (_1889, 8), (_1888, 8), (_1887, 8), (_1886, 8), (_1885, 8), (_1884, 8), (_1883, 8), (_1882, 8), (_1881, 8), (_1880, 8), (_1879, 8), (_1878, 8), (_1877, 8), (_1876, 8), (_1875, 8), (_1874, 8), (_1873, 8), (_1872, 8), (_2226, 8), (_2225, 8), (_2224, 8), (_2223, 8), (_2222, 8), (_2221, 8), (_2220, 8), (_2219, 8), (_2218, 8), (_2217, 8), (_2216, 8), (_2215, 8), (_2214, 8), (_2213, 8), (_2212, 8), (_2211, 8), (_2210, 8), (_2209, 8), (_2208, 8), (_2207, 8), (_2206, 8), (_2205, 8), (_2204, 8), (_2203, 8), (_2202, 8), (_2201, 8), (_2200, 8), (_2199, 8), (_2198, 8), (_2197, 8), (_2196, 8), (_2195, 8), (_2549, 8), (_2548, 8), (_2547, 8), (_2546, 8), (_2545, 8), (_2544, 8), (_2543, 8), (_2542, 8), (_2541, 8), (_2540, 8), (_2539, 8), (_2538, 8), (_2537, 8), (_2536, 8), (_2535, 8), (_2534, 8), (_2533, 8), (_2532, 8), (_2531, 8), (_2530, 8), (_2529, 8), (_2528, 8), (_2527, 8), (_2526, 8), (_2525, 8), (_2524, 8), (_2523, 8), (_2522, 8), (_2521, 8), (_2520, 8), (_2519, 8), (_2518, 8), (_2872, 8), (_2871, 8), (_2870, 8), (_2869, 8), (_2868, 8), (_2867, 8), (_2866, 8), (_2865, 8), (_2864, 8), (_2863, 8), (_2862, 8), (_2861, 8), (_2860, 8), (_2859, 8), (_2858, 8), (_2857, 8), (_2856, 8), (_2855, 8), (_2854, 8), (_2853, 8), (_2852, 8), (_2851, 8), (_2850, 8), (_2849, 8), (_2848, 8), (_2847, 8), (_2846, 8), (_2845, 8), (_2844, 8), (_2843, 8), (_2842, 8), (_2841, 8), (_3195, 8), (_3194, 8), (_3193, 8), (_3192, 8), (_3191, 8), (_3190, 8), (_3189, 8), (_3188, 8), (_3187, 8), (_3186, 8), (_3185, 8), (_3184, 8), (_3183, 8), (_3182, 8), (_3181, 8), (_3180, 8), (_3179, 8), (_3178, 8), (_3177, 8), (_3176, 8), (_3175, 8), (_3174, 8), (_3173, 8), (_3172, 8), (_3171, 8), (_3170, 8), (_3169, 8), (_3168, 8), (_3167, 8), (_3166, 8), (_3165, 8), (_3164, 8), (_3518, 8), (_3517, 8), (_3516, 8), (_3515, 8), (_3514, 8), (_3513, 8), (_3512, 8), (_3511, 8), (_3510, 8), (_3509, 8), (_3508, 8), (_3507, 8), (_3506, 8), (_3505, 8), (_3504, 8), (_3503, 8), (_3502, 8), (_3501, 8), (_3500, 8), (_3499, 8), (_3498, 8), (_3497, 8), (_3496, 8), (_3495, 8), (_3494, 8), (_3493, 8), (_3492, 8), (_3491, 8), (_3490, 8), (_3489, 8), (_3488, 8), (_3487, 8), (_3841, 8), (_3840, 8), (_3839, 8), (_3838, 8), (_3837, 8), (_3836, 8), (_3835, 8), (_3834, 8), (_3833, 8), (_3832, 8), (_3831, 8), (_3830, 8), (_3829, 8), (_3828, 8), (_3827, 8), (_3826, 8), (_3825, 8), (_3824, 8), (_3823, 8), (_3822, 8), (_3821, 8), (_3820, 8), (_3819, 8), (_3818, 8), (_3817, 8), (_3816, 8), (_3815, 8), (_3814, 8), (_3813, 8), (_3812, 8), (_3811, 8), (_3810, 8), (_4164, 8), (_4163, 8), (_4162, 8), (_4161, 8), (_4160, 8), (_4159, 8), (_4158, 8), (_4157, 8), (_4156, 8), (_4155, 8), (_4154, 8), (_4153, 8), (_4152, 8), (_4151, 8), (_4150, 8), (_4149, 8), (_4148, 8), (_4147, 8), (_4146, 8), (_4145, 8), (_4144, 8), (_4143, 8), (_4142, 8), (_4141, 8), (_4140, 8), (_4139, 8), (_4138, 8), (_4137, 8), (_4136, 8), (_4135, 8), (_4134, 8), (_4133, 8), (_4487, 8), (_4486, 8), (_4485, 8), (_4484, 8), (_4483, 8), (_4482, 8), (_4481, 8), (_4480, 8), (_4479, 8), (_4478, 8), (_4477, 8), (_4476, 8), (_4475, 8), (_4474, 8), (_4473, 8), (_4472, 8), (_4471, 8), (_4470, 8), (_4469, 8), (_4468, 8), (_4467, 8), (_4466, 8), (_4465, 8), (_4464, 8), (_4463, 8), (_4462, 8), (_4461, 8), (_4460, 8), (_4459, 8), (_4458, 8), (_4457, 8), (_4456, 8), (_4810, 8), (_4809, 8), (_4808, 8), (_4807, 8), (_4806, 8), (_4805, 8), (_4804, 8), (_4803, 8), (_4802, 8), (_4801, 8), (_4800, 8), (_4799, 8), (_4798, 8), (_4797, 8), (_4796, 8), (_4795, 8), (_4794, 8), (_4793, 8), (_4792, 8), (_4791, 8), (_4790, 8), (_4789, 8), (_4788, 8), (_4787, 8), (_4786, 8), (_4785, 8), (_4784, 8), (_4783, 8), (_4782, 8), (_4781, 8), (_4780, 8), (_4779, 8), (_5133, 8), (_5132, 8), (_5131, 8), (_5130, 8), (_5129, 8), (_5128, 8), (_5127, 8), (_5126, 8), (_5125, 8), (_5124, 8), (_5123, 8), (_5122, 8), (_5121, 8), (_5120, 8), (_5119, 8), (_5118, 8), (_5117, 8), (_5116, 8), (_5115, 8), (_5114, 8), (_5113, 8), (_5112, 8), (_5111, 8), (_5110, 8), (_5109, 8), (_5108, 8), (_5107, 8), (_5106, 8), (_5105, 8), (_5104, 8), (_5103, 8), (_5102, 8), (_5456, 8), (_5455, 8), (_5454, 8), (_5453, 8), (_5452, 8), (_5451, 8), (_5450, 8), (_5449, 8), (_5448, 8), (_5447, 8), (_5446, 8), (_5445, 8), (_5444, 8), (_5443, 8), (_5442, 8), (_5441, 8), (_5440, 8), (_5439, 8), (_5438, 8), (_5437, 8), (_5436, 8), (_5435, 8), (_5434, 8), (_5433, 8), (_5432, 8), (_5431, 8), (_5430, 8), (_5429, 8), (_5428, 8), (_5427, 8), (_5426, 8), (_5425, 8), (_5779, 8), (_5778, 8), (_5777, 8), (_5776, 8), (_5775, 8), (_5774, 8), (_5773, 8), (_5772, 8), (_5771, 8), (_5770, 8), (_5769, 8), (_5768, 8), (_5767, 8), (_5766, 8), (_5765, 8), (_5764, 8), (_5763, 8), (_5762, 8), (_5761, 8), (_5760, 8), (_5759, 8), (_5758, 8), (_5757, 8), (_5756, 8), (_5755, 8), (_5754, 8), (_5753, 8), (_5752, 8), (_5751, 8), (_5750, 8), (_5749, 8), (_5748, 8), (_6102, 8), (_6101, 8), (_6100, 8), (_6099, 8), (_6098, 8), (_6097, 8), (_6096, 8), (_6095, 8), (_6094, 8), (_6093, 8), (_6092, 8), (_6091, 8), (_6090, 8), (_6089, 8), (_6088, 8), (_6087, 8), (_6086, 8), (_6085, 8), (_6084, 8), (_6083, 8), (_6082, 8), (_6081, 8), (_6080, 8), (_6079, 8), (_6078, 8), (_6077, 8), (_6076, 8), (_6075, 8), (_6074, 8), (_6073, 8), (_6072, 8), (_6071, 8), (_6425, 8), (_6424, 8), (_6423, 8), (_6422, 8), (_6421, 8), (_6420, 8), (_6419, 8), (_6418, 8), (_6417, 8), (_6416, 8), (_6415, 8), (_6414, 8), (_6413, 8), (_6412, 8), (_6411, 8), (_6410, 8), (_6409, 8), (_6408, 8), (_6407, 8), (_6406, 8), (_6405, 8), (_6404, 8), (_6403, 8), (_6402, 8), (_6401, 8), (_6400, 8), (_6399, 8), (_6398, 8), (_6397, 8), (_6396, 8), (_6395, 8), (_6394, 8), (_6748, 8), (_6747, 8), (_6746, 8), (_6745, 8), (_6744, 8), (_6743, 8), (_6742, 8), (_6741, 8), (_6740, 8), (_6739, 8), (_6738, 8), (_6737, 8), (_6736, 8), (_6735, 8), (_6734, 8), (_6733, 8), (_6732, 8), (_6731, 8), (_6730, 8), (_6729, 8), (_6728, 8), (_6727, 8), (_6726, 8), (_6725, 8), (_6724, 8), (_6723, 8), (_6722, 8), (_6721, 8), (_6720, 8), (_6719, 8), (_6718, 8), (_6717, 8), (_7071, 8), (_7070, 8), (_7069, 8), (_7068, 8), (_7067, 8), (_7066, 8), (_7065, 8), (_7064, 8), (_7063, 8), (_7062, 8), (_7061, 8), (_7060, 8), (_7059, 8), (_7058, 8), (_7057, 8), (_7056, 8), (_7055, 8), (_7054, 8), (_7053, 8), (_7052, 8), (_7051, 8), (_7050, 8), (_7049, 8), (_7048, 8), (_7047, 8), (_7046, 8), (_7045, 8), (_7044, 8), (_7043, 8), (_7042, 8), (_7041, 8), (_7040, 8), (_7394, 8), (_7393, 8), (_7392, 8), (_7391, 8), (_7390, 8), (_7389, 8), (_7388, 8), (_7387, 8), (_7386, 8), (_7385, 8), (_7384, 8), (_7383, 8), (_7382, 8), (_7381, 8), (_7380, 8), (_7379, 8), (_7378, 8), (_7377, 8), (_7376, 8), (_7375, 8), (_7374, 8), (_7373, 8), (_7372, 8), (_7371, 8), (_7370, 8), (_7369, 8), (_7368, 8), (_7367, 8), (_7366, 8), (_7365, 8), (_7364, 8), (_7363, 8), (_7717, 8), (_7716, 8), (_7715, 8), (_7714, 8), (_7713, 8), (_7712, 8), (_7711, 8), (_7710, 8), (_7709, 8), (_7708, 8), (_7707, 8), (_7706, 8), (_7705, 8), (_7704, 8), (_7703, 8), (_7702, 8), (_7701, 8), (_7700, 8), (_7699, 8), (_7698, 8), (_7697, 8), (_7696, 8), (_7695, 8), (_7694, 8), (_7693, 8), (_7692, 8), (_7691, 8), (_7690, 8), (_7689, 8), (_7688, 8), (_7687, 8), (_7686, 8), (_8040, 8), (_8039, 8), (_8038, 8), (_8037, 8), (_8036, 8), (_8035, 8), (_8034, 8), (_8033, 8), (_8032, 8), (_8031, 8), (_8030, 8), (_8029, 8), (_8028, 8), (_8027, 8), (_8026, 8), (_8025, 8), (_8024, 8), (_8023, 8), (_8022, 8), (_8021, 8), (_8020, 8), (_8019, 8), (_8018, 8), (_8017, 8), (_8016, 8), (_8015, 8), (_8014, 8), (_8013, 8), (_8012, 8), (_8011, 8), (_8010, 8), (_8009, 8), (_8363, 8), (_8362, 8), (_8361, 8), (_8360, 8), (_8359, 8), (_8358, 8), (_8357, 8), (_8356, 8), (_8355, 8), (_8354, 8), (_8353, 8), (_8352, 8), (_8351, 8), (_8350, 8), (_8349, 8), (_8348, 8), (_8347, 8), (_8346, 8), (_8345, 8), (_8344, 8), (_8343, 8), (_8342, 8), (_8341, 8), (_8340, 8), (_8339, 8), (_8338, 8), (_8337, 8), (_8336, 8), (_8335, 8), (_8334, 8), (_8333, 8), (_8332, 8), (_8686, 8), (_8685, 8), (_8684, 8), (_8683, 8), (_8682, 8), (_8681, 8), (_8680, 8), (_8679, 8), (_8678, 8), (_8677, 8), (_8676, 8), (_8675, 8), (_8674, 8), (_8673, 8), (_8672, 8), (_8671, 8), (_8670, 8), (_8669, 8), (_8668, 8), (_8667, 8), (_8666, 8), (_8665, 8), (_8664, 8), (_8663, 8), (_8662, 8), (_8661, 8), (_8660, 8), (_8659, 8), (_8658, 8), (_8657, 8), (_8656, 8), (_8655, 8), (_9009, 8), (_9008, 8), (_9007, 8), (_9006, 8), (_9005, 8), (_9004, 8), (_9003, 8), (_9002, 8), (_9001, 8), (_9000, 8), (_8999, 8), (_8998, 8), (_8997, 8), (_8996, 8), (_8995, 8), (_8994, 8), (_8993, 8), (_8992, 8), (_8991, 8), (_8990, 8), (_8989, 8), (_8988, 8), (_8987, 8), (_8986, 8), (_8985, 8), (_8984, 8), (_8983, 8), (_8982, 8), (_8981, 8), (_8980, 8), (_8979, 8), (_8978, 8), (_9332, 8), (_9331, 8), (_9330, 8), (_9329, 8), (_9328, 8), (_9327, 8), (_9326, 8), (_9325, 8), (_9324, 8), (_9323, 8), (_9322, 8), (_9321, 8), (_9320, 8), (_9319, 8), (_9318, 8), (_9317, 8), (_9316, 8), (_9315, 8), (_9314, 8), (_9313, 8), (_9312, 8), (_9311, 8), (_9310, 8), (_9309, 8), (_9308, 8), (_9307, 8), (_9306, 8), (_9305, 8), (_9304, 8), (_9303, 8), (_9302, 8), (_9301, 8), (_9655, 8), (_9654, 8), (_9653, 8), (_9652, 8), (_9651, 8), (_9650, 8), (_9649, 8), (_9648, 8), (_9647, 8), (_9646, 8), (_9645, 8), (_9644, 8), (_9643, 8), (_9642, 8), (_9641, 8), (_9640, 8), (_9639, 8), (_9638, 8), (_9637, 8), (_9636, 8), (_9635, 8), (_9634, 8), (_9633, 8), (_9632, 8), (_9631, 8), (_9630, 8), (_9629, 8), (_9628, 8), (_9627, 8), (_9626, 8), (_9625, 8), (_9624, 8), (_9978, 8), (_9977, 8), (_9976, 8), (_9975, 8), (_9974, 8), (_9973, 8), (_9972, 8), (_9971, 8), (_9970, 8), (_9969, 8), (_9968, 8), (_9967, 8), (_9966, 8), (_9965, 8), (_9964, 8), (_9963, 8), (_9962, 8), (_9961, 8), (_9960, 8), (_9959, 8), (_9958, 8), (_9957, 8), (_9956, 8), (_9955, 8), (_9954, 8), (_9953, 8), (_9952, 8), (_9951, 8), (_9950, 8), (_9949, 8), (_9948, 8), (_9947, 8), (_10301, 8), (_10300, 8), (_10299, 8), (_10298, 8), (_10297, 8), (_10296, 8), (_10295, 8), (_10294, 8), (_10293, 8), (_10292, 8), (_10291, 8), (_10290, 8), (_10289, 8), (_10288, 8), (_10287, 8), (_10286, 8), (_10285, 8), (_10284, 8), (_10283, 8), (_10282, 8), (_10281, 8), (_10280, 8), (_10279, 8), (_10278, 8), (_10277, 8), (_10276, 8), (_10275, 8), (_10274, 8), (_10273, 8), (_10272, 8), (_10271, 8), (_10270, 8), (_10624, 8), (_10623, 8), (_10622, 8), (_10621, 8), (_10620, 8), (_10619, 8), (_10618, 8), (_10617, 8), (_10616, 8), (_10615, 8), (_10614, 8), (_10613, 8), (_10612, 8), (_10611, 8), (_10610, 8), (_10609, 8), (_10608, 8), (_10607, 8), (_10606, 8), (_10605, 8), (_10604, 8), (_10603, 8), (_10602, 8), (_10601, 8), (_10600, 8), (_10599, 8), (_10598, 8), (_10597, 8), (_10596, 8), (_10595, 8), (_10594, 8), (_10593, 8), (_10947, 8), (_10946, 8), (_10945, 8), (_10944, 8), (_10943, 8), (_10942, 8), (_10941, 8), (_10940, 8), (_10939, 8), (_10938, 8), (_10937, 8), (_10936, 8), (_10935, 8), (_10934, 8), (_10933, 8), (_10932, 8), (_10931, 8), (_10930, 8), (_10929, 8), (_10928, 8), (_10927, 8), (_10926, 8), (_10925, 8), (_10924, 8), (_10923, 8), (_10922, 8), (_10921, 8), (_10920, 8), (_10919, 8), (_10918, 8), (_10917, 8), (_10916, 8), (_11270, 8), (_11269, 8), (_11268, 8), (_11267, 8), (_11266, 8), (_11265, 8), (_11264, 8), (_11263, 8), (_11262, 8), (_11261, 8), (_11260, 8), (_11259, 8), (_11258, 8), (_11257, 8), (_11256, 8), (_11255, 8), (_11254, 8), (_11253, 8), (_11252, 8), (_11251, 8), (_11250, 8), (_11249, 8), (_11248, 8), (_11247, 8), (_11246, 8), (_11245, 8), (_11244, 8), (_11243, 8), (_11242, 8), (_11241, 8), (_11240, 8), (_11239, 8), (_11593, 8), (_11592, 8), (_11591, 8), (_11590, 8), (_11589, 8), (_11588, 8), (_11587, 8), (_11586, 8), (_11585, 8), (_11584, 8), (_11583, 8), (_11582, 8), (_11581, 8), (_11580, 8), (_11579, 8), (_11578, 8), (_11577, 8), (_11576, 8), (_11575, 8), (_11574, 8), (_11573, 8), (_11572, 8), (_11571, 8), (_11570, 8), (_11569, 8), (_11568, 8), (_11567, 8), (_11566, 8), (_11565, 8), (_11564, 8), (_11563, 8), (_11562, 8), (_11916, 8), (_11915, 8), (_11914, 8), (_11913, 8), (_11912, 8), (_11911, 8), (_11910, 8), (_11909, 8), (_11908, 8), (_11907, 8), (_11906, 8), (_11905, 8), (_11904, 8), (_11903, 8), (_11902, 8), (_11901, 8), (_11900, 8), (_11899, 8), (_11898, 8), (_11897, 8), (_11896, 8), (_11895, 8), (_11894, 8), (_11893, 8), (_11892, 8), (_11891, 8), (_11890, 8), (_11889, 8), (_11888, 8), (_11887, 8), (_11886, 8), (_11885, 8), (_12239, 8), (_12238, 8), (_12237, 8), (_12236, 8), (_12235, 8), (_12234, 8), (_12233, 8), (_12232, 8), (_12231, 8), (_12230, 8), (_12229, 8), (_12228, 8), (_12227, 8), (_12226, 8), (_12225, 8), (_12224, 8), (_12223, 8), (_12222, 8), (_12221, 8), (_12220, 8), (_12219, 8), (_12218, 8), (_12217, 8), (_12216, 8), (_12215, 8), (_12214, 8), (_12213, 8), (_12212, 8), (_12211, 8), (_12210, 8), (_12209, 8), (_12208, 8), (_12562, 8), (_12561, 8), (_12560, 8), (_12559, 8), (_12558, 8), (_12557, 8), (_12556, 8), (_12555, 8), (_12554, 8), (_12553, 8), (_12552, 8), (_12551, 8), (_12550, 8), (_12549, 8), (_12548, 8), (_12547, 8), (_12546, 8), (_12545, 8), (_12544, 8), (_12543, 8), (_12542, 8), (_12541, 8), (_12540, 8), (_12539, 8), (_12538, 8), (_12537, 8), (_12536, 8), (_12535, 8), (_12534, 8), (_12533, 8), (_12532, 8), (_12531, 8), (_12885, 8), (_12884, 8), (_12883, 8), (_12882, 8), (_12881, 8), (_12880, 8), (_12879, 8), (_12878, 8), (_12877, 8), (_12876, 8), (_12875, 8), (_12874, 8), (_12873, 8), (_12872, 8), (_12871, 8), (_12870, 8), (_12869, 8), (_12868, 8), (_12867, 8), (_12866, 8), (_12865, 8), (_12864, 8), (_12863, 8), (_12862, 8), (_12861, 8), (_12860, 8), (_12859, 8), (_12858, 8), (_12857, 8), (_12856, 8), (_12855, 8), (_12854, 8), (_13208, 8), (_13207, 8), (_13206, 8), (_13205, 8), (_13204, 8), (_13203, 8), (_13202, 8), (_13201, 8), (_13200, 8), (_13199, 8), (_13198, 8), (_13197, 8), (_13196, 8), (_13195, 8), (_13194, 8), (_13193, 8), (_13192, 8), (_13191, 8), (_13190, 8), (_13189, 8), (_13188, 8), (_13187, 8), (_13186, 8), (_13185, 8), (_13184, 8), (_13183, 8), (_13182, 8), (_13181, 8), (_13180, 8), (_13179, 8), (_13178, 8), (_13177, 8), (_13531, 8), (_13530, 8), (_13529, 8), (_13528, 8), (_13527, 8), (_13526, 8), (_13525, 8), (_13524, 8), (_13523, 8), (_13522, 8), (_13521, 8), (_13520, 8), (_13519, 8), (_13518, 8), (_13517, 8), (_13516, 8), (_13515, 8), (_13514, 8), (_13513, 8), (_13512, 8), (_13511, 8), (_13510, 8), (_13509, 8), (_13508, 8), (_13507, 8), (_13506, 8), (_13505, 8), (_13504, 8), (_13503, 8), (_13502, 8), (_13501, 8), (_13500, 8), (_13854, 8), (_13853, 8), (_13852, 8), (_13851, 8), (_13850, 8), (_13849, 8), (_13848, 8), (_13847, 8), (_13846, 8), (_13845, 8), (_13844, 8), (_13843, 8), (_13842, 8), (_13841, 8), (_13840, 8), (_13839, 8), (_13838, 8), (_13837, 8), (_13836, 8), (_13835, 8), (_13834, 8), (_13833, 8), (_13832, 8), (_13831, 8), (_13830, 8), (_13829, 8), (_13828, 8), (_13827, 8), (_13826, 8), (_13825, 8), (_13824, 8), (_13823, 8), (_14177, 8), (_14176, 8), (_14175, 8), (_14174, 8), (_14173, 8), (_14172, 8), (_14171, 8), (_14170, 8), (_14169, 8), (_14168, 8), (_14167, 8), (_14166, 8), (_14165, 8), (_14164, 8), (_14163, 8), (_14162, 8), (_14161, 8), (_14160, 8), (_14159, 8), (_14158, 8), (_14157, 8), (_14156, 8), (_14155, 8), (_14154, 8), (_14153, 8), (_14152, 8), (_14151, 8), (_14150, 8), (_14149, 8), (_14148, 8), (_14147, 8), (_14146, 8), (_14500, 8), (_14499, 8), (_14498, 8), (_14497, 8), (_14496, 8), (_14495, 8), (_14494, 8), (_14493, 8), (_14492, 8), (_14491, 8), (_14490, 8), (_14489, 8), (_14488, 8), (_14487, 8), (_14486, 8), (_14485, 8), (_14484, 8), (_14483, 8), (_14482, 8), (_14481, 8), (_14480, 8), (_14479, 8), (_14478, 8), (_14477, 8), (_14476, 8), (_14475, 8), (_14474, 8), (_14473, 8), (_14472, 8), (_14471, 8), (_14470, 8), (_14469, 8), (_14823, 8), (_14822, 8), (_14821, 8), (_14820, 8), (_14819, 8), (_14818, 8), (_14817, 8), (_14816, 8), (_14815, 8), (_14814, 8), (_14813, 8), (_14812, 8), (_14811, 8), (_14810, 8), (_14809, 8), (_14808, 8), (_14807, 8), (_14806, 8), (_14805, 8), (_14804, 8), (_14803, 8), (_14802, 8), (_14801, 8), (_14800, 8), (_14799, 8), (_14798, 8), (_14797, 8), (_14796, 8), (_14795, 8), (_14794, 8), (_14793, 8), (_14792, 8), (_15146, 8), (_15145, 8), (_15144, 8), (_15143, 8), (_15142, 8), (_15141, 8), (_15140, 8), (_15139, 8), (_15138, 8), (_15137, 8), (_15136, 8), (_15135, 8), (_15134, 8), (_15133, 8), (_15132, 8), (_15131, 8), (_15130, 8), (_15129, 8), (_15128, 8), (_15127, 8), (_15126, 8), (_15125, 8), (_15124, 8), (_15123, 8), (_15122, 8), (_15121, 8), (_15120, 8), (_15119, 8), (_15118, 8), (_15117, 8), (_15116, 8), (_15115, 8), (_15469, 8), (_15468, 8), (_15467, 8), (_15466, 8), (_15465, 8), (_15464, 8), (_15463, 8), (_15462, 8), (_15461, 8), (_15460, 8), (_15459, 8), (_15458, 8), (_15457, 8), (_15456, 8), (_15455, 8), (_15454, 8), (_15453, 8), (_15452, 8), (_15451, 8), (_15450, 8), (_15449, 8), (_15448, 8), (_15447, 8), (_15446, 8), (_15445, 8), (_15444, 8), (_15443, 8), (_15442, 8), (_15441, 8), (_15440, 8), (_15439, 8), (_15438, 8), (_15792, 8), (_15791, 8), (_15790, 8), (_15789, 8), (_15788, 8), (_15787, 8), (_15786, 8), (_15785, 8), (_15784, 8), (_15783, 8), (_15782, 8), (_15781, 8), (_15780, 8), (_15779, 8), (_15778, 8), (_15777, 8), (_15776, 8), (_15775, 8), (_15774, 8), (_15773, 8), (_15772, 8), (_15771, 8), (_15770, 8), (_15769, 8), (_15768, 8), (_15767, 8), (_15766, 8), (_15765, 8), (_15764, 8), (_15763, 8), (_15762, 8), (_15761, 8), (_16115, 8), (_16114, 8), (_16113, 8), (_16112, 8), (_16111, 8), (_16110, 8), (_16109, 8), (_16108, 8), (_16107, 8), (_16106, 8), (_16105, 8), (_16104, 8), (_16103, 8), (_16102, 8), (_16101, 8), (_16100, 8), (_16099, 8), (_16098, 8), (_16097, 8), (_16096, 8), (_16095, 8), (_16094, 8), (_16093, 8), (_16092, 8), (_16091, 8), (_16090, 8), (_16089, 8), (_16088, 8), (_16087, 8), (_16086, 8), (_16085, 8), (_16084, 8), (_16438, 8), (_16437, 8), (_16436, 8), (_16435, 8), (_16434, 8), (_16433, 8), (_16432, 8), (_16431, 8), (_16430, 8), (_16429, 8), (_16428, 8), (_16427, 8), (_16426, 8), (_16425, 8), (_16424, 8), (_16423, 8), (_16422, 8), (_16421, 8), (_16420, 8), (_16419, 8), (_16418, 8), (_16417, 8), (_16416, 8), (_16415, 8), (_16414, 8), (_16413, 8), (_16412, 8), (_16411, 8), (_16410, 8), (_16409, 8), (_16408, 8), (_16407, 8), (_16761, 8), (_16760, 8), (_16759, 8), (_16758, 8), (_16757, 8), (_16756, 8), (_16755, 8), (_16754, 8), (_16753, 8), (_16752, 8), (_16751, 8), (_16750, 8), (_16749, 8), (_16748, 8), (_16747, 8), (_16746, 8), (_16745, 8), (_16744, 8), (_16743, 8), (_16742, 8), (_16741, 8), (_16740, 8), (_16739, 8), (_16738, 8), (_16737, 8), (_16736, 8), (_16735, 8), (_16734, 8), (_16733, 8), (_16732, 8), (_16731, 8), (_16730, 8), (_17084, 8), (_17083, 8), (_17082, 8), (_17081, 8), (_17080, 8), (_17079, 8), (_17078, 8), (_17077, 8), (_17076, 8), (_17075, 8), (_17074, 8), (_17073, 8), (_17072, 8), (_17071, 8), (_17070, 8), (_17069, 8), (_17068, 8), (_17067, 8), (_17066, 8), (_17065, 8), (_17064, 8), (_17063, 8), (_17062, 8), (_17061, 8), (_17060, 8), (_17059, 8), (_17058, 8), (_17057, 8), (_17056, 8), (_17055, 8), (_17054, 8), (_17053, 8), (_17407, 8), (_17406, 8), (_17405, 8), (_17404, 8), (_17403, 8), (_17402, 8), (_17401, 8), (_17400, 8), (_17399, 8), (_17398, 8), (_17397, 8), (_17396, 8), (_17395, 8), (_17394, 8), (_17393, 8), (_17392, 8), (_17391, 8), (_17390, 8), (_17389, 8), (_17388, 8), (_17387, 8), (_17386, 8), (_17385, 8), (_17384, 8), (_17383, 8), (_17382, 8), (_17381, 8), (_17380, 8), (_17379, 8), (_17378, 8), (_17377, 8), (_17376, 8), (_17730, 8), (_17729, 8), (_17728, 8), (_17727, 8), (_17726, 8), (_17725, 8), (_17724, 8), (_17723, 8), (_17722, 8), (_17721, 8), (_17720, 8), (_17719, 8), (_17718, 8), (_17717, 8), (_17716, 8), (_17715, 8), (_17714, 8), (_17713, 8), (_17712, 8), (_17711, 8), (_17710, 8), (_17709, 8), (_17708, 8), (_17707, 8), (_17706, 8), (_17705, 8), (_17704, 8), (_17703, 8), (_17702, 8), (_17701, 8), (_17700, 8), (_17699, 8), (_18053, 8), (_18052, 8), (_18051, 8), (_18050, 8), (_18049, 8), (_18048, 8), (_18047, 8), (_18046, 8), (_18045, 8), (_18044, 8), (_18043, 8), (_18042, 8), (_18041, 8), (_18040, 8), (_18039, 8), (_18038, 8), (_18037, 8), (_18036, 8), (_18035, 8), (_18034, 8), (_18033, 8), (_18032, 8), (_18031, 8), (_18030, 8), (_18029, 8), (_18028, 8), (_18027, 8), (_18026, 8), (_18025, 8), (_18024, 8), (_18023, 8), (_18022, 8), (_18376, 8), (_18375, 8), (_18374, 8), (_18373, 8), (_18372, 8), (_18371, 8), (_18370, 8), (_18369, 8), (_18368, 8), (_18367, 8), (_18366, 8), (_18365, 8), (_18364, 8), (_18363, 8), (_18362, 8), (_18361, 8), (_18360, 8), (_18359, 8), (_18358, 8), (_18357, 8), (_18356, 8), (_18355, 8), (_18354, 8), (_18353, 8), (_18352, 8), (_18351, 8), (_18350, 8), (_18349, 8), (_18348, 8), (_18347, 8), (_18346, 8), (_18345, 8), (_18699, 8), (_18698, 8), (_18697, 8), (_18696, 8), (_18695, 8), (_18694, 8), (_18693, 8), (_18692, 8), (_18691, 8), (_18690, 8), (_18689, 8), (_18688, 8), (_18687, 8), (_18686, 8), (_18685, 8), (_18684, 8), (_18683, 8), (_18682, 8), (_18681, 8), (_18680, 8), (_18679, 8), (_18678, 8), (_18677, 8), (_18676, 8), (_18675, 8), (_18674, 8), (_18673, 8), (_18672, 8), (_18671, 8), (_18670, 8), (_18669, 8), (_18668, 8), (_19022, 8), (_19021, 8), (_19020, 8), (_19019, 8), (_19018, 8), (_19017, 8), (_19016, 8), (_19015, 8), (_19014, 8), (_19013, 8), (_19012, 8), (_19011, 8), (_19010, 8), (_19009, 8), (_19008, 8), (_19007, 8), (_19006, 8), (_19005, 8), (_19004, 8), (_19003, 8), (_19002, 8), (_19001, 8), (_19000, 8), (_18999, 8), (_18998, 8), (_18997, 8), (_18996, 8), (_18995, 8), (_18994, 8), (_18993, 8), (_18992, 8), (_18991, 8), (_19345, 8), (_19344, 8), (_19343, 8), (_19342, 8), (_19341, 8), (_19340, 8), (_19339, 8), (_19338, 8), (_19337, 8), (_19336, 8), (_19335, 8), (_19334, 8), (_19333, 8), (_19332, 8), (_19331, 8), (_19330, 8), (_19329, 8), (_19328, 8), (_19327, 8), (_19326, 8), (_19325, 8), (_19324, 8), (_19323, 8), (_19322, 8), (_19321, 8), (_19320, 8), (_19319, 8), (_19318, 8), (_19317, 8), (_19316, 8), (_19315, 8), (_19314, 8), (_19668, 8), (_19667, 8), (_19666, 8), (_19665, 8), (_19664, 8), (_19663, 8), (_19662, 8), (_19661, 8), (_19660, 8), (_19659, 8), (_19658, 8), (_19657, 8), (_19656, 8), (_19655, 8), (_19654, 8), (_19653, 8), (_19652, 8), (_19651, 8), (_19650, 8), (_19649, 8), (_19648, 8), (_19647, 8), (_19646, 8), (_19645, 8), (_19644, 8), (_19643, 8), (_19642, 8), (_19641, 8), (_19640, 8), (_19639, 8), (_19638, 8), (_19637, 8), (_19991, 8), (_19990, 8), (_19989, 8), (_19988, 8), (_19987, 8), (_19986, 8), (_19985, 8), (_19984, 8), (_19983, 8), (_19982, 8), (_19981, 8), (_19980, 8), (_19979, 8), (_19978, 8), (_19977, 8), (_19976, 8), (_19975, 8), (_19974, 8), (_19973, 8), (_19972, 8), (_19971, 8), (_19970, 8), (_19969, 8), (_19968, 8), (_19967, 8), (_19966, 8), (_19965, 8), (_19964, 8), (_19963, 8), (_19962, 8), (_19961, 8), (_19960, 8), (_20314, 8), (_20313, 8), (_20312, 8), (_20311, 8), (_20310, 8), (_20309, 8), (_20308, 8), (_20307, 8), (_20306, 8), (_20305, 8), (_20304, 8), (_20303, 8), (_20302, 8), (_20301, 8), (_20300, 8), (_20299, 8), (_20298, 8), (_20297, 8), (_20296, 8), (_20295, 8), (_20294, 8), (_20293, 8), (_20292, 8), (_20291, 8), (_20290, 8), (_20289, 8), (_20288, 8), (_20287, 8), (_20286, 8), (_20285, 8), (_20284, 8), (_20283, 8), (_20637, 8), (_20636, 8), (_20635, 8), (_20634, 8), (_20633, 8), (_20632, 8), (_20631, 8), (_20630, 8), (_20629, 8), (_20628, 8), (_20627, 8), (_20626, 8), (_20625, 8), (_20624, 8), (_20623, 8), (_20622, 8), (_20621, 8), (_20620, 8), (_20619, 8), (_20618, 8), (_20617, 8), (_20616, 8), (_20615, 8), (_20614, 8), (_20613, 8), (_20612, 8), (_20611, 8), (_20610, 8), (_20609, 8), (_20608, 8), (_20607, 8), (_20606, 8), (_20960, 8), (_20959, 8), (_20958, 8), (_20957, 8), (_20956, 8), (_20955, 8), (_20954, 8), (_20953, 8), (_20952, 8), (_20951, 8), (_20950, 8), (_20949, 8), (_20948, 8), (_20947, 8), (_20946, 8), (_20945, 8), (_20944, 8), (_20943, 8), (_20942, 8), (_20941, 8), (_20940, 8), (_20939, 8), (_20938, 8), (_20937, 8), (_20936, 8), (_20935, 8), (_20934, 8), (_20933, 8), (_20932, 8), (_20931, 8), (_20930, 8), (_20929, 8), (_21283, 8), (_21282, 8), (_21281, 8), (_21280, 8), (_21279, 8), (_21278, 8), (_21277, 8), (_21276, 8), (_21275, 8), (_21274, 8), (_21273, 8), (_21272, 8), (_21271, 8), (_21270, 8), (_21269, 8), (_21268, 8), (_21267, 8), (_21266, 8), (_21265, 8), (_21264, 8), (_21263, 8), (_21262, 8), (_21261, 8), (_21260, 8), (_21259, 8), (_21258, 8), (_21257, 8), (_21256, 8), (_21255, 8), (_21254, 8), (_21253, 8), (_21252, 8), (_21606, 8), (_21605, 8), (_21604, 8), (_21603, 8), (_21602, 8), (_21601, 8), (_21600, 8), (_21599, 8), (_21598, 8), (_21597, 8), (_21596, 8), (_21595, 8), (_21594, 8), (_21593, 8), (_21592, 8), (_21591, 8), (_21590, 8), (_21589, 8), (_21588, 8), (_21587, 8), (_21586, 8), (_21585, 8), (_21584, 8), (_21583, 8), (_21582, 8), (_21581, 8), (_21580, 8), (_21579, 8), (_21578, 8), (_21577, 8), (_21576, 8), (_21575, 8), (_21929, 8), (_21928, 8), (_21927, 8), (_21926, 8), (_21925, 8), (_21924, 8), (_21923, 8), (_21922, 8), (_21921, 8), (_21920, 8), (_21919, 8), (_21918, 8), (_21917, 8), (_21916, 8), (_21915, 8), (_21914, 8), (_21913, 8), (_21912, 8), (_21911, 8), (_21910, 8), (_21909, 8), (_21908, 8), (_21907, 8), (_21906, 8), (_21905, 8), (_21904, 8), (_21903, 8), (_21902, 8), (_21901, 8), (_21900, 8), (_21899, 8), (_21898, 8), (_22252, 8), (_22251, 8), (_22250, 8), (_22249, 8), (_22248, 8), (_22247, 8), (_22246, 8), (_22245, 8), (_22244, 8), (_22243, 8), (_22242, 8), (_22241, 8), (_22240, 8), (_22239, 8), (_22238, 8), (_22237, 8), (_22236, 8), (_22235, 8), (_22234, 8), (_22233, 8), (_22232, 8), (_22231, 8), (_22230, 8), (_22229, 8), (_22228, 8), (_22227, 8), (_22226, 8), (_22225, 8), (_22224, 8), (_22223, 8), (_22222, 8), (_22221, 8), (_22575, 8), (_22574, 8), (_22573, 8), (_22572, 8), (_22571, 8), (_22570, 8), (_22569, 8), (_22568, 8), (_22567, 8), (_22566, 8), (_22565, 8), (_22564, 8), (_22563, 8), (_22562, 8), (_22561, 8), (_22560, 8), (_22559, 8), (_22558, 8), (_22557, 8), (_22556, 8), (_22555, 8), (_22554, 8), (_22553, 8), (_22552, 8), (_22551, 8), (_22550, 8), (_22549, 8), (_22548, 8), (_22547, 8), (_22546, 8), (_22545, 8), (_22544, 8), (_22898, 8), (_22897, 8), (_22896, 8), (_22895, 8), (_22894, 8), (_22893, 8), (_22892, 8), (_22891, 8), (_22890, 8), (_22889, 8), (_22888, 8), (_22887, 8), (_22886, 8), (_22885, 8), (_22884, 8), (_22883, 8), (_22882, 8), (_22881, 8), (_22880, 8), (_22879, 8), (_22878, 8), (_22877, 8), (_22876, 8), (_22875, 8), (_22874, 8), (_22873, 8), (_22872, 8), (_22871, 8), (_22870, 8), (_22869, 8), (_22868, 8), (_22867, 8), (_23221, 8), (_23220, 8), (_23219, 8), (_23218, 8), (_23217, 8), (_23216, 8), (_23215, 8), (_23214, 8), (_23213, 8), (_23212, 8), (_23211, 8), (_23210, 8), (_23209, 8), (_23208, 8), (_23207, 8), (_23206, 8), (_23205, 8), (_23204, 8), (_23203, 8), (_23202, 8), (_23201, 8), (_23200, 8), (_23199, 8), (_23198, 8), (_23197, 8), (_23196, 8), (_23195, 8), (_23194, 8), (_23193, 8), (_23192, 8), (_23191, 8), (_23190, 8), (_23544, 8), (_23543, 8), (_23542, 8), (_23541, 8), (_23540, 8), (_23539, 8), (_23538, 8), (_23537, 8), (_23536, 8), (_23535, 8), (_23534, 8), (_23533, 8), (_23532, 8), (_23531, 8), (_23530, 8), (_23529, 8), (_23528, 8), (_23527, 8), (_23526, 8), (_23525, 8), (_23524, 8), (_23523, 8), (_23522, 8), (_23521, 8), (_23520, 8), (_23519, 8), (_23518, 8), (_23517, 8), (_23516, 8), (_23515, 8), (_23514, 8), (_23513, 8), (_23867, 8), (_23866, 8), (_23865, 8), (_23864, 8), (_23863, 8), (_23862, 8), (_23861, 8), (_23860, 8), (_23859, 8), (_23858, 8), (_23857, 8), (_23856, 8), (_23855, 8), (_23854, 8), (_23853, 8), (_23852, 8), (_23851, 8), (_23850, 8), (_23849, 8), (_23848, 8), (_23847, 8), (_23846, 8), (_23845, 8), (_23844, 8), (_23843, 8), (_23842, 8), (_23841, 8), (_23840, 8), (_23839, 8), (_23838, 8), (_23837, 8), (_23836, 8), (_24190, 8), (_24189, 8), (_24188, 8), (_24187, 8), (_24186, 8), (_24185, 8), (_24184, 8), (_24183, 8), (_24182, 8), (_24181, 8), (_24180, 8), (_24179, 8), (_24178, 8), (_24177, 8), (_24176, 8), (_24175, 8), (_24174, 8), (_24173, 8), (_24172, 8), (_24171, 8), (_24170, 8), (_24169, 8), (_24168, 8), (_24167, 8), (_24166, 8), (_24165, 8), (_24164, 8), (_24163, 8), (_24162, 8), (_24161, 8), (_24160, 8), (_24159, 8), (_24513, 8), (_24512, 8), (_24511, 8), (_24510, 8), (_24509, 8), (_24508, 8), (_24507, 8), (_24506, 8), (_24505, 8), (_24504, 8), (_24503, 8), (_24502, 8), (_24501, 8), (_24500, 8), (_24499, 8), (_24498, 8), (_24497, 8), (_24496, 8), (_24495, 8), (_24494, 8), (_24493, 8), (_24492, 8), (_24491, 8), (_24490, 8), (_24489, 8), (_24488, 8), (_24487, 8), (_24486, 8), (_24485, 8), (_24484, 8), (_24483, 8), (_24482, 8), (_24836, 8), (_24835, 8), (_24834, 8), (_24833, 8), (_24832, 8), (_24831, 8), (_24830, 8), (_24829, 8), (_24828, 8), (_24827, 8), (_24826, 8), (_24825, 8), (_24824, 8), (_24823, 8), (_24822, 8), (_24821, 8), (_24820, 8), (_24819, 8), (_24818, 8), (_24817, 8), (_24816, 8), (_24815, 8), (_24814, 8), (_24813, 8), (_24812, 8), (_24811, 8), (_24810, 8), (_24809, 8), (_24808, 8), (_24807, 8), (_24806, 8), (_24805, 8), (_25159, 8), (_25158, 8), (_25157, 8), (_25156, 8), (_25155, 8), (_25154, 8), (_25153, 8), (_25152, 8), (_25151, 8), (_25150, 8), (_25149, 8), (_25148, 8), (_25147, 8), (_25146, 8), (_25145, 8), (_25144, 8), (_25143, 8), (_25142, 8), (_25141, 8), (_25140, 8), (_25139, 8), (_25138, 8), (_25137, 8), (_25136, 8), (_25135, 8), (_25134, 8), (_25133, 8), (_25132, 8), (_25131, 8), (_25130, 8), (_25129, 8), (_25128, 8), (_25482, 8), (_25481, 8), (_25480, 8), (_25479, 8), (_25478, 8), (_25477, 8), (_25476, 8), (_25475, 8), (_25474, 8), (_25473, 8), (_25472, 8), (_25471, 8), (_25470, 8), (_25469, 8), (_25468, 8), (_25467, 8), (_25466, 8), (_25465, 8), (_25464, 8), (_25463, 8), (_25462, 8), (_25461, 8), (_25460, 8), (_25459, 8), (_25458, 8), (_25457, 8), (_25456, 8), (_25455, 8), (_25454, 8), (_25453, 8), (_25452, 8), (_25451, 8), (_25805, 8), (_25804, 8), (_25803, 8), (_25802, 8), (_25801, 8), (_25800, 8), (_25799, 8), (_25798, 8), (_25797, 8), (_25796, 8), (_25795, 8), (_25794, 8), (_25793, 8), (_25792, 8), (_25791, 8), (_25790, 8), (_25789, 8), (_25788, 8), (_25787, 8), (_25786, 8), (_25785, 8), (_25784, 8), (_25783, 8), (_25782, 8), (_25781, 8), (_25780, 8), (_25779, 8), (_25778, 8), (_25777, 8), (_25776, 8), (_25775, 8), (_25774, 8), (_26128, 8), (_26127, 8), (_26126, 8), (_26125, 8), (_26124, 8), (_26123, 8), (_26122, 8), (_26121, 8), (_26120, 8), (_26119, 8), (_26118, 8), (_26117, 8), (_26116, 8), (_26115, 8), (_26114, 8), (_26113, 8), (_26112, 8), (_26111, 8), (_26110, 8), (_26109, 8), (_26108, 8), (_26107, 8), (_26106, 8), (_26105, 8), (_26104, 8), (_26103, 8), (_26102, 8), (_26101, 8), (_26100, 8), (_26099, 8), (_26098, 8), (_26097, 8), (_26451, 8), (_26450, 8), (_26449, 8), (_26448, 8), (_26447, 8), (_26446, 8), (_26445, 8), (_26444, 8), (_26443, 8), (_26442, 8), (_26441, 8), (_26440, 8), (_26439, 8), (_26438, 8), (_26437, 8), (_26436, 8), (_26435, 8), (_26434, 8), (_26433, 8), (_26432, 8), (_26431, 8), (_26430, 8), (_26429, 8), (_26428, 8), (_26427, 8), (_26426, 8), (_26425, 8), (_26424, 8), (_26423, 8), (_26422, 8), (_26421, 8), (_26420, 8), (_26774, 8), (_26773, 8), (_26772, 8), (_26771, 8), (_26770, 8), (_26769, 8), (_26768, 8), (_26767, 8), (_26766, 8), (_26765, 8), (_26764, 8), (_26763, 8), (_26762, 8), (_26761, 8), (_26760, 8), (_26759, 8), (_26758, 8), (_26757, 8), (_26756, 8), (_26755, 8), (_26754, 8), (_26753, 8), (_26752, 8), (_26751, 8), (_26750, 8), (_26749, 8), (_26748, 8), (_26747, 8), (_26746, 8), (_26745, 8), (_26744, 8), (_26743, 8), (_27097, 8), (_27096, 8), (_27095, 8), (_27094, 8), (_27093, 8), (_27092, 8), (_27091, 8), (_27090, 8), (_27089, 8), (_27088, 8), (_27087, 8), (_27086, 8), (_27085, 8), (_27084, 8), (_27083, 8), (_27082, 8), (_27081, 8), (_27080, 8), (_27079, 8), (_27078, 8), (_27077, 8), (_27076, 8), (_27075, 8), (_27074, 8), (_27073, 8), (_27072, 8), (_27071, 8), (_27070, 8), (_27069, 8), (_27068, 8), (_27067, 8), (_27066, 8), (_27420, 8), (_27419, 8), (_27418, 8), (_27417, 8), (_27416, 8), (_27415, 8), (_27414, 8), (_27413, 8), (_27412, 8), (_27411, 8), (_27410, 8), (_27409, 8), (_27408, 8), (_27407, 8), (_27406, 8), (_27405, 8), (_27404, 8), (_27403, 8), (_27402, 8), (_27401, 8), (_27400, 8), (_27399, 8), (_27398, 8), (_27397, 8), (_27396, 8), (_27395, 8), (_27394, 8), (_27393, 8), (_27392, 8), (_27391, 8), (_27390, 8), (_27389, 8), (_27743, 8), (_27742, 8), (_27741, 8), (_27740, 8), (_27739, 8), (_27738, 8), (_27737, 8), (_27736, 8), (_27735, 8), (_27734, 8), (_27733, 8), (_27732, 8), (_27731, 8), (_27730, 8), (_27729, 8), (_27728, 8), (_27727, 8), (_27726, 8), (_27725, 8), (_27724, 8), (_27723, 8), (_27722, 8), (_27721, 8), (_27720, 8), (_27719, 8), (_27718, 8), (_27717, 8), (_27716, 8), (_27715, 8), (_27714, 8), (_27713, 8), (_27712, 8), (_28066, 8), (_28065, 8), (_28064, 8), (_28063, 8), (_28062, 8), (_28061, 8), (_28060, 8), (_28059, 8), (_28058, 8), (_28057, 8), (_28056, 8), (_28055, 8), (_28054, 8), (_28053, 8), (_28052, 8), (_28051, 8), (_28050, 8), (_28049, 8), (_28048, 8), (_28047, 8), (_28046, 8), (_28045, 8), (_28044, 8), (_28043, 8), (_28042, 8), (_28041, 8), (_28040, 8), (_28039, 8), (_28038, 8), (_28037, 8), (_28036, 8), (_28035, 8), (_28389, 8), (_28388, 8), (_28387, 8), (_28386, 8), (_28385, 8), (_28384, 8), (_28383, 8), (_28382, 8), (_28381, 8), (_28380, 8), (_28379, 8), (_28378, 8), (_28377, 8), (_28376, 8), (_28375, 8), (_28374, 8), (_28373, 8), (_28372, 8), (_28371, 8), (_28370, 8), (_28369, 8), (_28368, 8), (_28367, 8), (_28366, 8), (_28365, 8), (_28364, 8), (_28363, 8), (_28362, 8), (_28361, 8), (_28360, 8), (_28359, 8), (_28358, 8), (_28712, 8), (_28711, 8), (_28710, 8), (_28709, 8), (_28708, 8), (_28707, 8), (_28706, 8), (_28705, 8), (_28704, 8), (_28703, 8), (_28702, 8), (_28701, 8), (_28700, 8), (_28699, 8), (_28698, 8), (_28697, 8), (_28696, 8), (_28695, 8), (_28694, 8), (_28693, 8), (_28692, 8), (_28691, 8), (_28690, 8), (_28689, 8), (_28688, 8), (_28687, 8), (_28686, 8), (_28685, 8), (_28684, 8), (_28683, 8), (_28682, 8), (_28681, 8), (_29035, 8), (_29034, 8), (_29033, 8), (_29032, 8), (_29031, 8), (_29030, 8), (_29029, 8), (_29028, 8), (_29027, 8), (_29026, 8), (_29025, 8), (_29024, 8), (_29023, 8), (_29022, 8), (_29021, 8), (_29020, 8), (_29019, 8), (_29018, 8), (_29017, 8), (_29016, 8), (_29015, 8), (_29014, 8), (_29013, 8), (_29012, 8), (_29011, 8), (_29010, 8), (_29009, 8), (_29008, 8), (_29007, 8), (_29006, 8), (_29005, 8), (_29004, 8), (_29358, 8), (_29357, 8), (_29356, 8), (_29355, 8), (_29354, 8), (_29353, 8), (_29352, 8), (_29351, 8), (_29350, 8), (_29349, 8), (_29348, 8), (_29347, 8), (_29346, 8), (_29345, 8), (_29344, 8), (_29343, 8), (_29342, 8), (_29341, 8), (_29340, 8), (_29339, 8), (_29338, 8), (_29337, 8), (_29336, 8), (_29335, 8), (_29334, 8), (_29333, 8), (_29332, 8), (_29331, 8), (_29330, 8), (_29329, 8), (_29328, 8), (_29327, 8), (_29681, 8), (_29680, 8), (_29679, 8), (_29678, 8), (_29677, 8), (_29676, 8), (_29675, 8), (_29674, 8), (_29673, 8), (_29672, 8), (_29671, 8), (_29670, 8), (_29669, 8), (_29668, 8), (_29667, 8), (_29666, 8), (_29665, 8), (_29664, 8), (_29663, 8), (_29662, 8), (_29661, 8), (_29660, 8), (_29659, 8), (_29658, 8), (_29657, 8), (_29656, 8), (_29655, 8), (_29654, 8), (_29653, 8), (_29652, 8), (_29651, 8), (_29650, 8), (_30004, 8), (_30003, 8), (_30002, 8), (_30001, 8), (_30000, 8), (_29999, 8), (_29998, 8), (_29997, 8), (_29996, 8), (_29995, 8), (_29994, 8), (_29993, 8), (_29992, 8), (_29991, 8), (_29990, 8), (_29989, 8), (_29988, 8), (_29987, 8), (_29986, 8), (_29985, 8), (_29984, 8), (_29983, 8), (_29982, 8), (_29981, 8), (_29980, 8), (_29979, 8), (_29978, 8), (_29977, 8), (_29976, 8), (_29975, 8), (_29974, 8), (_29973, 8), (_30327, 8), (_30326, 8), (_30325, 8), (_30324, 8), (_30323, 8), (_30322, 8), (_30321, 8), (_30320, 8), (_30319, 8), (_30318, 8), (_30317, 8), (_30316, 8), (_30315, 8), (_30314, 8), (_30313, 8), (_30312, 8), (_30311, 8), (_30310, 8), (_30309, 8), (_30308, 8), (_30307, 8), (_30306, 8), (_30305, 8), (_30304, 8), (_30303, 8), (_30302, 8), (_30301, 8), (_30300, 8), (_30299, 8), (_30298, 8), (_30297, 8), (_30296, 8), (_30650, 8), (_30649, 8), (_30648, 8), (_30647, 8), (_30646, 8), (_30645, 8), (_30644, 8), (_30643, 8), (_30642, 8), (_30641, 8), (_30640, 8), (_30639, 8), (_30638, 8), (_30637, 8), (_30636, 8), (_30635, 8), (_30634, 8), (_30633, 8), (_30632, 8), (_30631, 8), (_30630, 8), (_30629, 8), (_30628, 8), (_30627, 8), (_30626, 8), (_30625, 8), (_30624, 8), (_30623, 8), (_30622, 8), (_30621, 8), (_30620, 8), (_30619, 8), (_30973, 8), (_30972, 8), (_30971, 8), (_30970, 8), (_30969, 8), (_30968, 8), (_30967, 8), (_30966, 8), (_30965, 8), (_30964, 8), (_30963, 8), (_30962, 8), (_30961, 8), (_30960, 8), (_30959, 8), (_30958, 8), (_30957, 8), (_30956, 8), (_30955, 8), (_30954, 8), (_30953, 8), (_30952, 8), (_30951, 8), (_30950, 8), (_30949, 8), (_30948, 8), (_30947, 8), (_30946, 8), (_30945, 8), (_30944, 8), (_30943, 8), (_30942, 8), (_31296, 8), (_31295, 8), (_31294, 8), (_31293, 8), (_31292, 8), (_31291, 8), (_31290, 8), (_31289, 8), (_31288, 8), (_31287, 8), (_31286, 8), (_31285, 8), (_31284, 8), (_31283, 8), (_31282, 8), (_31281, 8), (_31280, 8), (_31279, 8), (_31278, 8), (_31277, 8), (_31276, 8), (_31275, 8), (_31274, 8), (_31273, 8), (_31272, 8), (_31271, 8), (_31270, 8), (_31269, 8), (_31268, 8), (_31267, 8), (_31266, 8), (_31265, 8), (_31619, 8), (_31618, 8), (_31617, 8), (_31616, 8), (_31615, 8), (_31614, 8), (_31613, 8), (_31612, 8), (_31611, 8), (_31610, 8), (_31609, 8), (_31608, 8), (_31607, 8), (_31606, 8), (_31605, 8), (_31604, 8), (_31603, 8), (_31602, 8), (_31601, 8), (_31600, 8), (_31599, 8), (_31598, 8), (_31597, 8), (_31596, 8), (_31595, 8), (_31594, 8), (_31593, 8), (_31592, 8), (_31591, 8), (_31590, 8), (_31589, 8), (_31588, 8), (_31942, 8), (_31941, 8), (_31940, 8), (_31939, 8), (_31938, 8), (_31937, 8), (_31936, 8), (_31935, 8), (_31934, 8), (_31933, 8), (_31932, 8), (_31931, 8), (_31930, 8), (_31929, 8), (_31928, 8), (_31927, 8), (_31926, 8), (_31925, 8), (_31924, 8), (_31923, 8), (_31922, 8), (_31921, 8), (_31920, 8), (_31919, 8), (_31918, 8), (_31917, 8), (_31916, 8), (_31915, 8), (_31914, 8), (_31913, 8), (_31912, 8), (_31911, 8), (_32265, 8), (_32264, 8), (_32263, 8), (_32262, 8), (_32261, 8), (_32260, 8), (_32259, 8), (_32258, 8), (_32257, 8), (_32256, 8), (_32255, 8), (_32254, 8), (_32253, 8), (_32252, 8), (_32251, 8), (_32250, 8), (_32249, 8), (_32248, 8), (_32247, 8), (_32246, 8), (_32245, 8), (_32244, 8), (_32243, 8), (_32242, 8), (_32241, 8), (_32240, 8), (_32239, 8), (_32238, 8), (_32237, 8), (_32236, 8), (_32235, 8), (_32234, 8), (_32588, 8), (_32587, 8), (_32586, 8), (_32585, 8), (_32584, 8), (_32583, 8), (_32582, 8), (_32581, 8), (_32580, 8), (_32579, 8), (_32578, 8), (_32577, 8), (_32576, 8), (_32575, 8), (_32574, 8), (_32573, 8), (_32572, 8), (_32571, 8), (_32570, 8), (_32569, 8), (_32568, 8), (_32567, 8), (_32566, 8), (_32565, 8), (_32564, 8), (_32563, 8), (_32562, 8), (_32561, 8), (_32560, 8), (_32559, 8), (_32558, 8), (_32557, 8), (_32911, 8), (_32910, 8), (_32909, 8), (_32908, 8), (_32907, 8), (_32906, 8), (_32905, 8), (_32904, 8), (_32903, 8), (_32902, 8), (_32901, 8), (_32900, 8), (_32899, 8), (_32898, 8), (_32897, 8), (_32896, 8), (_32895, 8), (_32894, 8), (_32893, 8), (_32892, 8), (_32891, 8), (_32890, 8), (_32889, 8), (_32888, 8), (_32887, 8), (_32886, 8), (_32885, 8), (_32884, 8), (_32883, 8), (_32882, 8), (_32881, 8), (_32880, 8), (_33234, 8), (_33233, 8), (_33232, 8), (_33231, 8), (_33230, 8), (_33229, 8), (_33228, 8), (_33227, 8), (_33226, 8), (_33225, 8), (_33224, 8), (_33223, 8), (_33222, 8), (_33221, 8), (_33220, 8), (_33219, 8), (_33218, 8), (_33217, 8), (_33216, 8), (_33215, 8), (_33214, 8), (_33213, 8), (_33212, 8), (_33211, 8), (_33210, 8), (_33209, 8), (_33208, 8), (_33207, 8), (_33206, 8), (_33205, 8), (_33204, 8), (_33203, 8), (_33557, 8), (_33556, 8), (_33555, 8), (_33554, 8), (_33553, 8), (_33552, 8), (_33551, 8), (_33550, 8), (_33549, 8), (_33548, 8), (_33547, 8), (_33546, 8), (_33545, 8), (_33544, 8), (_33543, 8), (_33542, 8), (_33541, 8), (_33540, 8), (_33539, 8), (_33538, 8), (_33537, 8), (_33536, 8), (_33535, 8), (_33534, 8), (_33533, 8), (_33532, 8), (_33531, 8), (_33530, 8), (_33529, 8), (_33528, 8), (_33527, 8), (_33526, 8), (_33880, 8), (_33879, 8), (_33878, 8), (_33877, 8), (_33876, 8), (_33875, 8), (_33874, 8), (_33873, 8), (_33872, 8), (_33871, 8), (_33870, 8), (_33869, 8), (_33868, 8), (_33867, 8), (_33866, 8), (_33865, 8), (_33864, 8), (_33863, 8), (_33862, 8), (_33861, 8), (_33860, 8), (_33859, 8), (_33858, 8), (_33857, 8), (_33856, 8), (_33855, 8), (_33854, 8), (_33853, 8), (_33852, 8), (_33851, 8), (_33850, 8), (_33849, 8), (_34203, 8), (_34202, 8), (_34201, 8), (_34200, 8), (_34199, 8), (_34198, 8), (_34197, 8), (_34196, 8), (_34195, 8), (_34194, 8), (_34193, 8), (_34192, 8), (_34191, 8), (_34190, 8), (_34189, 8), (_34188, 8), (_34187, 8), (_34186, 8), (_34185, 8), (_34184, 8), (_34183, 8), (_34182, 8), (_34181, 8), (_34180, 8), (_34179, 8), (_34178, 8), (_34177, 8), (_34176, 8), (_34175, 8), (_34174, 8), (_34173, 8), (_34172, 8), (_34526, 8), (_34525, 8), (_34524, 8), (_34523, 8), (_34522, 8), (_34521, 8), (_34520, 8), (_34519, 8), (_34518, 8), (_34517, 8), (_34516, 8), (_34515, 8), (_34514, 8), (_34513, 8), (_34512, 8), (_34511, 8), (_34510, 8), (_34509, 8), (_34508, 8), (_34507, 8), (_34506, 8), (_34505, 8), (_34504, 8), (_34503, 8), (_34502, 8), (_34501, 8), (_34500, 8), (_34499, 8), (_34498, 8), (_34497, 8), (_34496, 8), (_34495, 8), (_34849, 8), (_34848, 8), (_34847, 8), (_34846, 8), (_34845, 8), (_34844, 8), (_34843, 8), (_34842, 8), (_34841, 8), (_34840, 8), (_34839, 8), (_34838, 8), (_34837, 8), (_34836, 8), (_34835, 8), (_34834, 8), (_34833, 8), (_34832, 8), (_34831, 8), (_34830, 8), (_34829, 8), (_34828, 8), (_34827, 8), (_34826, 8), (_34825, 8), (_34824, 8), (_34823, 8), (_34822, 8), (_34821, 8), (_34820, 8), (_34819, 8), (_34818, 8), (_35172, 8), (_35171, 8), (_35170, 8), (_35169, 8), (_35168, 8), (_35167, 8), (_35166, 8), (_35165, 8), (_35164, 8), (_35163, 8), (_35162, 8), (_35161, 8), (_35160, 8), (_35159, 8), (_35158, 8), (_35157, 8), (_35156, 8), (_35155, 8), (_35154, 8), (_35153, 8), (_35152, 8), (_35151, 8), (_35150, 8), (_35149, 8), (_35148, 8), (_35147, 8), (_35146, 8), (_35145, 8), (_35144, 8), (_35143, 8), (_35142, 8), (_35141, 8), (_35495, 8), (_35494, 8), (_35493, 8), (_35492, 8), (_35491, 8), (_35490, 8), (_35489, 8), (_35488, 8), (_35487, 8), (_35486, 8), (_35485, 8), (_35484, 8), (_35483, 8), (_35482, 8), (_35481, 8), (_35480, 8), (_35479, 8), (_35478, 8), (_35477, 8), (_35476, 8), (_35475, 8), (_35474, 8), (_35473, 8), (_35472, 8), (_35471, 8), (_35470, 8), (_35469, 8), (_35468, 8), (_35467, 8), (_35466, 8), (_35465, 8), (_35464, 8), (_35818, 8), (_35817, 8), (_35816, 8), (_35815, 8), (_35814, 8), (_35813, 8), (_35812, 8), (_35811, 8), (_35810, 8), (_35809, 8), (_35808, 8), (_35807, 8), (_35806, 8), (_35805, 8), (_35804, 8), (_35803, 8), (_35802, 8), (_35801, 8), (_35800, 8), (_35799, 8), (_35798, 8), (_35797, 8), (_35796, 8), (_35795, 8), (_35794, 8), (_35793, 8), (_35792, 8), (_35791, 8), (_35790, 8), (_35789, 8), (_35788, 8), (_35787, 8), (_36141, 8), (_36140, 8), (_36139, 8), (_36138, 8), (_36137, 8), (_36136, 8), (_36135, 8), (_36134, 8), (_36133, 8), (_36132, 8), (_36131, 8), (_36130, 8), (_36129, 8), (_36128, 8), (_36127, 8), (_36126, 8), (_36125, 8), (_36124, 8), (_36123, 8), (_36122, 8), (_36121, 8), (_36120, 8), (_36119, 8), (_36118, 8), (_36117, 8), (_36116, 8), (_36115, 8), (_36114, 8), (_36113, 8), (_36112, 8), (_36111, 8), (_36110, 8), (_36464, 8), (_36463, 8), (_36462, 8), (_36461, 8), (_36460, 8), (_36459, 8), (_36458, 8), (_36457, 8), (_36456, 8), (_36455, 8), (_36454, 8), (_36453, 8), (_36452, 8), (_36451, 8), (_36450, 8), (_36449, 8), (_36448, 8), (_36447, 8), (_36446, 8), (_36445, 8), (_36444, 8), (_36443, 8), (_36442, 8), (_36441, 8), (_36440, 8), (_36439, 8), (_36438, 8), (_36437, 8), (_36436, 8), (_36435, 8), (_36434, 8), (_36433, 8), (_36787, 8), (_36786, 8), (_36785, 8), (_36784, 8), (_36783, 8), (_36782, 8), (_36781, 8), (_36780, 8), (_36779, 8), (_36778, 8), (_36777, 8), (_36776, 8), (_36775, 8), (_36774, 8), (_36773, 8), (_36772, 8), (_36771, 8), (_36770, 8), (_36769, 8), (_36768, 8), (_36767, 8), (_36766, 8), (_36765, 8), (_36764, 8), (_36763, 8), (_36762, 8), (_36761, 8), (_36760, 8), (_36759, 8), (_36758, 8), (_36757, 8), (_36756, 8), (_37110, 8), (_37109, 8), (_37108, 8), (_37107, 8), (_37106, 8), (_37105, 8), (_37104, 8), (_37103, 8), (_37102, 8), (_37101, 8), (_37100, 8), (_37099, 8), (_37098, 8), (_37097, 8), (_37096, 8), (_37095, 8), (_37094, 8), (_37093, 8), (_37092, 8), (_37091, 8), (_37090, 8), (_37089, 8), (_37088, 8), (_37087, 8), (_37086, 8), (_37085, 8), (_37084, 8), (_37083, 8), (_37082, 8), (_37081, 8), (_37080, 8), (_37079, 8), (_37433, 8), (_37432, 8), (_37431, 8), (_37430, 8), (_37429, 8), (_37428, 8), (_37427, 8), (_37426, 8), (_37425, 8), (_37424, 8), (_37423, 8), (_37422, 8), (_37421, 8), (_37420, 8), (_37419, 8), (_37418, 8), (_37417, 8), (_37416, 8), (_37415, 8), (_37414, 8), (_37413, 8), (_37412, 8), (_37411, 8), (_37410, 8), (_37409, 8), (_37408, 8), (_37407, 8), (_37406, 8), (_37405, 8), (_37404, 8), (_37403, 8), (_37402, 8), (_37756, 8), (_37755, 8), (_37754, 8), (_37753, 8), (_37752, 8), (_37751, 8), (_37750, 8), (_37749, 8), (_37748, 8), (_37747, 8), (_37746, 8), (_37745, 8), (_37744, 8), (_37743, 8), (_37742, 8), (_37741, 8), (_37740, 8), (_37739, 8), (_37738, 8), (_37737, 8), (_37736, 8), (_37735, 8), (_37734, 8), (_37733, 8), (_37732, 8), (_37731, 8), (_37730, 8), (_37729, 8), (_37728, 8), (_37727, 8), (_37726, 8), (_37725, 8), (_38079, 8), (_38078, 8), (_38077, 8), (_38076, 8), (_38075, 8), (_38074, 8), (_38073, 8), (_38072, 8), (_38071, 8), (_38070, 8), (_38069, 8), (_38068, 8), (_38067, 8), (_38066, 8), (_38065, 8), (_38064, 8), (_38063, 8), (_38062, 8), (_38061, 8), (_38060, 8), (_38059, 8), (_38058, 8), (_38057, 8), (_38056, 8), (_38055, 8), (_38054, 8), (_38053, 8), (_38052, 8), (_38051, 8), (_38050, 8), (_38049, 8), (_38048, 8), (_38402, 8), (_38401, 8), (_38400, 8), (_38399, 8), (_38398, 8), (_38397, 8), (_38396, 8), (_38395, 8), (_38394, 8), (_38393, 8), (_38392, 8), (_38391, 8), (_38390, 8), (_38389, 8), (_38388, 8), (_38387, 8), (_38386, 8), (_38385, 8), (_38384, 8), (_38383, 8), (_38382, 8), (_38381, 8), (_38380, 8), (_38379, 8), (_38378, 8), (_38377, 8), (_38376, 8), (_38375, 8), (_38374, 8), (_38373, 8), (_38372, 8), (_38371, 8), (_38725, 8), (_38724, 8), (_38723, 8), (_38722, 8), (_38721, 8), (_38720, 8), (_38719, 8), (_38718, 8), (_38717, 8), (_38716, 8), (_38715, 8), (_38714, 8), (_38713, 8), (_38712, 8), (_38711, 8), (_38710, 8), (_38709, 8), (_38708, 8), (_38707, 8), (_38706, 8), (_38705, 8), (_38704, 8), (_38703, 8), (_38702, 8), (_38701, 8), (_38700, 8), (_38699, 8), (_38698, 8), (_38697, 8), (_38696, 8), (_38695, 8), (_38694, 8), (_39048, 8), (_39047, 8), (_39046, 8), (_39045, 8), (_39044, 8), (_39043, 8), (_39042, 8), (_39041, 8), (_39040, 8), (_39039, 8), (_39038, 8), (_39037, 8), (_39036, 8), (_39035, 8), (_39034, 8), (_39033, 8), (_39032, 8), (_39031, 8), (_39030, 8), (_39029, 8), (_39028, 8), (_39027, 8), (_39026, 8), (_39025, 8), (_39024, 8), (_39023, 8), (_39022, 8), (_39021, 8), (_39020, 8), (_39019, 8), (_39018, 8), (_39017, 8), (_39371, 8), (_39370, 8), (_39369, 8), (_39368, 8), (_39367, 8), (_39366, 8), (_39365, 8), (_39364, 8), (_39363, 8), (_39362, 8), (_39361, 8), (_39360, 8), (_39359, 8), (_39358, 8), (_39357, 8), (_39356, 8), (_39355, 8), (_39354, 8), (_39353, 8), (_39352, 8), (_39351, 8), (_39350, 8), (_39349, 8), (_39348, 8), (_39347, 8), (_39346, 8), (_39345, 8), (_39344, 8), (_39343, 8), (_39342, 8), (_39341, 8), (_39340, 8), (_39694, 8), (_39693, 8), (_39692, 8), (_39691, 8), (_39690, 8), (_39689, 8), (_39688, 8), (_39687, 8), (_39686, 8), (_39685, 8), (_39684, 8), (_39683, 8), (_39682, 8), (_39681, 8), (_39680, 8), (_39679, 8), (_39678, 8), (_39677, 8), (_39676, 8), (_39675, 8), (_39674, 8), (_39673, 8), (_39672, 8), (_39671, 8), (_39670, 8), (_39669, 8), (_39668, 8), (_39667, 8), (_39666, 8), (_39665, 8), (_39664, 8), (_39663, 8), (_40017, 8), (_40016, 8), (_40015, 8), (_40014, 8), (_40013, 8), (_40012, 8), (_40011, 8), (_40010, 8), (_40009, 8), (_40008, 8), (_40007, 8), (_40006, 8), (_40005, 8), (_40004, 8), (_40003, 8), (_40002, 8), (_40001, 8), (_40000, 8), (_39999, 8), (_39998, 8), (_39997, 8), (_39996, 8), (_39995, 8), (_39994, 8), (_39993, 8), (_39992, 8), (_39991, 8), (_39990, 8), (_39989, 8), (_39988, 8), (_39987, 8), (_39986, 8), (_40340, 8), (_40339, 8), (_40338, 8), (_40337, 8), (_40336, 8), (_40335, 8), (_40334, 8), (_40333, 8), (_40332, 8), (_40331, 8), (_40330, 8), (_40329, 8), (_40328, 8), (_40327, 8), (_40326, 8), (_40325, 8), (_40324, 8), (_40323, 8), (_40322, 8), (_40321, 8), (_40320, 8), (_40319, 8), (_40318, 8), (_40317, 8), (_40316, 8), (_40315, 8), (_40314, 8), (_40313, 8), (_40312, 8), (_40311, 8), (_40310, 8), (_40309, 8), (_40663, 8), (_40662, 8), (_40661, 8), (_40660, 8), (_40659, 8), (_40658, 8), (_40657, 8), (_40656, 8), (_40655, 8), (_40654, 8), (_40653, 8), (_40652, 8), (_40651, 8), (_40650, 8), (_40649, 8), (_40648, 8), (_40647, 8), (_40646, 8), (_40645, 8), (_40644, 8), (_40643, 8), (_40642, 8), (_40641, 8), (_40640, 8), (_40639, 8), (_40638, 8), (_40637, 8), (_40636, 8), (_40635, 8), (_40634, 8), (_40633, 8), (_40632, 8), (_40986, 8), (_40985, 8), (_40984, 8), (_40983, 8), (_40982, 8), (_40981, 8), (_40980, 8), (_40979, 8), (_40978, 8), (_40977, 8), (_40976, 8), (_40975, 8), (_40974, 8), (_40973, 8), (_40972, 8), (_40971, 8), (_40970, 8), (_40969, 8), (_40968, 8), (_40967, 8), (_40966, 8), (_40965, 8), (_40964, 8), (_40963, 8), (_40962, 8), (_40961, 8), (_40960, 8), (_40959, 8), (_40958, 8), (_40957, 8), (_40956, 8), (_40955, 8), (_41309, 8), (_41308, 8), (_41307, 8), (_41306, 8), (_41305, 8), (_41304, 8), (_41303, 8), (_41302, 8), (_41301, 8), (_41300, 8), (_41299, 8), (_41298, 8), (_41297, 8), (_41296, 8), (_41295, 8), (_41294, 8), (_41293, 8), (_41292, 8), (_41291, 8), (_41290, 8), (_41289, 8), (_41288, 8), (_41287, 8), (_41286, 8), (_41285, 8), (_41284, 8), (_41283, 8), (_41282, 8), (_41281, 8), (_41280, 8), (_41279, 8), (_41278, 8), (_41632, 8), (_41631, 8), (_41630, 8), (_41629, 8), (_41628, 8), (_41627, 8), (_41626, 8), (_41625, 8), (_41624, 8), (_41623, 8), (_41622, 8), (_41621, 8), (_41620, 8), (_41619, 8), (_41618, 8), (_41617, 8), (_41616, 8), (_41615, 8), (_41614, 8), (_41613, 8), (_41612, 8), (_41611, 8), (_41610, 8), (_41609, 8), (_41608, 8), (_41607, 8), (_41606, 8), (_41605, 8), (_41604, 8), (_41603, 8), (_41602, 8), (_41601, 8), (_41955, 8), (_41954, 8), (_41953, 8), (_41952, 8), (_41951, 8), (_41950, 8), (_41949, 8), (_41948, 8), (_41947, 8), (_41946, 8), (_41945, 8), (_41944, 8), (_41943, 8), (_41942, 8), (_41941, 8), (_41940, 8), (_41939, 8), (_41938, 8), (_41937, 8), (_41936, 8), (_41935, 8), (_41934, 8), (_41933, 8), (_41932, 8), (_41931, 8), (_41930, 8), (_41929, 8), (_41928, 8), (_41927, 8), (_41926, 8), (_41925, 8), (_41924, 8), (_42278, 8), (_42277, 8), (_42276, 8), (_42275, 8), (_42274, 8), (_42273, 8), (_42272, 8), (_42271, 8), (_42270, 8), (_42269, 8), (_42268, 8), (_42267, 8), (_42266, 8), (_42265, 8), (_42264, 8), (_42263, 8), (_42262, 8), (_42261, 8), (_42260, 8), (_42259, 8), (_42258, 8), (_42257, 8), (_42256, 8), (_42255, 8), (_42254, 8), (_42253, 8), (_42252, 8), (_42251, 8), (_42250, 8), (_42249, 8), (_42248, 8), (_42247, 8), (_42601, 8), (_42600, 8), (_42599, 8), (_42598, 8), (_42597, 8), (_42596, 8), (_42595, 8), (_42594, 8), (_42593, 8), (_42592, 8), (_42591, 8), (_42590, 8), (_42589, 8), (_42588, 8), (_42587, 8), (_42586, 8), (_42585, 8), (_42584, 8), (_42583, 8), (_42582, 8), (_42581, 8), (_42580, 8), (_42579, 8), (_42578, 8), (_42577, 8), (_42576, 8), (_42575, 8), (_42574, 8), (_42573, 8), (_42572, 8), (_42571, 8), (_42570, 8), (_42924, 8), (_42923, 8), (_42922, 8), (_42921, 8), (_42920, 8), (_42919, 8), (_42918, 8), (_42917, 8), (_42916, 8), (_42915, 8), (_42914, 8), (_42913, 8), (_42912, 8), (_42911, 8), (_42910, 8), (_42909, 8), (_42908, 8), (_42907, 8), (_42906, 8), (_42905, 8), (_42904, 8), (_42903, 8), (_42902, 8), (_42901, 8), (_42900, 8), (_42899, 8), (_42898, 8), (_42897, 8), (_42896, 8), (_42895, 8), (_42894, 8), (_42893, 8), (_43247, 8), (_43246, 8), (_43245, 8), (_43244, 8), (_43243, 8), (_43242, 8), (_43241, 8), (_43240, 8), (_43239, 8), (_43238, 8), (_43237, 8), (_43236, 8), (_43235, 8), (_43234, 8), (_43233, 8), (_43232, 8), (_43231, 8), (_43230, 8), (_43229, 8), (_43228, 8), (_43227, 8), (_43226, 8), (_43225, 8), (_43224, 8), (_43223, 8), (_43222, 8), (_43221, 8), (_43220, 8), (_43219, 8), (_43218, 8), (_43217, 8), (_43216, 8), (_43570, 8), (_43569, 8), (_43568, 8), (_43567, 8), (_43566, 8), (_43565, 8), (_43564, 8), (_43563, 8), (_43562, 8), (_43561, 8), (_43560, 8), (_43559, 8), (_43558, 8), (_43557, 8), (_43556, 8), (_43555, 8), (_43554, 8), (_43553, 8), (_43552, 8), (_43551, 8), (_43550, 8), (_43549, 8), (_43548, 8), (_43547, 8), (_43546, 8), (_43545, 8), (_43544, 8), (_43543, 8), (_43542, 8), (_43541, 8), (_43540, 8), (_43539, 8), (_43893, 8), (_43892, 8), (_43891, 8), (_43890, 8), (_43889, 8), (_43888, 8), (_43887, 8), (_43886, 8), (_43885, 8), (_43884, 8), (_43883, 8), (_43882, 8), (_43881, 8), (_43880, 8), (_43879, 8), (_43878, 8), (_43877, 8), (_43876, 8), (_43875, 8), (_43874, 8), (_43873, 8), (_43872, 8), (_43871, 8), (_43870, 8), (_43869, 8), (_43868, 8), (_43867, 8), (_43866, 8), (_43865, 8), (_43864, 8), (_43863, 8), (_43862, 8), (_44216, 8), (_44215, 8), (_44214, 8), (_44213, 8), (_44212, 8), (_44211, 8), (_44210, 8), (_44209, 8), (_44208, 8), (_44207, 8), (_44206, 8), (_44205, 8), (_44204, 8), (_44203, 8), (_44202, 8), (_44201, 8), (_44200, 8), (_44199, 8), (_44198, 8), (_44197, 8), (_44196, 8), (_44195, 8), (_44194, 8), (_44193, 8), (_44192, 8), (_44191, 8), (_44190, 8), (_44189, 8), (_44188, 8), (_44187, 8), (_44186, 8), (_44185, 8), (_44539, 8), (_44538, 8), (_44537, 8), (_44536, 8), (_44535, 8), (_44534, 8), (_44533, 8), (_44532, 8), (_44531, 8), (_44530, 8), (_44529, 8), (_44528, 8), (_44527, 8), (_44526, 8), (_44525, 8), (_44524, 8), (_44523, 8), (_44522, 8), (_44521, 8), (_44520, 8), (_44519, 8), (_44518, 8), (_44517, 8), (_44516, 8), (_44515, 8), (_44514, 8), (_44513, 8), (_44512, 8), (_44511, 8), (_44510, 8), (_44509, 8), (_44508, 8), (_44862, 8), (_44861, 8), (_44860, 8), (_44859, 8), (_44858, 8), (_44857, 8), (_44856, 8), (_44855, 8), (_44854, 8), (_44853, 8), (_44852, 8), (_44851, 8), (_44850, 8), (_44849, 8), (_44848, 8), (_44847, 8), (_44846, 8), (_44845, 8), (_44844, 8), (_44843, 8), (_44842, 8), (_44841, 8), (_44840, 8), (_44839, 8), (_44838, 8), (_44837, 8), (_44836, 8), (_44835, 8), (_44834, 8), (_44833, 8), (_44832, 8), (_44831, 8), (_45185, 8), (_45184, 8), (_45183, 8), (_45182, 8), (_45181, 8), (_45180, 8), (_45179, 8), (_45178, 8), (_45177, 8), (_45176, 8), (_45175, 8), (_45174, 8), (_45173, 8), (_45172, 8), (_45171, 8), (_45170, 8), (_45169, 8), (_45168, 8), (_45167, 8), (_45166, 8), (_45165, 8), (_45164, 8), (_45163, 8), (_45162, 8), (_45161, 8), (_45160, 8), (_45159, 8), (_45158, 8), (_45157, 8), (_45156, 8), (_45155, 8), (_45154, 8), (_45508, 8), (_45507, 8), (_45506, 8), (_45505, 8), (_45504, 8), (_45503, 8), (_45502, 8), (_45501, 8), (_45500, 8), (_45499, 8), (_45498, 8), (_45497, 8), (_45496, 8), (_45495, 8), (_45494, 8), (_45493, 8), (_45492, 8), (_45491, 8), (_45490, 8), (_45489, 8), (_45488, 8), (_45487, 8), (_45486, 8), (_45485, 8), (_45484, 8), (_45483, 8), (_45482, 8), (_45481, 8), (_45480, 8), (_45479, 8), (_45478, 8), (_45477, 8), (_45831, 8), (_45830, 8), (_45829, 8), (_45828, 8), (_45827, 8), (_45826, 8), (_45825, 8), (_45824, 8), (_45823, 8), (_45822, 8), (_45821, 8), (_45820, 8), (_45819, 8), (_45818, 8), (_45817, 8), (_45816, 8), (_45815, 8), (_45814, 8), (_45813, 8), (_45812, 8), (_45811, 8), (_45810, 8), (_45809, 8), (_45808, 8), (_45807, 8), (_45806, 8), (_45805, 8), (_45804, 8), (_45803, 8), (_45802, 8), (_45801, 8), (_45800, 8), (_46154, 8), (_46153, 8), (_46152, 8), (_46151, 8), (_46150, 8), (_46149, 8), (_46148, 8), (_46147, 8), (_46146, 8), (_46145, 8), (_46144, 8), (_46143, 8), (_46142, 8), (_46141, 8), (_46140, 8), (_46139, 8), (_46138, 8), (_46137, 8), (_46136, 8), (_46135, 8), (_46134, 8), (_46133, 8), (_46132, 8), (_46131, 8), (_46130, 8), (_46129, 8), (_46128, 8), (_46127, 8), (_46126, 8), (_46125, 8), (_46124, 8), (_46123, 8), (_46477, 8), (_46476, 8), (_46475, 8), (_46474, 8), (_46473, 8), (_46472, 8), (_46471, 8), (_46470, 8), (_46469, 8), (_46468, 8), (_46467, 8), (_46466, 8), (_46465, 8), (_46464, 8), (_46463, 8), (_46462, 8), (_46461, 8), (_46460, 8), (_46459, 8), (_46458, 8), (_46457, 8), (_46456, 8), (_46455, 8), (_46454, 8), (_46453, 8), (_46452, 8), (_46451, 8), (_46450, 8), (_46449, 8), (_46448, 8), (_46447, 8), (_46446, 8), (_46800, 8), (_46799, 8), (_46798, 8), (_46797, 8), (_46796, 8), (_46795, 8), (_46794, 8), (_46793, 8), (_46792, 8), (_46791, 8), (_46790, 8), (_46789, 8), (_46788, 8), (_46787, 8), (_46786, 8), (_46785, 8), (_46784, 8), (_46783, 8), (_46782, 8), (_46781, 8), (_46780, 8), (_46779, 8), (_46778, 8), (_46777, 8), (_46776, 8), (_46775, 8), (_46774, 8), (_46773, 8), (_46772, 8), (_46771, 8), (_46770, 8), (_46769, 8), (_47123, 8), (_47122, 8), (_47121, 8), (_47120, 8), (_47119, 8), (_47118, 8), (_47117, 8), (_47116, 8), (_47115, 8), (_47114, 8), (_47113, 8), (_47112, 8), (_47111, 8), (_47110, 8), (_47109, 8), (_47108, 8), (_47107, 8), (_47106, 8), (_47105, 8), (_47104, 8), (_47103, 8), (_47102, 8), (_47101, 8), (_47100, 8), (_47099, 8), (_47098, 8), (_47097, 8), (_47096, 8), (_47095, 8), (_47094, 8), (_47093, 8), (_47092, 8), (_47446, 8), (_47445, 8), (_47444, 8), (_47443, 8), (_47442, 8), (_47441, 8), (_47440, 8), (_47439, 8), (_47438, 8), (_47437, 8), (_47436, 8), (_47435, 8), (_47434, 8), (_47433, 8), (_47432, 8), (_47431, 8), (_47430, 8), (_47429, 8), (_47428, 8), (_47427, 8), (_47426, 8), (_47425, 8), (_47424, 8), (_47423, 8), (_47422, 8), (_47421, 8), (_47420, 8), (_47419, 8), (_47418, 8), (_47417, 8), (_47416, 8), (_47415, 8), (_47769, 8), (_47768, 8), (_47767, 8), (_47766, 8), (_47765, 8), (_47764, 8), (_47763, 8), (_47762, 8), (_47761, 8), (_47760, 8), (_47759, 8), (_47758, 8), (_47757, 8), (_47756, 8), (_47755, 8), (_47754, 8), (_47753, 8), (_47752, 8), (_47751, 8), (_47750, 8), (_47749, 8), (_47748, 8), (_47747, 8), (_47746, 8), (_47745, 8), (_47744, 8), (_47743, 8), (_47742, 8), (_47741, 8), (_47740, 8), (_47739, 8), (_47738, 8), (_48092, 8), (_48091, 8), (_48090, 8), (_48089, 8), (_48088, 8), (_48087, 8), (_48086, 8), (_48085, 8), (_48084, 8), (_48083, 8), (_48082, 8), (_48081, 8), (_48080, 8), (_48079, 8), (_48078, 8), (_48077, 8), (_48076, 8), (_48075, 8), (_48074, 8), (_48073, 8), (_48072, 8), (_48071, 8), (_48070, 8), (_48069, 8), (_48068, 8), (_48067, 8), (_48066, 8), (_48065, 8), (_48064, 8), (_48063, 8), (_48062, 8), (_48061, 8), (_48415, 8), (_48414, 8), (_48413, 8), (_48412, 8), (_48411, 8), (_48410, 8), (_48409, 8), (_48408, 8), (_48407, 8), (_48406, 8), (_48405, 8), (_48404, 8), (_48403, 8), (_48402, 8), (_48401, 8), (_48400, 8), (_48399, 8), (_48398, 8), (_48397, 8), (_48396, 8), (_48395, 8), (_48394, 8), (_48393, 8), (_48392, 8), (_48391, 8), (_48390, 8), (_48389, 8), (_48388, 8), (_48387, 8), (_48386, 8), (_48385, 8), (_48384, 8), (_48738, 8), (_48737, 8), (_48736, 8), (_48735, 8), (_48734, 8), (_48733, 8), (_48732, 8), (_48731, 8), (_48730, 8), (_48729, 8), (_48728, 8), (_48727, 8), (_48726, 8), (_48725, 8), (_48724, 8), (_48723, 8), (_48722, 8), (_48721, 8), (_48720, 8), (_48719, 8), (_48718, 8), (_48717, 8), (_48716, 8), (_48715, 8), (_48714, 8), (_48713, 8), (_48712, 8), (_48711, 8), (_48710, 8), (_48709, 8), (_48708, 8), (_48707, 8), (_49061, 8), (_49060, 8), (_49059, 8), (_49058, 8), (_49057, 8), (_49056, 8), (_49055, 8), (_49054, 8), (_49053, 8), (_49052, 8), (_49051, 8), (_49050, 8), (_49049, 8), (_49048, 8), (_49047, 8), (_49046, 8), (_49045, 8), (_49044, 8), (_49043, 8), (_49042, 8), (_49041, 8), (_49040, 8), (_49039, 8), (_49038, 8), (_49037, 8), (_49036, 8), (_49035, 8), (_49034, 8), (_49033, 8), (_49032, 8), (_49031, 8), (_49030, 8), (_49384, 8), (_49383, 8), (_49382, 8), (_49381, 8), (_49380, 8), (_49379, 8), (_49378, 8), (_49377, 8), (_49376, 8), (_49375, 8), (_49374, 8), (_49373, 8), (_49372, 8), (_49371, 8), (_49370, 8), (_49369, 8), (_49368, 8), (_49367, 8), (_49366, 8), (_49365, 8), (_49364, 8), (_49363, 8), (_49362, 8), (_49361, 8), (_49360, 8), (_49359, 8), (_49358, 8), (_49357, 8), (_49356, 8), (_49355, 8), (_49354, 8), (_49353, 8), (_49707, 8), (_49706, 8), (_49705, 8), (_49704, 8), (_49703, 8), (_49702, 8), (_49701, 8), (_49700, 8), (_49699, 8), (_49698, 8), (_49697, 8), (_49696, 8), (_49695, 8), (_49694, 8), (_49693, 8), (_49692, 8), (_49691, 8), (_49690, 8), (_49689, 8), (_49688, 8), (_49687, 8), (_49686, 8), (_49685, 8), (_49684, 8), (_49683, 8), (_49682, 8), (_49681, 8), (_49680, 8), (_49679, 8), (_49678, 8), (_49677, 8), (_49676, 8), (_50030, 8), (_50029, 8), (_50028, 8), (_50027, 8), (_50026, 8), (_50025, 8), (_50024, 8), (_50023, 8), (_50022, 8), (_50021, 8), (_50020, 8), (_50019, 8), (_50018, 8), (_50017, 8), (_50016, 8), (_50015, 8), (_50014, 8), (_50013, 8), (_50012, 8), (_50011, 8), (_50010, 8), (_50009, 8), (_50008, 8), (_50007, 8), (_50006, 8), (_50005, 8), (_50004, 8), (_50003, 8), (_50002, 8), (_50001, 8), (_50000, 8), (_49999, 8), (_50353, 8), (_50352, 8), (_50351, 8), (_50350, 8), (_50349, 8), (_50348, 8), (_50347, 8), (_50346, 8), (_50345, 8), (_50344, 8), (_50343, 8), (_50342, 8), (_50341, 8), (_50340, 8), (_50339, 8), (_50338, 8), (_50337, 8), (_50336, 8), (_50335, 8), (_50334, 8), (_50333, 8), (_50332, 8), (_50331, 8), (_50330, 8), (_50329, 8), (_50328, 8), (_50327, 8), (_50326, 8), (_50325, 8), (_50324, 8), (_50323, 8), (_50322, 8), (_50676, 8), (_50675, 8), (_50674, 8), (_50673, 8), (_50672, 8), (_50671, 8), (_50670, 8), (_50669, 8), (_50668, 8), (_50667, 8), (_50666, 8), (_50665, 8), (_50664, 8), (_50663, 8), (_50662, 8), (_50661, 8), (_50660, 8), (_50659, 8), (_50658, 8), (_50657, 8), (_50656, 8), (_50655, 8), (_50654, 8), (_50653, 8), (_50652, 8), (_50651, 8), (_50650, 8), (_50649, 8), (_50648, 8), (_50647, 8), (_50646, 8), (_50645, 8), (_50999, 8), (_50998, 8), (_50997, 8), (_50996, 8), (_50995, 8), (_50994, 8), (_50993, 8), (_50992, 8), (_50991, 8), (_50990, 8), (_50989, 8), (_50988, 8), (_50987, 8), (_50986, 8), (_50985, 8), (_50984, 8), (_50983, 8), (_50982, 8), (_50981, 8), (_50980, 8), (_50979, 8), (_50978, 8), (_50977, 8), (_50976, 8), (_50975, 8), (_50974, 8), (_50973, 8), (_50972, 8), (_50971, 8), (_50970, 8), (_50969, 8), (_50968, 8), (_51322, 8), (_51321, 8), (_51320, 8), (_51319, 8), (_51318, 8), (_51317, 8), (_51316, 8), (_51315, 8), (_51314, 8), (_51313, 8), (_51312, 8), (_51311, 8), (_51310, 8), (_51309, 8), (_51308, 8), (_51307, 8), (_51306, 8), (_51305, 8), (_51304, 8), (_51303, 8), (_51302, 8), (_51301, 8), (_51300, 8), (_51299, 8), (_51298, 8), (_51297, 8), (_51296, 8), (_51295, 8), (_51294, 8), (_51293, 8), (_51292, 8), (_51291, 8), (_51645, 8), (_51644, 8), (_51643, 8), (_51642, 8), (_51641, 8), (_51640, 8), (_51639, 8), (_51638, 8), (_51637, 8), (_51636, 8), (_51635, 8), (_51634, 8), (_51633, 8), (_51632, 8), (_51631, 8), (_51630, 8), (_51629, 8), (_51628, 8), (_51627, 8), (_51626, 8), (_51625, 8), (_51624, 8), (_51623, 8), (_51622, 8), (_51621, 8), (_51620, 8), (_51619, 8), (_51618, 8), (_51617, 8), (_51616, 8), (_51615, 8), (_51614, 8), (_51968, 8), (_51967, 8), (_51966, 8), (_51965, 8), (_51964, 8), (_51963, 8), (_51962, 8), (_51961, 8), (_51960, 8), (_51959, 8), (_51958, 8), (_51957, 8), (_51956, 8), (_51955, 8), (_51954, 8), (_51953, 8), (_51952, 8), (_51951, 8), (_51950, 8), (_51949, 8), (_51948, 8), (_51947, 8), (_51946, 8), (_51945, 8), (_51944, 8), (_51943, 8), (_51942, 8), (_51941, 8), (_51940, 8), (_51939, 8), (_51938, 8), (_51937, 8), (_52291, 8), (_52290, 8), (_52289, 8), (_52288, 8), (_52287, 8), (_52286, 8), (_52285, 8), (_52284, 8), (_52283, 8), (_52282, 8), (_52281, 8), (_52280, 8), (_52279, 8), (_52278, 8), (_52277, 8), (_52276, 8), (_52275, 8), (_52274, 8), (_52273, 8), (_52272, 8), (_52271, 8), (_52270, 8), (_52269, 8), (_52268, 8), (_52267, 8), (_52266, 8), (_52265, 8), (_52264, 8), (_52263, 8), (_52262, 8), (_52261, 8), (_52260, 8), (_52614, 8), (_52613, 8), (_52612, 8), (_52611, 8), (_52610, 8), (_52609, 8), (_52608, 8), (_52607, 8), (_52606, 8), (_52605, 8), (_52604, 8), (_52603, 8), (_52602, 8), (_52601, 8), (_52600, 8), (_52599, 8), (_52598, 8), (_52597, 8), (_52596, 8), (_52595, 8), (_52594, 8), (_52593, 8), (_52592, 8), (_52591, 8), (_52590, 8), (_52589, 8), (_52588, 8), (_52587, 8), (_52586, 8), (_52585, 8), (_52584, 8), (_52583, 8), (_52937, 8), (_52936, 8), (_52935, 8), (_52934, 8), (_52933, 8), (_52932, 8), (_52931, 8), (_52930, 8), (_52929, 8), (_52928, 8), (_52927, 8), (_52926, 8), (_52925, 8), (_52924, 8), (_52923, 8), (_52922, 8), (_52921, 8), (_52920, 8), (_52919, 8), (_52918, 8), (_52917, 8), (_52916, 8), (_52915, 8), (_52914, 8), (_52913, 8), (_52912, 8), (_52911, 8), (_52910, 8), (_52909, 8), (_52908, 8), (_52907, 8), (_52906, 8), (_53260, 8), (_53259, 8), (_53258, 8), (_53257, 8), (_53256, 8), (_53255, 8), (_53254, 8), (_53253, 8), (_53252, 8), (_53251, 8), (_53250, 8), (_53249, 8), (_53248, 8), (_53247, 8), (_53246, 8), (_53245, 8), (_53244, 8), (_53243, 8), (_53242, 8), (_53241, 8), (_53240, 8), (_53239, 8), (_53238, 8), (_53237, 8), (_53236, 8), (_53235, 8), (_53234, 8), (_53233, 8), (_53232, 8), (_53231, 8), (_53230, 8), (_53229, 8), (_53583, 8), (_53582, 8), (_53581, 8), (_53580, 8), (_53579, 8), (_53578, 8), (_53577, 8), (_53576, 8), (_53575, 8), (_53574, 8), (_53573, 8), (_53572, 8), (_53571, 8), (_53570, 8), (_53569, 8), (_53568, 8), (_53567, 8), (_53566, 8), (_53565, 8), (_53564, 8), (_53563, 8), (_53562, 8), (_53561, 8), (_53560, 8), (_53559, 8), (_53558, 8), (_53557, 8), (_53556, 8), (_53555, 8), (_53554, 8), (_53553, 8), (_53552, 8), (_53906, 8), (_53905, 8), (_53904, 8), (_53903, 8), (_53902, 8), (_53901, 8), (_53900, 8), (_53899, 8), (_53898, 8), (_53897, 8), (_53896, 8), (_53895, 8), (_53894, 8), (_53893, 8), (_53892, 8), (_53891, 8), (_53890, 8), (_53889, 8), (_53888, 8), (_53887, 8), (_53886, 8), (_53885, 8), (_53884, 8), (_53883, 8), (_53882, 8), (_53881, 8), (_53880, 8), (_53879, 8), (_53878, 8), (_53877, 8), (_53876, 8), (_53875, 8), (_54229, 8), (_54228, 8), (_54227, 8), (_54226, 8), (_54225, 8), (_54224, 8), (_54223, 8), (_54222, 8), (_54221, 8), (_54220, 8), (_54219, 8), (_54218, 8), (_54217, 8), (_54216, 8), (_54215, 8), (_54214, 8), (_54213, 8), (_54212, 8), (_54211, 8), (_54210, 8), (_54209, 8), (_54208, 8), (_54207, 8), (_54206, 8), (_54205, 8), (_54204, 8), (_54203, 8), (_54202, 8), (_54201, 8), (_54200, 8), (_54199, 8), (_54198, 8), (_54552, 8), (_54551, 8), (_54550, 8), (_54549, 8), (_54548, 8), (_54547, 8), (_54546, 8), (_54545, 8), (_54544, 8), (_54543, 8), (_54542, 8), (_54541, 8), (_54540, 8), (_54539, 8), (_54538, 8), (_54537, 8), (_54536, 8), (_54535, 8), (_54534, 8), (_54533, 8), (_54532, 8), (_54531, 8), (_54530, 8), (_54529, 8), (_54528, 8), (_54527, 8), (_54526, 8), (_54525, 8), (_54524, 8), (_54523, 8), (_54522, 8), (_54521, 8), (_54875, 8), (_54874, 8), (_54873, 8), (_54872, 8), (_54871, 8), (_54870, 8), (_54869, 8), (_54868, 8), (_54867, 8), (_54866, 8), (_54865, 8), (_54864, 8), (_54863, 8), (_54862, 8), (_54861, 8), (_54860, 8), (_54859, 8), (_54858, 8), (_54857, 8), (_54856, 8), (_54855, 8), (_54854, 8), (_54853, 8), (_54852, 8), (_54851, 8), (_54850, 8), (_54849, 8), (_54848, 8), (_54847, 8), (_54846, 8), (_54845, 8), (_54844, 8), (_55198, 8), (_55197, 8), (_55196, 8), (_55195, 8), (_55194, 8), (_55193, 8), (_55192, 8), (_55191, 8), (_55190, 8), (_55189, 8), (_55188, 8), (_55187, 8), (_55186, 8), (_55185, 8), (_55184, 8), (_55183, 8), (_55182, 8), (_55181, 8), (_55180, 8), (_55179, 8), (_55178, 8), (_55177, 8), (_55176, 8), (_55175, 8), (_55174, 8), (_55173, 8), (_55172, 8), (_55171, 8), (_55170, 8), (_55169, 8), (_55168, 8), (_55167, 8), (_55521, 8), (_55520, 8), (_55519, 8), (_55518, 8), (_55517, 8), (_55516, 8), (_55515, 8), (_55514, 8), (_55513, 8), (_55512, 8), (_55511, 8), (_55510, 8), (_55509, 8), (_55508, 8), (_55507, 8), (_55506, 8), (_55505, 8), (_55504, 8), (_55503, 8), (_55502, 8), (_55501, 8), (_55500, 8), (_55499, 8), (_55498, 8), (_55497, 8), (_55496, 8), (_55495, 8), (_55494, 8), (_55493, 8), (_55492, 8), (_55491, 8), (_55490, 8), (_55844, 8), (_55843, 8), (_55842, 8), (_55841, 8), (_55840, 8), (_55839, 8), (_55838, 8), (_55837, 8), (_55836, 8), (_55835, 8), (_55834, 8), (_55833, 8), (_55832, 8), (_55831, 8), (_55830, 8), (_55829, 8), (_55828, 8), (_55827, 8), (_55826, 8), (_55825, 8), (_55824, 8), (_55823, 8), (_55822, 8), (_55821, 8), (_55820, 8), (_55819, 8), (_55818, 8), (_55817, 8), (_55816, 8), (_55815, 8), (_55814, 8), (_55813, 8), (_56167, 8), (_56166, 8), (_56165, 8), (_56164, 8), (_56163, 8), (_56162, 8), (_56161, 8), (_56160, 8), (_56159, 8), (_56158, 8), (_56157, 8), (_56156, 8), (_56155, 8), (_56154, 8), (_56153, 8), (_56152, 8), (_56151, 8), (_56150, 8), (_56149, 8), (_56148, 8), (_56147, 8), (_56146, 8), (_56145, 8), (_56144, 8), (_56143, 8), (_56142, 8), (_56141, 8), (_56140, 8), (_56139, 8), (_56138, 8), (_56137, 8), (_56136, 8), (_56490, 8), (_56489, 8), (_56488, 8), (_56487, 8), (_56486, 8), (_56485, 8), (_56484, 8), (_56483, 8), (_56482, 8), (_56481, 8), (_56480, 8), (_56479, 8), (_56478, 8), (_56477, 8), (_56476, 8), (_56475, 8), (_56474, 8), (_56473, 8), (_56472, 8), (_56471, 8), (_56470, 8), (_56469, 8), (_56468, 8), (_56467, 8), (_56466, 8), (_56465, 8), (_56464, 8), (_56463, 8), (_56462, 8), (_56461, 8), (_56460, 8), (_56459, 8), (_56813, 8), (_56812, 8), (_56811, 8), (_56810, 8), (_56809, 8), (_56808, 8), (_56807, 8), (_56806, 8), (_56805, 8), (_56804, 8), (_56803, 8), (_56802, 8), (_56801, 8), (_56800, 8), (_56799, 8), (_56798, 8), (_56797, 8), (_56796, 8), (_56795, 8), (_56794, 8), (_56793, 8), (_56792, 8), (_56791, 8), (_56790, 8), (_56789, 8), (_56788, 8), (_56787, 8), (_56786, 8), (_56785, 8), (_56784, 8), (_56783, 8), (_56782, 8), (_57136, 8), (_57135, 8), (_57134, 8), (_57133, 8), (_57132, 8), (_57131, 8), (_57130, 8), (_57129, 8), (_57128, 8), (_57127, 8), (_57126, 8), (_57125, 8), (_57124, 8), (_57123, 8), (_57122, 8), (_57121, 8), (_57120, 8), (_57119, 8), (_57118, 8), (_57117, 8), (_57116, 8), (_57115, 8), (_57114, 8), (_57113, 8), (_57112, 8), (_57111, 8), (_57110, 8), (_57109, 8), (_57108, 8), (_57107, 8), (_57106, 8), (_57105, 8), (_57459, 8), (_57458, 8), (_57457, 8), (_57456, 8), (_57455, 8), (_57454, 8), (_57453, 8), (_57452, 8), (_57451, 8), (_57450, 8), (_57449, 8), (_57448, 8), (_57447, 8), (_57446, 8), (_57445, 8), (_57444, 8), (_57443, 8), (_57442, 8), (_57441, 8), (_57440, 8), (_57439, 8), (_57438, 8), (_57437, 8), (_57436, 8), (_57435, 8), (_57434, 8), (_57433, 8), (_57432, 8), (_57431, 8), (_57430, 8), (_57429, 8), (_57428, 8), (_57782, 8), (_57781, 8), (_57780, 8), (_57779, 8), (_57778, 8), (_57777, 8), (_57776, 8), (_57775, 8), (_57774, 8), (_57773, 8), (_57772, 8), (_57771, 8), (_57770, 8), (_57769, 8), (_57768, 8), (_57767, 8), (_57766, 8), (_57765, 8), (_57764, 8), (_57763, 8), (_57762, 8), (_57761, 8), (_57760, 8), (_57759, 8), (_57758, 8), (_57757, 8), (_57756, 8), (_57755, 8), (_57754, 8), (_57753, 8), (_57752, 8), (_57751, 8), (_58105, 8), (_58104, 8), (_58103, 8), (_58102, 8), (_58101, 8), (_58100, 8), (_58099, 8), (_58098, 8), (_58097, 8), (_58096, 8), (_58095, 8), (_58094, 8), (_58093, 8), (_58092, 8), (_58091, 8), (_58090, 8), (_58089, 8), (_58088, 8), (_58087, 8), (_58086, 8), (_58085, 8), (_58084, 8), (_58083, 8), (_58082, 8), (_58081, 8), (_58080, 8), (_58079, 8), (_58078, 8), (_58077, 8), (_58076, 8), (_58075, 8), (_58074, 8), (_58428, 8), (_58427, 8), (_58426, 8), (_58425, 8), (_58424, 8), (_58423, 8), (_58422, 8), (_58421, 8), (_58420, 8), (_58419, 8), (_58418, 8), (_58417, 8), (_58416, 8), (_58415, 8), (_58414, 8), (_58413, 8), (_58412, 8), (_58411, 8), (_58410, 8), (_58409, 8), (_58408, 8), (_58407, 8), (_58406, 8), (_58405, 8), (_58404, 8), (_58403, 8), (_58402, 8), (_58401, 8), (_58400, 8), (_58399, 8), (_58398, 8), (_58397, 8), (_58751, 8), (_58750, 8), (_58749, 8), (_58748, 8), (_58747, 8), (_58746, 8), (_58745, 8), (_58744, 8), (_58743, 8), (_58742, 8), (_58741, 8), (_58740, 8), (_58739, 8), (_58738, 8), (_58737, 8), (_58736, 8), (_58735, 8), (_58734, 8), (_58733, 8), (_58732, 8), (_58731, 8), (_58730, 8), (_58729, 8), (_58728, 8), (_58727, 8), (_58726, 8), (_58725, 8), (_58724, 8), (_58723, 8), (_58722, 8), (_58721, 8), (_58720, 8), (_59074, 8), (_59073, 8), (_59072, 8), (_59071, 8), (_59070, 8), (_59069, 8), (_59068, 8), (_59067, 8), (_59066, 8), (_59065, 8), (_59064, 8), (_59063, 8), (_59062, 8), (_59061, 8), (_59060, 8), (_59059, 8), (_59058, 8), (_59057, 8), (_59056, 8), (_59055, 8), (_59054, 8), (_59053, 8), (_59052, 8), (_59051, 8), (_59050, 8), (_59049, 8), (_59048, 8), (_59047, 8), (_59046, 8), (_59045, 8), (_59044, 8), (_59043, 8), (_59397, 8), (_59396, 8), (_59395, 8), (_59394, 8), (_59393, 8), (_59392, 8), (_59391, 8), (_59390, 8), (_59389, 8), (_59388, 8), (_59387, 8), (_59386, 8), (_59385, 8), (_59384, 8), (_59383, 8), (_59382, 8), (_59381, 8), (_59380, 8), (_59379, 8), (_59378, 8), (_59377, 8), (_59376, 8), (_59375, 8), (_59374, 8), (_59373, 8), (_59372, 8), (_59371, 8), (_59370, 8), (_59369, 8), (_59368, 8), (_59367, 8), (_59366, 8), (_59720, 8), (_59719, 8), (_59718, 8), (_59717, 8), (_59716, 8), (_59715, 8), (_59714, 8), (_59713, 8), (_59712, 8), (_59711, 8), (_59710, 8), (_59709, 8), (_59708, 8), (_59707, 8), (_59706, 8), (_59705, 8), (_59704, 8), (_59703, 8), (_59702, 8), (_59701, 8), (_59700, 8), (_59699, 8), (_59698, 8), (_59697, 8), (_59696, 8), (_59695, 8), (_59694, 8), (_59693, 8), (_59692, 8), (_59691, 8), (_59690, 8), (_59689, 8), (_60043, 8), (_60042, 8), (_60041, 8), (_60040, 8), (_60039, 8), (_60038, 8), (_60037, 8), (_60036, 8), (_60035, 8), (_60034, 8), (_60033, 8), (_60032, 8), (_60031, 8), (_60030, 8), (_60029, 8), (_60028, 8), (_60027, 8), (_60026, 8), (_60025, 8), (_60024, 8), (_60023, 8), (_60022, 8), (_60021, 8), (_60020, 8), (_60019, 8), (_60018, 8), (_60017, 8), (_60016, 8), (_60015, 8), (_60014, 8), (_60013, 8), (_60012, 8), (_60366, 8), (_60365, 8), (_60364, 8), (_60363, 8), (_60362, 8), (_60361, 8), (_60360, 8), (_60359, 8), (_60358, 8), (_60357, 8), (_60356, 8), (_60355, 8), (_60354, 8), (_60353, 8), (_60352, 8), (_60351, 8), (_60350, 8), (_60349, 8), (_60348, 8), (_60347, 8), (_60346, 8), (_60345, 8), (_60344, 8), (_60343, 8), (_60342, 8), (_60341, 8), (_60340, 8), (_60339, 8), (_60338, 8), (_60337, 8), (_60336, 8), (_60335, 8), (_60689, 8), (_60688, 8), (_60687, 8), (_60686, 8), (_60685, 8), (_60684, 8), (_60683, 8), (_60682, 8), (_60681, 8), (_60680, 8), (_60679, 8), (_60678, 8), (_60677, 8), (_60676, 8), (_60675, 8), (_60674, 8), (_60673, 8), (_60672, 8), (_60671, 8), (_60670, 8), (_60669, 8), (_60668, 8), (_60667, 8), (_60666, 8), (_60665, 8), (_60664, 8), (_60663, 8), (_60662, 8), (_60661, 8), (_60660, 8), (_60659, 8), (_60658, 8), (_61012, 8), (_61011, 8), (_61010, 8), (_61009, 8), (_61008, 8), (_61007, 8), (_61006, 8), (_61005, 8), (_61004, 8), (_61003, 8), (_61002, 8), (_61001, 8), (_61000, 8), (_60999, 8), (_60998, 8), (_60997, 8), (_60996, 8), (_60995, 8), (_60994, 8), (_60993, 8), (_60992, 8), (_60991, 8), (_60990, 8), (_60989, 8), (_60988, 8), (_60987, 8), (_60986, 8), (_60985, 8), (_60984, 8), (_60983, 8), (_60982, 8), (_60981, 8), (_61335, 8), (_61334, 8), (_61333, 8), (_61332, 8), (_61331, 8), (_61330, 8), (_61329, 8), (_61328, 8), (_61327, 8), (_61326, 8), (_61325, 8), (_61324, 8), (_61323, 8), (_61322, 8), (_61321, 8), (_61320, 8), (_61319, 8), (_61318, 8), (_61317, 8), (_61316, 8), (_61315, 8), (_61314, 8), (_61313, 8), (_61312, 8), (_61311, 8), (_61310, 8), (_61309, 8), (_61308, 8), (_61307, 8), (_61306, 8), (_61305, 8), (_61304, 8), (_61658, 8), (_61657, 8), (_61656, 8), (_61655, 8), (_61654, 8), (_61653, 8), (_61652, 8), (_61651, 8), (_61650, 8), (_61649, 8), (_61648, 8), (_61647, 8), (_61646, 8), (_61645, 8), (_61644, 8), (_61643, 8), (_61642, 8), (_61641, 8), (_61640, 8), (_61639, 8), (_61638, 8), (_61637, 8), (_61636, 8), (_61635, 8), (_61634, 8), (_61633, 8), (_61632, 8), (_61631, 8), (_61630, 8), (_61629, 8), (_61628, 8), (_61627, 8), (_61981, 8), (_61980, 8), (_61979, 8), (_61978, 8), (_61977, 8), (_61976, 8), (_61975, 8), (_61974, 8), (_61973, 8), (_61972, 8), (_61971, 8), (_61970, 8), (_61969, 8), (_61968, 8), (_61967, 8), (_61966, 8), (_61965, 8), (_61964, 8), (_61963, 8), (_61962, 8), (_61961, 8), (_61960, 8), (_61959, 8), (_61958, 8), (_61957, 8), (_61956, 8), (_61955, 8), (_61954, 8), (_61953, 8), (_61952, 8), (_61951, 8), (_61950, 8), (_62304, 8), (_62303, 8), (_62302, 8), (_62301, 8), (_62300, 8), (_62299, 8), (_62298, 8), (_62297, 8), (_62296, 8), (_62295, 8), (_62294, 8), (_62293, 8), (_62292, 8), (_62291, 8), (_62290, 8), (_62289, 8), (_62288, 8), (_62287, 8), (_62286, 8), (_62285, 8), (_62284, 8), (_62283, 8), (_62282, 8), (_62281, 8), (_62280, 8), (_62279, 8), (_62278, 8), (_62277, 8), (_62276, 8), (_62275, 8), (_62274, 8), (_62273, 8), (_62627, 8), (_62626, 8), (_62625, 8), (_62624, 8), (_62623, 8), (_62622, 8), (_62621, 8), (_62620, 8), (_62619, 8), (_62618, 8), (_62617, 8), (_62616, 8), (_62615, 8), (_62614, 8), (_62613, 8), (_62612, 8), (_62611, 8), (_62610, 8), (_62609, 8), (_62608, 8), (_62607, 8), (_62606, 8), (_62605, 8), (_62604, 8), (_62603, 8), (_62602, 8), (_62601, 8), (_62600, 8), (_62599, 8), (_62598, 8), (_62597, 8), (_62596, 8), (_62950, 8), (_62949, 8), (_62948, 8), (_62947, 8), (_62946, 8), (_62945, 8), (_62944, 8), (_62943, 8), (_62942, 8), (_62941, 8), (_62940, 8), (_62939, 8), (_62938, 8), (_62937, 8), (_62936, 8), (_62935, 8), (_62934, 8), (_62933, 8), (_62932, 8), (_62931, 8), (_62930, 8), (_62929, 8), (_62928, 8), (_62927, 8), (_62926, 8), (_62925, 8), (_62924, 8), (_62923, 8), (_62922, 8), (_62921, 8), (_62920, 8), (_62919, 8), (_63273, 8), (_63272, 8), (_63271, 8), (_63270, 8), (_63269, 8), (_63268, 8), (_63267, 8), (_63266, 8), (_63265, 8), (_63264, 8), (_63263, 8), (_63262, 8), (_63261, 8), (_63260, 8), (_63259, 8), (_63258, 8), (_63257, 8), (_63256, 8), (_63255, 8), (_63254, 8), (_63253, 8), (_63252, 8), (_63251, 8), (_63250, 8), (_63249, 8), (_63248, 8), (_63247, 8), (_63246, 8), (_63245, 8), (_63244, 8), (_63243, 8), (_63242, 8), (_63596, 8), (_63595, 8), (_63594, 8), (_63593, 8), (_63592, 8), (_63591, 8), (_63590, 8), (_63589, 8), (_63588, 8), (_63587, 8), (_63586, 8), (_63585, 8), (_63584, 8), (_63583, 8), (_63582, 8), (_63581, 8), (_63580, 8), (_63579, 8), (_63578, 8), (_63577, 8), (_63576, 8), (_63575, 8), (_63574, 8), (_63573, 8), (_63572, 8), (_63571, 8), (_63570, 8), (_63569, 8), (_63568, 8), (_63567, 8), (_63566, 8), (_63565, 8), (_63919, 8), (_63918, 8), (_63917, 8), (_63916, 8), (_63915, 8), (_63914, 8), (_63913, 8), (_63912, 8), (_63911, 8), (_63910, 8), (_63909, 8), (_63908, 8), (_63907, 8), (_63906, 8), (_63905, 8), (_63904, 8), (_63903, 8), (_63902, 8), (_63901, 8), (_63900, 8), (_63899, 8), (_63898, 8), (_63897, 8), (_63896, 8), (_63895, 8), (_63894, 8), (_63893, 8), (_63892, 8), (_63891, 8), (_63890, 8), (_63889, 8), (_63888, 8), (_64242, 8), (_64241, 8), (_64240, 8), (_64239, 8), (_64238, 8), (_64237, 8), (_64236, 8), (_64235, 8), (_64234, 8), (_64233, 8), (_64232, 8), (_64231, 8), (_64230, 8), (_64229, 8), (_64228, 8), (_64227, 8), (_64226, 8), (_64225, 8), (_64224, 8), (_64223, 8), (_64222, 8), (_64221, 8), (_64220, 8), (_64219, 8), (_64218, 8), (_64217, 8), (_64216, 8), (_64215, 8), (_64214, 8), (_64213, 8), (_64212, 8), (_64211, 8), (_64565, 8), (_64564, 8), (_64563, 8), (_64562, 8), (_64561, 8), (_64560, 8), (_64559, 8), (_64558, 8), (_64557, 8), (_64556, 8), (_64555, 8), (_64554, 8), (_64553, 8), (_64552, 8), (_64551, 8), (_64550, 8), (_64549, 8), (_64548, 8), (_64547, 8), (_64546, 8), (_64545, 8), (_64544, 8), (_64543, 8), (_64542, 8), (_64541, 8), (_64540, 8), (_64539, 8), (_64538, 8), (_64537, 8), (_64536, 8), (_64535, 8), (_64534, 8), (_64888, 8), (_64887, 8), (_64886, 8), (_64885, 8), (_64884, 8), (_64883, 8), (_64882, 8), (_64881, 8), (_64880, 8), (_64879, 8), (_64878, 8), (_64877, 8), (_64876, 8), (_64875, 8), (_64874, 8), (_64873, 8), (_64872, 8), (_64871, 8), (_64870, 8), (_64869, 8), (_64868, 8), (_64867, 8), (_64866, 8), (_64865, 8), (_64864, 8), (_64863, 8), (_64862, 8), (_64861, 8), (_64860, 8), (_64859, 8), (_64858, 8), (_64857, 8), (_65211, 8), (_65210, 8), (_65209, 8), (_65208, 8), (_65207, 8), (_65206, 8), (_65205, 8), (_65204, 8), (_65203, 8), (_65202, 8), (_65201, 8), (_65200, 8), (_65199, 8), (_65198, 8), (_65197, 8), (_65196, 8), (_65195, 8), (_65194, 8), (_65193, 8), (_65192, 8), (_65191, 8), (_65190, 8), (_65189, 8), (_65188, 8), (_65187, 8), (_65186, 8), (_65185, 8), (_65184, 8), (_65183, 8), (_65182, 8), (_65181, 8), (_65180, 8), (_65534, 8), (_65533, 8), (_65532, 8), (_65531, 8), (_65530, 8), (_65529, 8), (_65528, 8), (_65527, 8), (_65526, 8), (_65525, 8), (_65524, 8), (_65523, 8), (_65522, 8), (_65521, 8), (_65520, 8), (_65519, 8), (_65518, 8), (_65517, 8), (_65516, 8), (_65515, 8), (_65514, 8), (_65513, 8), (_65512, 8), (_65511, 8), (_65510, 8), (_65509, 8), (_65508, 8), (_65507, 8), (_65506, 8), (_65505, 8), (_65504, 8), (_65503, 8), (_65857, 8), (_65856, 8), (_65855, 8), (_65854, 8), (_65853, 8), (_65852, 8), (_65851, 8), (_65850, 8), (_65849, 8), (_65848, 8), (_65847, 8), (_65846, 8), (_65845, 8), (_65844, 8), (_65843, 8), (_65842, 8), (_65841, 8), (_65840, 8), (_65839, 8), (_65838, 8), (_65837, 8), (_65836, 8), (_65835, 8), (_65834, 8), (_65833, 8), (_65832, 8), (_65831, 8), (_65830, 8), (_65829, 8), (_65828, 8), (_65827, 8), (_65826, 8), (_66180, 8), (_66179, 8), (_66178, 8), (_66177, 8), (_66176, 8), (_66175, 8), (_66174, 8), (_66173, 8), (_66172, 8), (_66171, 8), (_66170, 8), (_66169, 8), (_66168, 8), (_66167, 8), (_66166, 8), (_66165, 8), (_66164, 8), (_66163, 8), (_66162, 8), (_66161, 8), (_66160, 8), (_66159, 8), (_66158, 8), (_66157, 8), (_66156, 8), (_66155, 8), (_66154, 8), (_66153, 8), (_66152, 8), (_66151, 8), (_66150, 8), (_66149, 8), (_66503, 8), (_66502, 8), (_66501, 8), (_66500, 8), (_66499, 8), (_66498, 8), (_66497, 8), (_66496, 8), (_66495, 8), (_66494, 8), (_66493, 8), (_66492, 8), (_66491, 8), (_66490, 8), (_66489, 8), (_66488, 8), (_66487, 8), (_66486, 8), (_66485, 8), (_66484, 8), (_66483, 8), (_66482, 8), (_66481, 8), (_66480, 8), (_66479, 8), (_66478, 8), (_66477, 8), (_66476, 8), (_66475, 8), (_66474, 8), (_66473, 8), (_66472, 8), (_66826, 8), (_66825, 8), (_66824, 8), (_66823, 8), (_66822, 8), (_66821, 8), (_66820, 8), (_66819, 8), (_66818, 8), (_66817, 8), (_66816, 8), (_66815, 8), (_66814, 8), (_66813, 8), (_66812, 8), (_66811, 8), (_66810, 8), (_66809, 8), (_66808, 8), (_66807, 8), (_66806, 8), (_66805, 8), (_66804, 8), (_66803, 8), (_66802, 8), (_66801, 8), (_66800, 8), (_66799, 8), (_66798, 8), (_66797, 8), (_66796, 8), (_66795, 8), (_67149, 8), (_67148, 8), (_67147, 8), (_67146, 8), (_67145, 8), (_67144, 8), (_67143, 8), (_67142, 8), (_67141, 8), (_67140, 8), (_67139, 8), (_67138, 8), (_67137, 8), (_67136, 8), (_67135, 8), (_67134, 8), (_67133, 8), (_67132, 8), (_67131, 8), (_67130, 8), (_67129, 8), (_67128, 8), (_67127, 8), (_67126, 8), (_67125, 8), (_67124, 8), (_67123, 8), (_67122, 8), (_67121, 8), (_67120, 8), (_67119, 8), (_67118, 8), (_67472, 8), (_67471, 8), (_67470, 8), (_67469, 8), (_67468, 8), (_67467, 8), (_67466, 8), (_67465, 8), (_67464, 8), (_67463, 8), (_67462, 8), (_67461, 8), (_67460, 8), (_67459, 8), (_67458, 8), (_67457, 8), (_67456, 8), (_67455, 8), (_67454, 8), (_67453, 8), (_67452, 8), (_67451, 8), (_67450, 8), (_67449, 8), (_67448, 8), (_67447, 8), (_67446, 8), (_67445, 8), (_67444, 8), (_67443, 8), (_67442, 8), (_67441, 8), (_67795, 8), (_67794, 8), (_67793, 8), (_67792, 8), (_67791, 8), (_67790, 8), (_67789, 8), (_67788, 8), (_67787, 8), (_67786, 8), (_67785, 8), (_67784, 8), (_67783, 8), (_67782, 8), (_67781, 8), (_67780, 8), (_67779, 8), (_67778, 8), (_67777, 8), (_67776, 8), (_67775, 8), (_67774, 8), (_67773, 8), (_67772, 8), (_67771, 8), (_67770, 8), (_67769, 8), (_67768, 8), (_67767, 8), (_67766, 8), (_67765, 8), (_67764, 8), (_68118, 8), (_68117, 8), (_68116, 8), (_68115, 8), (_68114, 8), (_68113, 8), (_68112, 8), (_68111, 8), (_68110, 8), (_68109, 8), (_68108, 8), (_68107, 8), (_68106, 8), (_68105, 8), (_68104, 8), (_68103, 8), (_68102, 8), (_68101, 8), (_68100, 8), (_68099, 8), (_68098, 8), (_68097, 8), (_68096, 8), (_68095, 8), (_68094, 8), (_68093, 8), (_68092, 8), (_68091, 8), (_68090, 8), (_68089, 8), (_68088, 8), (_68087, 8), (_68441, 8), (_68440, 8), (_68439, 8), (_68438, 8), (_68437, 8), (_68436, 8), (_68435, 8), (_68434, 8), (_68433, 8), (_68432, 8), (_68431, 8), (_68430, 8), (_68429, 8), (_68428, 8), (_68427, 8), (_68426, 8), (_68425, 8), (_68424, 8), (_68423, 8), (_68422, 8), (_68421, 8), (_68420, 8), (_68419, 8), (_68418, 8), (_68417, 8), (_68416, 8), (_68415, 8), (_68414, 8), (_68413, 8), (_68412, 8), (_68411, 8), (_68410, 8), (_68764, 8), (_68763, 8), (_68762, 8), (_68761, 8), (_68760, 8), (_68759, 8), (_68758, 8), (_68757, 8), (_68756, 8), (_68755, 8), (_68754, 8), (_68753, 8), (_68752, 8), (_68751, 8), (_68750, 8), (_68749, 8), (_68748, 8), (_68747, 8), (_68746, 8), (_68745, 8), (_68744, 8), (_68743, 8), (_68742, 8), (_68741, 8), (_68740, 8), (_68739, 8), (_68738, 8), (_68737, 8), (_68736, 8), (_68735, 8), (_68734, 8), (_68733, 8), (_69087, 8), (_69086, 8), (_69085, 8), (_69084, 8), (_69083, 8), (_69082, 8), (_69081, 8), (_69080, 8), (_69079, 8), (_69078, 8), (_69077, 8), (_69076, 8), (_69075, 8), (_69074, 8), (_69073, 8), (_69072, 8), (_69071, 8), (_69070, 8), (_69069, 8), (_69068, 8), (_69067, 8), (_69066, 8), (_69065, 8), (_69064, 8), (_69063, 8), (_69062, 8), (_69061, 8), (_69060, 8), (_69059, 8), (_69058, 8), (_69057, 8), (_69056, 8), (_69410, 8), (_69409, 8), (_69408, 8), (_69407, 8), (_69406, 8), (_69405, 8), (_69404, 8), (_69403, 8), (_69402, 8), (_69401, 8), (_69400, 8), (_69399, 8), (_69398, 8), (_69397, 8), (_69396, 8), (_69395, 8), (_69394, 8), (_69393, 8), (_69392, 8), (_69391, 8), (_69390, 8), (_69389, 8), (_69388, 8), (_69387, 8), (_69386, 8), (_69385, 8), (_69384, 8), (_69383, 8), (_69382, 8), (_69381, 8), (_69380, 8), (_69379, 8), (_69733, 8), (_69732, 8), (_69731, 8), (_69730, 8), (_69729, 8), (_69728, 8), (_69727, 8), (_69726, 8), (_69725, 8), (_69724, 8), (_69723, 8), (_69722, 8), (_69721, 8), (_69720, 8), (_69719, 8), (_69718, 8), (_69717, 8), (_69716, 8), (_69715, 8), (_69714, 8), (_69713, 8), (_69712, 8), (_69711, 8), (_69710, 8), (_69709, 8), (_69708, 8), (_69707, 8), (_69706, 8), (_69705, 8), (_69704, 8), (_69703, 8), (_69702, 8), (_70056, 8), (_70055, 8), (_70054, 8), (_70053, 8), (_70052, 8), (_70051, 8), (_70050, 8), (_70049, 8), (_70048, 8), (_70047, 8), (_70046, 8), (_70045, 8), (_70044, 8), (_70043, 8), (_70042, 8), (_70041, 8), (_70040, 8), (_70039, 8), (_70038, 8), (_70037, 8), (_70036, 8), (_70035, 8), (_70034, 8), (_70033, 8), (_70032, 8), (_70031, 8), (_70030, 8), (_70029, 8), (_70028, 8), (_70027, 8), (_70026, 8), (_70025, 8), (_70379, 8), (_70378, 8), (_70377, 8), (_70376, 8), (_70375, 8), (_70374, 8), (_70373, 8), (_70372, 8), (_70371, 8), (_70370, 8), (_70369, 8), (_70368, 8), (_70367, 8), (_70366, 8), (_70365, 8), (_70364, 8), (_70363, 8), (_70362, 8), (_70361, 8), (_70360, 8), (_70359, 8), (_70358, 8), (_70357, 8), (_70356, 8), (_70355, 8), (_70354, 8), (_70353, 8), (_70352, 8), (_70351, 8), (_70350, 8), (_70349, 8), (_70348, 8), (_70702, 8), (_70701, 8), (_70700, 8), (_70699, 8), (_70698, 8), (_70697, 8), (_70696, 8), (_70695, 8), (_70694, 8), (_70693, 8), (_70692, 8), (_70691, 8), (_70690, 8), (_70689, 8), (_70688, 8), (_70687, 8), (_70686, 8), (_70685, 8), (_70684, 8), (_70683, 8), (_70682, 8), (_70681, 8), (_70680, 8), (_70679, 8), (_70678, 8), (_70677, 8), (_70676, 8), (_70675, 8), (_70674, 8), (_70673, 8), (_70672, 8), (_70671, 8), (_71025, 8), (_71024, 8), (_71023, 8), (_71022, 8), (_71021, 8), (_71020, 8), (_71019, 8), (_71018, 8), (_71017, 8), (_71016, 8), (_71015, 8), (_71014, 8), (_71013, 8), (_71012, 8), (_71011, 8), (_71010, 8), (_71009, 8), (_71008, 8), (_71007, 8), (_71006, 8), (_71005, 8), (_71004, 8), (_71003, 8), (_71002, 8), (_71001, 8), (_71000, 8), (_70999, 8), (_70998, 8), (_70997, 8), (_70996, 8), (_70995, 8), (_70994, 8), (_71348, 8), (_71347, 8), (_71346, 8), (_71345, 8), (_71344, 8), (_71343, 8), (_71342, 8), (_71341, 8), (_71340, 8), (_71339, 8), (_71338, 8), (_71337, 8), (_71336, 8), (_71335, 8), (_71334, 8), (_71333, 8), (_71332, 8), (_71331, 8), (_71330, 8), (_71329, 8), (_71328, 8), (_71327, 8), (_71326, 8), (_71325, 8), (_71324, 8), (_71323, 8), (_71322, 8), (_71321, 8), (_71320, 8), (_71319, 8), (_71318, 8), (_71317, 8), (_71671, 8), (_71670, 8), (_71669, 8), (_71668, 8), (_71667, 8), (_71666, 8), (_71665, 8), (_71664, 8), (_71663, 8), (_71662, 8), (_71661, 8), (_71660, 8), (_71659, 8), (_71658, 8), (_71657, 8), (_71656, 8), (_71655, 8), (_71654, 8), (_71653, 8), (_71652, 8), (_71651, 8), (_71650, 8), (_71649, 8), (_71648, 8), (_71647, 8), (_71646, 8), (_71645, 8), (_71644, 8), (_71643, 8), (_71642, 8), (_71641, 8), (_71640, 8), (_71994, 8), (_71993, 8), (_71992, 8), (_71991, 8), (_71990, 8), (_71989, 8), (_71988, 8), (_71987, 8), (_71986, 8), (_71985, 8), (_71984, 8), (_71983, 8), (_71982, 8), (_71981, 8), (_71980, 8), (_71979, 8), (_71978, 8), (_71977, 8), (_71976, 8), (_71975, 8), (_71974, 8), (_71973, 8), (_71972, 8), (_71971, 8), (_71970, 8), (_71969, 8), (_71968, 8), (_71967, 8), (_71966, 8), (_71965, 8), (_71964, 8), (_71963, 8), (_72317, 8), (_72316, 8), (_72315, 8), (_72314, 8), (_72313, 8), (_72312, 8), (_72311, 8), (_72310, 8), (_72309, 8), (_72308, 8), (_72307, 8), (_72306, 8), (_72305, 8), (_72304, 8), (_72303, 8), (_72302, 8), (_72301, 8), (_72300, 8), (_72299, 8), (_72298, 8), (_72297, 8), (_72296, 8), (_72295, 8), (_72294, 8), (_72293, 8), (_72292, 8), (_72291, 8), (_72290, 8), (_72289, 8), (_72288, 8), (_72287, 8), (_72286, 8), (_72640, 8), (_72639, 8), (_72638, 8), (_72637, 8), (_72636, 8), (_72635, 8), (_72634, 8), (_72633, 8), (_72632, 8), (_72631, 8), (_72630, 8), (_72629, 8), (_72628, 8), (_72627, 8), (_72626, 8), (_72625, 8), (_72624, 8), (_72623, 8), (_72622, 8), (_72621, 8), (_72620, 8), (_72619, 8), (_72618, 8), (_72617, 8), (_72616, 8), (_72615, 8), (_72614, 8), (_72613, 8), (_72612, 8), (_72611, 8), (_72610, 8), (_72609, 8), (_72963, 8), (_72962, 8), (_72961, 8), (_72960, 8), (_72959, 8), (_72958, 8), (_72957, 8), (_72956, 8), (_72955, 8), (_72954, 8), (_72953, 8), (_72952, 8), (_72951, 8), (_72950, 8), (_72949, 8), (_72948, 8), (_72947, 8), (_72946, 8), (_72945, 8), (_72944, 8), (_72943, 8), (_72942, 8), (_72941, 8), (_72940, 8), (_72939, 8), (_72938, 8), (_72937, 8), (_72936, 8), (_72935, 8), (_72934, 8), (_72933, 8), (_72932, 8), (_73286, 8), (_73285, 8), (_73284, 8), (_73283, 8), (_73282, 8), (_73281, 8), (_73280, 8), (_73279, 8), (_73278, 8), (_73277, 8), (_73276, 8), (_73275, 8), (_73274, 8), (_73273, 8), (_73272, 8), (_73271, 8), (_73270, 8), (_73269, 8), (_73268, 8), (_73267, 8), (_73266, 8), (_73265, 8), (_73264, 8), (_73263, 8), (_73262, 8), (_73261, 8), (_73260, 8), (_73259, 8), (_73258, 8), (_73257, 8), (_73256, 8), (_73255, 8), (_73609, 8), (_73608, 8), (_73607, 8), (_73606, 8), (_73605, 8), (_73604, 8), (_73603, 8), (_73602, 8), (_73601, 8), (_73600, 8), (_73599, 8), (_73598, 8), (_73597, 8), (_73596, 8), (_73595, 8), (_73594, 8), (_73593, 8), (_73592, 8), (_73591, 8), (_73590, 8), (_73589, 8), (_73588, 8), (_73587, 8), (_73586, 8), (_73585, 8), (_73584, 8), (_73583, 8), (_73582, 8), (_73581, 8), (_73580, 8), (_73579, 8), (_73578, 8), (_73932, 8), (_73931, 8), (_73930, 8), (_73929, 8), (_73928, 8), (_73927, 8), (_73926, 8), (_73925, 8), (_73924, 8), (_73923, 8), (_73922, 8), (_73921, 8), (_73920, 8), (_73919, 8), (_73918, 8), (_73917, 8), (_73916, 8), (_73915, 8), (_73914, 8), (_73913, 8), (_73912, 8), (_73911, 8), (_73910, 8), (_73909, 8), (_73908, 8), (_73907, 8), (_73906, 8), (_73905, 8), (_73904, 8), (_73903, 8), (_73902, 8), (_73901, 8), (_74255, 8), (_74254, 8), (_74253, 8), (_74252, 8), (_74251, 8), (_74250, 8), (_74249, 8), (_74248, 8), (_74247, 8), (_74246, 8), (_74245, 8), (_74244, 8), (_74243, 8), (_74242, 8), (_74241, 8), (_74240, 8), (_74239, 8), (_74238, 8), (_74237, 8), (_74236, 8), (_74235, 8), (_74234, 8), (_74233, 8), (_74232, 8), (_74231, 8), (_74230, 8), (_74229, 8), (_74228, 8), (_74227, 8), (_74226, 8), (_74225, 8), (_74224, 8), (_74578, 8), (_74577, 8), (_74576, 8), (_74575, 8), (_74574, 8), (_74573, 8), (_74572, 8), (_74571, 8), (_74570, 8), (_74569, 8), (_74568, 8), (_74567, 8), (_74566, 8), (_74565, 8), (_74564, 8), (_74563, 8), (_74562, 8), (_74561, 8), (_74560, 8), (_74559, 8), (_74558, 8), (_74557, 8), (_74556, 8), (_74555, 8), (_74554, 8), (_74553, 8), (_74552, 8), (_74551, 8), (_74550, 8), (_74549, 8), (_74548, 8), (_74547, 8), (_74901, 8), (_74900, 8), (_74899, 8), (_74898, 8), (_74897, 8), (_74896, 8), (_74895, 8), (_74894, 8), (_74893, 8), (_74892, 8), (_74891, 8), (_74890, 8), (_74889, 8), (_74888, 8), (_74887, 8), (_74886, 8), (_74885, 8), (_74884, 8), (_74883, 8), (_74882, 8), (_74881, 8), (_74880, 8), (_74879, 8), (_74878, 8), (_74877, 8), (_74876, 8), (_74875, 8), (_74874, 8), (_74873, 8), (_74872, 8), (_74871, 8), (_74870, 8), (_75224, 8), (_75223, 8), (_75222, 8), (_75221, 8), (_75220, 8), (_75219, 8), (_75218, 8), (_75217, 8), (_75216, 8), (_75215, 8), (_75214, 8), (_75213, 8), (_75212, 8), (_75211, 8), (_75210, 8), (_75209, 8), (_75208, 8), (_75207, 8), (_75206, 8), (_75205, 8), (_75204, 8), (_75203, 8), (_75202, 8), (_75201, 8), (_75200, 8), (_75199, 8), (_75198, 8), (_75197, 8), (_75196, 8), (_75195, 8), (_75194, 8), (_75193, 8), (_75547, 8), (_75546, 8), (_75545, 8), (_75544, 8), (_75543, 8), (_75542, 8), (_75541, 8), (_75540, 8), (_75539, 8), (_75538, 8), (_75537, 8), (_75536, 8), (_75535, 8), (_75534, 8), (_75533, 8), (_75532, 8), (_75531, 8), (_75530, 8), (_75529, 8), (_75528, 8), (_75527, 8), (_75526, 8), (_75525, 8), (_75524, 8), (_75523, 8), (_75522, 8), (_75521, 8), (_75520, 8), (_75519, 8), (_75518, 8), (_75517, 8), (_75516, 8), (_75870, 8), (_75869, 8), (_75868, 8), (_75867, 8), (_75866, 8), (_75865, 8), (_75864, 8), (_75863, 8), (_75862, 8), (_75861, 8), (_75860, 8), (_75859, 8), (_75858, 8), (_75857, 8), (_75856, 8), (_75855, 8), (_75854, 8), (_75853, 8), (_75852, 8), (_75851, 8), (_75850, 8), (_75849, 8), (_75848, 8), (_75847, 8), (_75846, 8), (_75845, 8), (_75844, 8), (_75843, 8), (_75842, 8), (_75841, 8), (_75840, 8), (_75839, 8), (_76193, 8), (_76192, 8), (_76191, 8), (_76190, 8), (_76189, 8), (_76188, 8), (_76187, 8), (_76186, 8), (_76185, 8), (_76184, 8), (_76183, 8), (_76182, 8), (_76181, 8), (_76180, 8), (_76179, 8), (_76178, 8), (_76177, 8), (_76176, 8), (_76175, 8), (_76174, 8), (_76173, 8), (_76172, 8), (_76171, 8), (_76170, 8), (_76169, 8), (_76168, 8), (_76167, 8), (_76166, 8), (_76165, 8), (_76164, 8), (_76163, 8), (_76162, 8), (_76516, 8), (_76515, 8), (_76514, 8), (_76513, 8), (_76512, 8), (_76511, 8), (_76510, 8), (_76509, 8), (_76508, 8), (_76507, 8), (_76506, 8), (_76505, 8), (_76504, 8), (_76503, 8), (_76502, 8), (_76501, 8), (_76500, 8), (_76499, 8), (_76498, 8), (_76497, 8), (_76496, 8), (_76495, 8), (_76494, 8), (_76493, 8), (_76492, 8), (_76491, 8), (_76490, 8), (_76489, 8), (_76488, 8), (_76487, 8), (_76486, 8), (_76485, 8), (_76839, 8), (_76838, 8), (_76837, 8), (_76836, 8), (_76835, 8), (_76834, 8), (_76833, 8), (_76832, 8), (_76831, 8), (_76830, 8), (_76829, 8), (_76828, 8), (_76827, 8), (_76826, 8), (_76825, 8), (_76824, 8), (_76823, 8), (_76822, 8), (_76821, 8), (_76820, 8), (_76819, 8), (_76818, 8), (_76817, 8), (_76816, 8), (_76815, 8), (_76814, 8), (_76813, 8), (_76812, 8), (_76811, 8), (_76810, 8), (_76809, 8), (_76808, 8), (_77162, 8), (_77161, 8), (_77160, 8), (_77159, 8), (_77158, 8), (_77157, 8), (_77156, 8), (_77155, 8), (_77154, 8), (_77153, 8), (_77152, 8), (_77151, 8), (_77150, 8), (_77149, 8), (_77148, 8), (_77147, 8), (_77146, 8), (_77145, 8), (_77144, 8), (_77143, 8), (_77142, 8), (_77141, 8), (_77140, 8), (_77139, 8), (_77138, 8), (_77137, 8), (_77136, 8), (_77135, 8), (_77134, 8), (_77133, 8), (_77132, 8), (_77131, 8), (_77485, 8), (_77484, 8), (_77483, 8), (_77482, 8), (_77481, 8), (_77480, 8), (_77479, 8), (_77478, 8), (_77477, 8), (_77476, 8), (_77475, 8), (_77474, 8), (_77473, 8), (_77472, 8), (_77471, 8), (_77470, 8), (_77469, 8), (_77468, 8), (_77467, 8), (_77466, 8), (_77465, 8), (_77464, 8), (_77463, 8), (_77462, 8), (_77461, 8), (_77460, 8), (_77459, 8), (_77458, 8), (_77457, 8), (_77456, 8), (_77455, 8), (_77454, 8), (_77808, 8), (_77807, 8), (_77806, 8), (_77805, 8), (_77804, 8), (_77803, 8), (_77802, 8), (_77801, 8), (_77800, 8), (_77799, 8), (_77798, 8), (_77797, 8), (_77796, 8), (_77795, 8), (_77794, 8), (_77793, 8), (_77792, 8), (_77791, 8), (_77790, 8), (_77789, 8), (_77788, 8), (_77787, 8), (_77786, 8), (_77785, 8), (_77784, 8), (_77783, 8), (_77782, 8), (_77781, 8), (_77780, 8), (_77779, 8), (_77778, 8), (_77777, 8), (_78131, 8), (_78130, 8), (_78129, 8), (_78128, 8), (_78127, 8), (_78126, 8), (_78125, 8), (_78124, 8), (_78123, 8), (_78122, 8), (_78121, 8), (_78120, 8), (_78119, 8), (_78118, 8), (_78117, 8), (_78116, 8), (_78115, 8), (_78114, 8), (_78113, 8), (_78112, 8), (_78111, 8), (_78110, 8), (_78109, 8), (_78108, 8), (_78107, 8), (_78106, 8), (_78105, 8), (_78104, 8), (_78103, 8), (_78102, 8), (_78101, 8), (_78100, 8), (_78454, 8), (_78453, 8), (_78452, 8), (_78451, 8), (_78450, 8), (_78449, 8), (_78448, 8), (_78447, 8), (_78446, 8), (_78445, 8), (_78444, 8), (_78443, 8), (_78442, 8), (_78441, 8), (_78440, 8), (_78439, 8), (_78438, 8), (_78437, 8), (_78436, 8), (_78435, 8), (_78434, 8), (_78433, 8), (_78432, 8), (_78431, 8), (_78430, 8), (_78429, 8), (_78428, 8), (_78427, 8), (_78426, 8), (_78425, 8), (_78424, 8), (_78423, 8), (_78777, 8), (_78776, 8), (_78775, 8), (_78774, 8), (_78773, 8), (_78772, 8), (_78771, 8), (_78770, 8), (_78769, 8), (_78768, 8), (_78767, 8), (_78766, 8), (_78765, 8), (_78764, 8), (_78763, 8), (_78762, 8), (_78761, 8), (_78760, 8), (_78759, 8), (_78758, 8), (_78757, 8), (_78756, 8), (_78755, 8), (_78754, 8), (_78753, 8), (_78752, 8), (_78751, 8), (_78750, 8), (_78749, 8), (_78748, 8), (_78747, 8), (_78746, 8), (_79100, 8), (_79099, 8), (_79098, 8), (_79097, 8), (_79096, 8), (_79095, 8), (_79094, 8), (_79093, 8), (_79092, 8), (_79091, 8), (_79090, 8), (_79089, 8), (_79088, 8), (_79087, 8), (_79086, 8), (_79085, 8), (_79084, 8), (_79083, 8), (_79082, 8), (_79081, 8), (_79080, 8), (_79079, 8), (_79078, 8), (_79077, 8), (_79076, 8), (_79075, 8), (_79074, 8), (_79073, 8), (_79072, 8), (_79071, 8), (_79070, 8), (_79069, 8), (_79423, 8), (_79422, 8), (_79421, 8), (_79420, 8), (_79419, 8), (_79418, 8), (_79417, 8), (_79416, 8), (_79415, 8), (_79414, 8), (_79413, 8), (_79412, 8), (_79411, 8), (_79410, 8), (_79409, 8), (_79408, 8), (_79407, 8), (_79406, 8), (_79405, 8), (_79404, 8), (_79403, 8), (_79402, 8), (_79401, 8), (_79400, 8), (_79399, 8), (_79398, 8), (_79397, 8), (_79396, 8), (_79395, 8), (_79394, 8), (_79393, 8), (_79392, 8), (_79746, 8), (_79745, 8), (_79744, 8), (_79743, 8), (_79742, 8), (_79741, 8), (_79740, 8), (_79739, 8), (_79738, 8), (_79737, 8), (_79736, 8), (_79735, 8), (_79734, 8), (_79733, 8), (_79732, 8), (_79731, 8), (_79730, 8), (_79729, 8), (_79728, 8), (_79727, 8), (_79726, 8), (_79725, 8), (_79724, 8), (_79723, 8), (_79722, 8), (_79721, 8), (_79720, 8), (_79719, 8), (_79718, 8), (_79717, 8), (_79716, 8), (_79715, 8), (_80069, 8), (_80068, 8), (_80067, 8), (_80066, 8), (_80065, 8), (_80064, 8), (_80063, 8), (_80062, 8), (_80061, 8), (_80060, 8), (_80059, 8), (_80058, 8), (_80057, 8), (_80056, 8), (_80055, 8), (_80054, 8), (_80053, 8), (_80052, 8), (_80051, 8), (_80050, 8), (_80049, 8), (_80048, 8), (_80047, 8), (_80046, 8), (_80045, 8), (_80044, 8), (_80043, 8), (_80042, 8), (_80041, 8), (_80040, 8), (_80039, 8), (_80038, 8), (_80392, 8), (_80391, 8), (_80390, 8), (_80389, 8), (_80388, 8), (_80387, 8), (_80386, 8), (_80385, 8), (_80384, 8), (_80383, 8), (_80382, 8), (_80381, 8), (_80380, 8), (_80379, 8), (_80378, 8), (_80377, 8), (_80376, 8), (_80375, 8), (_80374, 8), (_80373, 8), (_80372, 8), (_80371, 8), (_80370, 8), (_80369, 8), (_80368, 8), (_80367, 8), (_80366, 8), (_80365, 8), (_80364, 8), (_80363, 8), (_80362, 8), (_80361, 8), (_80715, 8), (_80714, 8), (_80713, 8), (_80712, 8), (_80711, 8), (_80710, 8), (_80709, 8), (_80708, 8), (_80707, 8), (_80706, 8), (_80705, 8), (_80704, 8), (_80703, 8), (_80702, 8), (_80701, 8), (_80700, 8), (_80699, 8), (_80698, 8), (_80697, 8), (_80696, 8), (_80695, 8), (_80694, 8), (_80693, 8), (_80692, 8), (_80691, 8), (_80690, 8), (_80689, 8), (_80688, 8), (_80687, 8), (_80686, 8), (_80685, 8), (_80684, 8), (_81038, 8), (_81037, 8), (_81036, 8), (_81035, 8), (_81034, 8), (_81033, 8), (_81032, 8), (_81031, 8), (_81030, 8), (_81029, 8), (_81028, 8), (_81027, 8), (_81026, 8), (_81025, 8), (_81024, 8), (_81023, 8), (_81022, 8), (_81021, 8), (_81020, 8), (_81019, 8), (_81018, 8), (_81017, 8), (_81016, 8), (_81015, 8), (_81014, 8), (_81013, 8), (_81012, 8), (_81011, 8), (_81010, 8), (_81009, 8), (_81008, 8), (_81007, 8), (_81361, 8), (_81360, 8), (_81359, 8), (_81358, 8), (_81357, 8), (_81356, 8), (_81355, 8), (_81354, 8), (_81353, 8), (_81352, 8), (_81351, 8), (_81350, 8), (_81349, 8), (_81348, 8), (_81347, 8), (_81346, 8), (_81345, 8), (_81344, 8), (_81343, 8), (_81342, 8), (_81341, 8), (_81340, 8), (_81339, 8), (_81338, 8), (_81337, 8), (_81336, 8), (_81335, 8), (_81334, 8), (_81333, 8), (_81332, 8), (_81331, 8), (_81330, 8), (_81684, 8), (_81683, 8), (_81682, 8), (_81681, 8), (_81680, 8), (_81679, 8), (_81678, 8), (_81677, 8), (_81676, 8), (_81675, 8), (_81674, 8), (_81673, 8), (_81672, 8), (_81671, 8), (_81670, 8), (_81669, 8), (_81668, 8), (_81667, 8), (_81666, 8), (_81665, 8), (_81664, 8), (_81663, 8), (_81662, 8), (_81661, 8), (_81660, 8), (_81659, 8), (_81658, 8), (_81657, 8), (_81656, 8), (_81655, 8), (_81654, 8), (_81653, 8), (_82007, 8), (_82006, 8), (_82005, 8), (_82004, 8), (_82003, 8), (_82002, 8), (_82001, 8), (_82000, 8), (_81999, 8), (_81998, 8), (_81997, 8), (_81996, 8), (_81995, 8), (_81994, 8), (_81993, 8), (_81992, 8), (_81991, 8), (_81990, 8), (_81989, 8), (_81988, 8), (_81987, 8), (_81986, 8), (_81985, 8), (_81984, 8), (_81983, 8), (_81982, 8), (_81981, 8), (_81980, 8), (_81979, 8), (_81978, 8), (_81977, 8), (_81976, 8), (_82330, 8), (_82329, 8), (_82328, 8), (_82327, 8), (_82326, 8), (_82325, 8), (_82324, 8), (_82323, 8), (_82322, 8), (_82321, 8), (_82320, 8), (_82319, 8), (_82318, 8), (_82317, 8), (_82316, 8), (_82315, 8), (_82314, 8), (_82313, 8), (_82312, 8), (_82311, 8), (_82310, 8), (_82309, 8), (_82308, 8), (_82307, 8), (_82306, 8), (_82305, 8), (_82304, 8), (_82303, 8), (_82302, 8), (_82301, 8), (_82300, 8), (_82299, 8), (_82653, 8), (_82652, 8), (_82651, 8), (_82650, 8), (_82649, 8), (_82648, 8), (_82647, 8), (_82646, 8), (_82645, 8), (_82644, 8), (_82643, 8), (_82642, 8), (_82641, 8), (_82640, 8), (_82639, 8), (_82638, 8), (_82637, 8), (_82636, 8), (_82635, 8), (_82634, 8), (_82633, 8), (_82632, 8), (_82631, 8), (_82630, 8), (_82629, 8), (_82628, 8), (_82627, 8), (_82626, 8), (_82625, 8), (_82624, 8), (_82623, 8), (_82622, 8)] [_82945, _82946, _82947, _82948, _82949, _82950, _82951, _82952, _82953, _82954, _82955, _82956, _82957, _82958, _82959, _82960, _82961, _82962, _82963, _82964, _82965, _82966, _82967, _82968, _82969, _82970, _82971, _82972, _82973, _82974, _82975, _82976]", + "BLACKBOX::BLAKE2S [(_288, 8), (_287, 8), (_286, 8), (_285, 8), (_284, 8), (_283, 8), (_282, 8), (_281, 8), (_280, 8), (_279, 8), (_278, 8), (_277, 8), (_276, 8), (_275, 8), (_274, 8), (_273, 8), (_272, 8), (_271, 8), (_270, 8), (_269, 8), (_268, 8), (_267, 8), (_266, 8), (_265, 8), (_264, 8), (_263, 8), (_262, 8), (_261, 8), (_260, 8), (_259, 8), (_258, 8), (_257, 8), (_611, 8), (_610, 8), (_609, 8), (_608, 8), (_607, 8), (_606, 8), (_605, 8), (_604, 8), (_603, 8), (_602, 8), (_601, 8), (_600, 8), (_599, 8), (_598, 8), (_597, 8), (_596, 8), (_595, 8), (_594, 8), (_593, 8), (_592, 8), (_591, 8), (_590, 8), (_589, 8), (_588, 8), (_587, 8), (_586, 8), (_585, 8), (_584, 8), (_583, 8), (_582, 8), (_581, 8), (_580, 8), (_934, 8), (_933, 8), (_932, 8), (_931, 8), (_930, 8), (_929, 8), (_928, 8), (_927, 8), (_926, 8), (_925, 8), (_924, 8), (_923, 8), (_922, 8), (_921, 8), (_920, 8), (_919, 8), (_918, 8), (_917, 8), (_916, 8), (_915, 8), (_914, 8), (_913, 8), (_912, 8), (_911, 8), (_910, 8), (_909, 8), (_908, 8), (_907, 8), (_906, 8), (_905, 8), (_904, 8), (_903, 8), (_1257, 8), (_1256, 8), (_1255, 8), (_1254, 8), (_1253, 8), (_1252, 8), (_1251, 8), (_1250, 8), (_1249, 8), (_1248, 8), (_1247, 8), (_1246, 8), (_1245, 8), (_1244, 8), (_1243, 8), (_1242, 8), (_1241, 8), (_1240, 8), (_1239, 8), (_1238, 8), (_1237, 8), (_1236, 8), (_1235, 8), (_1234, 8), (_1233, 8), (_1232, 8), (_1231, 8), (_1230, 8), (_1229, 8), (_1228, 8), (_1227, 8), (_1226, 8), (_1580, 8), (_1579, 8), (_1578, 8), (_1577, 8), (_1576, 8), (_1575, 8), (_1574, 8), (_1573, 8), (_1572, 8), (_1571, 8), (_1570, 8), (_1569, 8), (_1568, 8), (_1567, 8), (_1566, 8), (_1565, 8), (_1564, 8), (_1563, 8), (_1562, 8), (_1561, 8), (_1560, 8), (_1559, 8), (_1558, 8), (_1557, 8), (_1556, 8), (_1555, 8), (_1554, 8), (_1553, 8), (_1552, 8), (_1551, 8), (_1550, 8), (_1549, 8), (_1903, 8), (_1902, 8), (_1901, 8), (_1900, 8), (_1899, 8), (_1898, 8), (_1897, 8), (_1896, 8), (_1895, 8), (_1894, 8), (_1893, 8), (_1892, 8), (_1891, 8), (_1890, 8), (_1889, 8), (_1888, 8), (_1887, 8), (_1886, 8), (_1885, 8), (_1884, 8), (_1883, 8), (_1882, 8), (_1881, 8), (_1880, 8), (_1879, 8), (_1878, 8), (_1877, 8), (_1876, 8), (_1875, 8), (_1874, 8), (_1873, 8), (_1872, 8), (_2226, 8), (_2225, 8), (_2224, 8), (_2223, 8), (_2222, 8), (_2221, 8), (_2220, 8), (_2219, 8), (_2218, 8), (_2217, 8), (_2216, 8), (_2215, 8), (_2214, 8), (_2213, 8), (_2212, 8), (_2211, 8), (_2210, 8), (_2209, 8), (_2208, 8), (_2207, 8), (_2206, 8), (_2205, 8), (_2204, 8), (_2203, 8), (_2202, 8), (_2201, 8), (_2200, 8), (_2199, 8), (_2198, 8), (_2197, 8), (_2196, 8), (_2195, 8), (_2549, 8), (_2548, 8), (_2547, 8), (_2546, 8), (_2545, 8), (_2544, 8), (_2543, 8), (_2542, 8), (_2541, 8), (_2540, 8), (_2539, 8), (_2538, 8), (_2537, 8), (_2536, 8), (_2535, 8), (_2534, 8), (_2533, 8), (_2532, 8), (_2531, 8), (_2530, 8), (_2529, 8), (_2528, 8), (_2527, 8), (_2526, 8), (_2525, 8), (_2524, 8), (_2523, 8), (_2522, 8), (_2521, 8), (_2520, 8), (_2519, 8), (_2518, 8), (_2872, 8), (_2871, 8), (_2870, 8), (_2869, 8), (_2868, 8), (_2867, 8), (_2866, 8), (_2865, 8), (_2864, 8), (_2863, 8), (_2862, 8), (_2861, 8), (_2860, 8), (_2859, 8), (_2858, 8), (_2857, 8), (_2856, 8), (_2855, 8), (_2854, 8), (_2853, 8), (_2852, 8), (_2851, 8), (_2850, 8), (_2849, 8), (_2848, 8), (_2847, 8), (_2846, 8), (_2845, 8), (_2844, 8), (_2843, 8), (_2842, 8), (_2841, 8), (_3195, 8), (_3194, 8), (_3193, 8), (_3192, 8), (_3191, 8), (_3190, 8), (_3189, 8), (_3188, 8), (_3187, 8), (_3186, 8), (_3185, 8), (_3184, 8), (_3183, 8), (_3182, 8), (_3181, 8), (_3180, 8), (_3179, 8), (_3178, 8), (_3177, 8), (_3176, 8), (_3175, 8), (_3174, 8), (_3173, 8), (_3172, 8), (_3171, 8), (_3170, 8), (_3169, 8), (_3168, 8), (_3167, 8), (_3166, 8), (_3165, 8), (_3164, 8), (_3518, 8), (_3517, 8), (_3516, 8), (_3515, 8), (_3514, 8), (_3513, 8), (_3512, 8), (_3511, 8), (_3510, 8), (_3509, 8), (_3508, 8), (_3507, 8), (_3506, 8), (_3505, 8), (_3504, 8), (_3503, 8), (_3502, 8), (_3501, 8), (_3500, 8), (_3499, 8), (_3498, 8), (_3497, 8), (_3496, 8), (_3495, 8), (_3494, 8), (_3493, 8), (_3492, 8), (_3491, 8), (_3490, 8), (_3489, 8), (_3488, 8), (_3487, 8), (_3841, 8), (_3840, 8), (_3839, 8), (_3838, 8), (_3837, 8), (_3836, 8), (_3835, 8), (_3834, 8), (_3833, 8), (_3832, 8), (_3831, 8), (_3830, 8), (_3829, 8), (_3828, 8), (_3827, 8), (_3826, 8), (_3825, 8), (_3824, 8), (_3823, 8), (_3822, 8), (_3821, 8), (_3820, 8), (_3819, 8), (_3818, 8), (_3817, 8), (_3816, 8), (_3815, 8), (_3814, 8), (_3813, 8), (_3812, 8), (_3811, 8), (_3810, 8), (_4164, 8), (_4163, 8), (_4162, 8), (_4161, 8), (_4160, 8), (_4159, 8), (_4158, 8), (_4157, 8), (_4156, 8), (_4155, 8), (_4154, 8), (_4153, 8), (_4152, 8), (_4151, 8), (_4150, 8), (_4149, 8), (_4148, 8), (_4147, 8), (_4146, 8), (_4145, 8), (_4144, 8), (_4143, 8), (_4142, 8), (_4141, 8), (_4140, 8), (_4139, 8), (_4138, 8), (_4137, 8), (_4136, 8), (_4135, 8), (_4134, 8), (_4133, 8), (_4487, 8), (_4486, 8), (_4485, 8), (_4484, 8), (_4483, 8), (_4482, 8), (_4481, 8), (_4480, 8), (_4479, 8), (_4478, 8), (_4477, 8), (_4476, 8), (_4475, 8), (_4474, 8), (_4473, 8), (_4472, 8), (_4471, 8), (_4470, 8), (_4469, 8), (_4468, 8), (_4467, 8), (_4466, 8), (_4465, 8), (_4464, 8), (_4463, 8), (_4462, 8), (_4461, 8), (_4460, 8), (_4459, 8), (_4458, 8), (_4457, 8), (_4456, 8), (_4810, 8), (_4809, 8), (_4808, 8), (_4807, 8), (_4806, 8), (_4805, 8), (_4804, 8), (_4803, 8), (_4802, 8), (_4801, 8), (_4800, 8), (_4799, 8), (_4798, 8), (_4797, 8), (_4796, 8), (_4795, 8), (_4794, 8), (_4793, 8), (_4792, 8), (_4791, 8), (_4790, 8), (_4789, 8), (_4788, 8), (_4787, 8), (_4786, 8), (_4785, 8), (_4784, 8), (_4783, 8), (_4782, 8), (_4781, 8), (_4780, 8), (_4779, 8), (_5133, 8), (_5132, 8), (_5131, 8), (_5130, 8), (_5129, 8), (_5128, 8), (_5127, 8), (_5126, 8), (_5125, 8), (_5124, 8), (_5123, 8), (_5122, 8), (_5121, 8), (_5120, 8), (_5119, 8), (_5118, 8), (_5117, 8), (_5116, 8), (_5115, 8), (_5114, 8), (_5113, 8), (_5112, 8), (_5111, 8), (_5110, 8), (_5109, 8), (_5108, 8), (_5107, 8), (_5106, 8), (_5105, 8), (_5104, 8), (_5103, 8), (_5102, 8), (_5456, 8), (_5455, 8), (_5454, 8), (_5453, 8), (_5452, 8), (_5451, 8), (_5450, 8), (_5449, 8), (_5448, 8), (_5447, 8), (_5446, 8), (_5445, 8), (_5444, 8), (_5443, 8), (_5442, 8), (_5441, 8), (_5440, 8), (_5439, 8), (_5438, 8), (_5437, 8), (_5436, 8), (_5435, 8), (_5434, 8), (_5433, 8), (_5432, 8), (_5431, 8), (_5430, 8), (_5429, 8), (_5428, 8), (_5427, 8), (_5426, 8), (_5425, 8), (_5779, 8), (_5778, 8), (_5777, 8), (_5776, 8), (_5775, 8), (_5774, 8), (_5773, 8), (_5772, 8), (_5771, 8), (_5770, 8), (_5769, 8), (_5768, 8), (_5767, 8), (_5766, 8), (_5765, 8), (_5764, 8), (_5763, 8), (_5762, 8), (_5761, 8), (_5760, 8), (_5759, 8), (_5758, 8), (_5757, 8), (_5756, 8), (_5755, 8), (_5754, 8), (_5753, 8), (_5752, 8), (_5751, 8), (_5750, 8), (_5749, 8), (_5748, 8), (_6102, 8), (_6101, 8), (_6100, 8), (_6099, 8), (_6098, 8), (_6097, 8), (_6096, 8), (_6095, 8), (_6094, 8), (_6093, 8), (_6092, 8), (_6091, 8), (_6090, 8), (_6089, 8), (_6088, 8), (_6087, 8), (_6086, 8), (_6085, 8), (_6084, 8), (_6083, 8), (_6082, 8), (_6081, 8), (_6080, 8), (_6079, 8), (_6078, 8), (_6077, 8), (_6076, 8), (_6075, 8), (_6074, 8), (_6073, 8), (_6072, 8), (_6071, 8), (_6425, 8), (_6424, 8), (_6423, 8), (_6422, 8), (_6421, 8), (_6420, 8), (_6419, 8), (_6418, 8), (_6417, 8), (_6416, 8), (_6415, 8), (_6414, 8), (_6413, 8), (_6412, 8), (_6411, 8), (_6410, 8), (_6409, 8), (_6408, 8), (_6407, 8), (_6406, 8), (_6405, 8), (_6404, 8), (_6403, 8), (_6402, 8), (_6401, 8), (_6400, 8), (_6399, 8), (_6398, 8), (_6397, 8), (_6396, 8), (_6395, 8), (_6394, 8), (_6748, 8), (_6747, 8), (_6746, 8), (_6745, 8), (_6744, 8), (_6743, 8), (_6742, 8), (_6741, 8), (_6740, 8), (_6739, 8), (_6738, 8), (_6737, 8), (_6736, 8), (_6735, 8), (_6734, 8), (_6733, 8), (_6732, 8), (_6731, 8), (_6730, 8), (_6729, 8), (_6728, 8), (_6727, 8), (_6726, 8), (_6725, 8), (_6724, 8), (_6723, 8), (_6722, 8), (_6721, 8), (_6720, 8), (_6719, 8), (_6718, 8), (_6717, 8), (_7071, 8), (_7070, 8), (_7069, 8), (_7068, 8), (_7067, 8), (_7066, 8), (_7065, 8), (_7064, 8), (_7063, 8), (_7062, 8), (_7061, 8), (_7060, 8), (_7059, 8), (_7058, 8), (_7057, 8), (_7056, 8), (_7055, 8), (_7054, 8), (_7053, 8), (_7052, 8), (_7051, 8), (_7050, 8), (_7049, 8), (_7048, 8), (_7047, 8), (_7046, 8), (_7045, 8), (_7044, 8), (_7043, 8), (_7042, 8), (_7041, 8), (_7040, 8), (_7394, 8), (_7393, 8), (_7392, 8), (_7391, 8), (_7390, 8), (_7389, 8), (_7388, 8), (_7387, 8), (_7386, 8), (_7385, 8), (_7384, 8), (_7383, 8), (_7382, 8), (_7381, 8), (_7380, 8), (_7379, 8), (_7378, 8), (_7377, 8), (_7376, 8), (_7375, 8), (_7374, 8), (_7373, 8), (_7372, 8), (_7371, 8), (_7370, 8), (_7369, 8), (_7368, 8), (_7367, 8), (_7366, 8), (_7365, 8), (_7364, 8), (_7363, 8), (_7717, 8), (_7716, 8), (_7715, 8), (_7714, 8), (_7713, 8), (_7712, 8), (_7711, 8), (_7710, 8), (_7709, 8), (_7708, 8), (_7707, 8), (_7706, 8), (_7705, 8), (_7704, 8), (_7703, 8), (_7702, 8), (_7701, 8), (_7700, 8), (_7699, 8), (_7698, 8), (_7697, 8), (_7696, 8), (_7695, 8), (_7694, 8), (_7693, 8), (_7692, 8), (_7691, 8), (_7690, 8), (_7689, 8), (_7688, 8), (_7687, 8), (_7686, 8), (_8040, 8), (_8039, 8), (_8038, 8), (_8037, 8), (_8036, 8), (_8035, 8), (_8034, 8), (_8033, 8), (_8032, 8), (_8031, 8), (_8030, 8), (_8029, 8), (_8028, 8), (_8027, 8), (_8026, 8), (_8025, 8), (_8024, 8), (_8023, 8), (_8022, 8), (_8021, 8), (_8020, 8), (_8019, 8), (_8018, 8), (_8017, 8), (_8016, 8), (_8015, 8), (_8014, 8), (_8013, 8), (_8012, 8), (_8011, 8), (_8010, 8), (_8009, 8), (_8363, 8), (_8362, 8), (_8361, 8), (_8360, 8), (_8359, 8), (_8358, 8), (_8357, 8), (_8356, 8), (_8355, 8), (_8354, 8), (_8353, 8), (_8352, 8), (_8351, 8), (_8350, 8), (_8349, 8), (_8348, 8), (_8347, 8), (_8346, 8), (_8345, 8), (_8344, 8), (_8343, 8), (_8342, 8), (_8341, 8), (_8340, 8), (_8339, 8), (_8338, 8), (_8337, 8), (_8336, 8), (_8335, 8), (_8334, 8), (_8333, 8), (_8332, 8), (_8686, 8), (_8685, 8), (_8684, 8), (_8683, 8), (_8682, 8), (_8681, 8), (_8680, 8), (_8679, 8), (_8678, 8), (_8677, 8), (_8676, 8), (_8675, 8), (_8674, 8), (_8673, 8), (_8672, 8), (_8671, 8), (_8670, 8), (_8669, 8), (_8668, 8), (_8667, 8), (_8666, 8), (_8665, 8), (_8664, 8), (_8663, 8), (_8662, 8), (_8661, 8), (_8660, 8), (_8659, 8), (_8658, 8), (_8657, 8), (_8656, 8), (_8655, 8), (_9009, 8), (_9008, 8), (_9007, 8), (_9006, 8), (_9005, 8), (_9004, 8), (_9003, 8), (_9002, 8), (_9001, 8), (_9000, 8), (_8999, 8), (_8998, 8), (_8997, 8), (_8996, 8), (_8995, 8), (_8994, 8), (_8993, 8), (_8992, 8), (_8991, 8), (_8990, 8), (_8989, 8), (_8988, 8), (_8987, 8), (_8986, 8), (_8985, 8), (_8984, 8), (_8983, 8), (_8982, 8), (_8981, 8), (_8980, 8), (_8979, 8), (_8978, 8), (_9332, 8), (_9331, 8), (_9330, 8), (_9329, 8), (_9328, 8), (_9327, 8), (_9326, 8), (_9325, 8), (_9324, 8), (_9323, 8), (_9322, 8), (_9321, 8), (_9320, 8), (_9319, 8), (_9318, 8), (_9317, 8), (_9316, 8), (_9315, 8), (_9314, 8), (_9313, 8), (_9312, 8), (_9311, 8), (_9310, 8), (_9309, 8), (_9308, 8), (_9307, 8), (_9306, 8), (_9305, 8), (_9304, 8), (_9303, 8), (_9302, 8), (_9301, 8), (_9655, 8), (_9654, 8), (_9653, 8), (_9652, 8), (_9651, 8), (_9650, 8), (_9649, 8), (_9648, 8), (_9647, 8), (_9646, 8), (_9645, 8), (_9644, 8), (_9643, 8), (_9642, 8), (_9641, 8), (_9640, 8), (_9639, 8), (_9638, 8), (_9637, 8), (_9636, 8), (_9635, 8), (_9634, 8), (_9633, 8), (_9632, 8), (_9631, 8), (_9630, 8), (_9629, 8), (_9628, 8), (_9627, 8), (_9626, 8), (_9625, 8), (_9624, 8), (_9978, 8), (_9977, 8), (_9976, 8), (_9975, 8), (_9974, 8), (_9973, 8), (_9972, 8), (_9971, 8), (_9970, 8), (_9969, 8), (_9968, 8), (_9967, 8), (_9966, 8), (_9965, 8), (_9964, 8), (_9963, 8), (_9962, 8), (_9961, 8), (_9960, 8), (_9959, 8), (_9958, 8), (_9957, 8), (_9956, 8), (_9955, 8), (_9954, 8), (_9953, 8), (_9952, 8), (_9951, 8), (_9950, 8), (_9949, 8), (_9948, 8), (_9947, 8), (_10301, 8), (_10300, 8), (_10299, 8), (_10298, 8), (_10297, 8), (_10296, 8), (_10295, 8), (_10294, 8), (_10293, 8), (_10292, 8), (_10291, 8), (_10290, 8), (_10289, 8), (_10288, 8), (_10287, 8), (_10286, 8), (_10285, 8), (_10284, 8), (_10283, 8), (_10282, 8), (_10281, 8), (_10280, 8), (_10279, 8), (_10278, 8), (_10277, 8), (_10276, 8), (_10275, 8), (_10274, 8), (_10273, 8), (_10272, 8), (_10271, 8), (_10270, 8), (_10624, 8), (_10623, 8), (_10622, 8), (_10621, 8), (_10620, 8), (_10619, 8), (_10618, 8), (_10617, 8), (_10616, 8), (_10615, 8), (_10614, 8), (_10613, 8), (_10612, 8), (_10611, 8), (_10610, 8), (_10609, 8), (_10608, 8), (_10607, 8), (_10606, 8), (_10605, 8), (_10604, 8), (_10603, 8), (_10602, 8), (_10601, 8), (_10600, 8), (_10599, 8), (_10598, 8), (_10597, 8), (_10596, 8), (_10595, 8), (_10594, 8), (_10593, 8), (_10947, 8), (_10946, 8), (_10945, 8), (_10944, 8), (_10943, 8), (_10942, 8), (_10941, 8), (_10940, 8), (_10939, 8), (_10938, 8), (_10937, 8), (_10936, 8), (_10935, 8), (_10934, 8), (_10933, 8), (_10932, 8), (_10931, 8), (_10930, 8), (_10929, 8), (_10928, 8), (_10927, 8), (_10926, 8), (_10925, 8), (_10924, 8), (_10923, 8), (_10922, 8), (_10921, 8), (_10920, 8), (_10919, 8), (_10918, 8), (_10917, 8), (_10916, 8), (_11270, 8), (_11269, 8), (_11268, 8), (_11267, 8), (_11266, 8), (_11265, 8), (_11264, 8), (_11263, 8), (_11262, 8), (_11261, 8), (_11260, 8), (_11259, 8), (_11258, 8), (_11257, 8), (_11256, 8), (_11255, 8), (_11254, 8), (_11253, 8), (_11252, 8), (_11251, 8), (_11250, 8), (_11249, 8), (_11248, 8), (_11247, 8), (_11246, 8), (_11245, 8), (_11244, 8), (_11243, 8), (_11242, 8), (_11241, 8), (_11240, 8), (_11239, 8), (_11593, 8), (_11592, 8), (_11591, 8), (_11590, 8), (_11589, 8), (_11588, 8), (_11587, 8), (_11586, 8), (_11585, 8), (_11584, 8), (_11583, 8), (_11582, 8), (_11581, 8), (_11580, 8), (_11579, 8), (_11578, 8), (_11577, 8), (_11576, 8), (_11575, 8), (_11574, 8), (_11573, 8), (_11572, 8), (_11571, 8), (_11570, 8), (_11569, 8), (_11568, 8), (_11567, 8), (_11566, 8), (_11565, 8), (_11564, 8), (_11563, 8), (_11562, 8), (_11916, 8), (_11915, 8), (_11914, 8), (_11913, 8), (_11912, 8), (_11911, 8), (_11910, 8), (_11909, 8), (_11908, 8), (_11907, 8), (_11906, 8), (_11905, 8), (_11904, 8), (_11903, 8), (_11902, 8), (_11901, 8), (_11900, 8), (_11899, 8), (_11898, 8), (_11897, 8), (_11896, 8), (_11895, 8), (_11894, 8), (_11893, 8), (_11892, 8), (_11891, 8), (_11890, 8), (_11889, 8), (_11888, 8), (_11887, 8), (_11886, 8), (_11885, 8), (_12239, 8), (_12238, 8), (_12237, 8), (_12236, 8), (_12235, 8), (_12234, 8), (_12233, 8), (_12232, 8), (_12231, 8), (_12230, 8), (_12229, 8), (_12228, 8), (_12227, 8), (_12226, 8), (_12225, 8), (_12224, 8), (_12223, 8), (_12222, 8), (_12221, 8), (_12220, 8), (_12219, 8), (_12218, 8), (_12217, 8), (_12216, 8), (_12215, 8), (_12214, 8), (_12213, 8), (_12212, 8), (_12211, 8), (_12210, 8), (_12209, 8), (_12208, 8), (_12562, 8), (_12561, 8), (_12560, 8), (_12559, 8), (_12558, 8), (_12557, 8), (_12556, 8), (_12555, 8), (_12554, 8), (_12553, 8), (_12552, 8), (_12551, 8), (_12550, 8), (_12549, 8), (_12548, 8), (_12547, 8), (_12546, 8), (_12545, 8), (_12544, 8), (_12543, 8), (_12542, 8), (_12541, 8), (_12540, 8), (_12539, 8), (_12538, 8), (_12537, 8), (_12536, 8), (_12535, 8), (_12534, 8), (_12533, 8), (_12532, 8), (_12531, 8), (_12885, 8), (_12884, 8), (_12883, 8), (_12882, 8), (_12881, 8), (_12880, 8), (_12879, 8), (_12878, 8), (_12877, 8), (_12876, 8), (_12875, 8), (_12874, 8), (_12873, 8), (_12872, 8), (_12871, 8), (_12870, 8), (_12869, 8), (_12868, 8), (_12867, 8), (_12866, 8), (_12865, 8), (_12864, 8), (_12863, 8), (_12862, 8), (_12861, 8), (_12860, 8), (_12859, 8), (_12858, 8), (_12857, 8), (_12856, 8), (_12855, 8), (_12854, 8), (_13208, 8), (_13207, 8), (_13206, 8), (_13205, 8), (_13204, 8), (_13203, 8), (_13202, 8), (_13201, 8), (_13200, 8), (_13199, 8), (_13198, 8), (_13197, 8), (_13196, 8), (_13195, 8), (_13194, 8), (_13193, 8), (_13192, 8), (_13191, 8), (_13190, 8), (_13189, 8), (_13188, 8), (_13187, 8), (_13186, 8), (_13185, 8), (_13184, 8), (_13183, 8), (_13182, 8), (_13181, 8), (_13180, 8), (_13179, 8), (_13178, 8), (_13177, 8), (_13531, 8), (_13530, 8), (_13529, 8), (_13528, 8), (_13527, 8), (_13526, 8), (_13525, 8), (_13524, 8), (_13523, 8), (_13522, 8), (_13521, 8), (_13520, 8), (_13519, 8), (_13518, 8), (_13517, 8), (_13516, 8), (_13515, 8), (_13514, 8), (_13513, 8), (_13512, 8), (_13511, 8), (_13510, 8), (_13509, 8), (_13508, 8), (_13507, 8), (_13506, 8), (_13505, 8), (_13504, 8), (_13503, 8), (_13502, 8), (_13501, 8), (_13500, 8), (_13854, 8), (_13853, 8), (_13852, 8), (_13851, 8), (_13850, 8), (_13849, 8), (_13848, 8), (_13847, 8), (_13846, 8), (_13845, 8), (_13844, 8), (_13843, 8), (_13842, 8), (_13841, 8), (_13840, 8), (_13839, 8), (_13838, 8), (_13837, 8), (_13836, 8), (_13835, 8), (_13834, 8), (_13833, 8), (_13832, 8), (_13831, 8), (_13830, 8), (_13829, 8), (_13828, 8), (_13827, 8), (_13826, 8), (_13825, 8), (_13824, 8), (_13823, 8), (_14177, 8), (_14176, 8), (_14175, 8), (_14174, 8), (_14173, 8), (_14172, 8), (_14171, 8), (_14170, 8), (_14169, 8), (_14168, 8), (_14167, 8), (_14166, 8), (_14165, 8), (_14164, 8), (_14163, 8), (_14162, 8), (_14161, 8), (_14160, 8), (_14159, 8), (_14158, 8), (_14157, 8), (_14156, 8), (_14155, 8), (_14154, 8), (_14153, 8), (_14152, 8), (_14151, 8), (_14150, 8), (_14149, 8), (_14148, 8), (_14147, 8), (_14146, 8), (_14500, 8), (_14499, 8), (_14498, 8), (_14497, 8), (_14496, 8), (_14495, 8), (_14494, 8), (_14493, 8), (_14492, 8), (_14491, 8), (_14490, 8), (_14489, 8), (_14488, 8), (_14487, 8), (_14486, 8), (_14485, 8), (_14484, 8), (_14483, 8), (_14482, 8), (_14481, 8), (_14480, 8), (_14479, 8), (_14478, 8), (_14477, 8), (_14476, 8), (_14475, 8), (_14474, 8), (_14473, 8), (_14472, 8), (_14471, 8), (_14470, 8), (_14469, 8), (_14823, 8), (_14822, 8), (_14821, 8), (_14820, 8), (_14819, 8), (_14818, 8), (_14817, 8), (_14816, 8), (_14815, 8), (_14814, 8), (_14813, 8), (_14812, 8), (_14811, 8), (_14810, 8), (_14809, 8), (_14808, 8), (_14807, 8), (_14806, 8), (_14805, 8), (_14804, 8), (_14803, 8), (_14802, 8), (_14801, 8), (_14800, 8), (_14799, 8), (_14798, 8), (_14797, 8), (_14796, 8), (_14795, 8), (_14794, 8), (_14793, 8), (_14792, 8), (_15146, 8), (_15145, 8), (_15144, 8), (_15143, 8), (_15142, 8), (_15141, 8), (_15140, 8), (_15139, 8), (_15138, 8), (_15137, 8), (_15136, 8), (_15135, 8), (_15134, 8), (_15133, 8), (_15132, 8), (_15131, 8), (_15130, 8), (_15129, 8), (_15128, 8), (_15127, 8), (_15126, 8), (_15125, 8), (_15124, 8), (_15123, 8), (_15122, 8), (_15121, 8), (_15120, 8), (_15119, 8), (_15118, 8), (_15117, 8), (_15116, 8), (_15115, 8), (_15469, 8), (_15468, 8), (_15467, 8), (_15466, 8), (_15465, 8), (_15464, 8), (_15463, 8), (_15462, 8), (_15461, 8), (_15460, 8), (_15459, 8), (_15458, 8), (_15457, 8), (_15456, 8), (_15455, 8), (_15454, 8), (_15453, 8), (_15452, 8), (_15451, 8), (_15450, 8), (_15449, 8), (_15448, 8), (_15447, 8), (_15446, 8), (_15445, 8), (_15444, 8), (_15443, 8), (_15442, 8), (_15441, 8), (_15440, 8), (_15439, 8), (_15438, 8), (_15792, 8), (_15791, 8), (_15790, 8), (_15789, 8), (_15788, 8), (_15787, 8), (_15786, 8), (_15785, 8), (_15784, 8), (_15783, 8), (_15782, 8), (_15781, 8), (_15780, 8), (_15779, 8), (_15778, 8), (_15777, 8), (_15776, 8), (_15775, 8), (_15774, 8), (_15773, 8), (_15772, 8), (_15771, 8), (_15770, 8), (_15769, 8), (_15768, 8), (_15767, 8), (_15766, 8), (_15765, 8), (_15764, 8), (_15763, 8), (_15762, 8), (_15761, 8), (_16115, 8), (_16114, 8), (_16113, 8), (_16112, 8), (_16111, 8), (_16110, 8), (_16109, 8), (_16108, 8), (_16107, 8), (_16106, 8), (_16105, 8), (_16104, 8), (_16103, 8), (_16102, 8), (_16101, 8), (_16100, 8), (_16099, 8), (_16098, 8), (_16097, 8), (_16096, 8), (_16095, 8), (_16094, 8), (_16093, 8), (_16092, 8), (_16091, 8), (_16090, 8), (_16089, 8), (_16088, 8), (_16087, 8), (_16086, 8), (_16085, 8), (_16084, 8), (_16438, 8), (_16437, 8), (_16436, 8), (_16435, 8), (_16434, 8), (_16433, 8), (_16432, 8), (_16431, 8), (_16430, 8), (_16429, 8), (_16428, 8), (_16427, 8), (_16426, 8), (_16425, 8), (_16424, 8), (_16423, 8), (_16422, 8), (_16421, 8), (_16420, 8), (_16419, 8), (_16418, 8), (_16417, 8), (_16416, 8), (_16415, 8), (_16414, 8), (_16413, 8), (_16412, 8), (_16411, 8), (_16410, 8), (_16409, 8), (_16408, 8), (_16407, 8), (_16761, 8), (_16760, 8), (_16759, 8), (_16758, 8), (_16757, 8), (_16756, 8), (_16755, 8), (_16754, 8), (_16753, 8), (_16752, 8), (_16751, 8), (_16750, 8), (_16749, 8), (_16748, 8), (_16747, 8), (_16746, 8), (_16745, 8), (_16744, 8), (_16743, 8), (_16742, 8), (_16741, 8), (_16740, 8), (_16739, 8), (_16738, 8), (_16737, 8), (_16736, 8), (_16735, 8), (_16734, 8), (_16733, 8), (_16732, 8), (_16731, 8), (_16730, 8), (_17084, 8), (_17083, 8), (_17082, 8), (_17081, 8), (_17080, 8), (_17079, 8), (_17078, 8), (_17077, 8), (_17076, 8), (_17075, 8), (_17074, 8), (_17073, 8), (_17072, 8), (_17071, 8), (_17070, 8), (_17069, 8), (_17068, 8), (_17067, 8), (_17066, 8), (_17065, 8), (_17064, 8), (_17063, 8), (_17062, 8), (_17061, 8), (_17060, 8), (_17059, 8), (_17058, 8), (_17057, 8), (_17056, 8), (_17055, 8), (_17054, 8), (_17053, 8), (_17407, 8), (_17406, 8), (_17405, 8), (_17404, 8), (_17403, 8), (_17402, 8), (_17401, 8), (_17400, 8), (_17399, 8), (_17398, 8), (_17397, 8), (_17396, 8), (_17395, 8), (_17394, 8), (_17393, 8), (_17392, 8), (_17391, 8), (_17390, 8), (_17389, 8), (_17388, 8), (_17387, 8), (_17386, 8), (_17385, 8), (_17384, 8), (_17383, 8), (_17382, 8), (_17381, 8), (_17380, 8), (_17379, 8), (_17378, 8), (_17377, 8), (_17376, 8), (_17730, 8), (_17729, 8), (_17728, 8), (_17727, 8), (_17726, 8), (_17725, 8), (_17724, 8), (_17723, 8), (_17722, 8), (_17721, 8), (_17720, 8), (_17719, 8), (_17718, 8), (_17717, 8), (_17716, 8), (_17715, 8), (_17714, 8), (_17713, 8), (_17712, 8), (_17711, 8), (_17710, 8), (_17709, 8), (_17708, 8), (_17707, 8), (_17706, 8), (_17705, 8), (_17704, 8), (_17703, 8), (_17702, 8), (_17701, 8), (_17700, 8), (_17699, 8), (_18053, 8), (_18052, 8), (_18051, 8), (_18050, 8), (_18049, 8), (_18048, 8), (_18047, 8), (_18046, 8), (_18045, 8), (_18044, 8), (_18043, 8), (_18042, 8), (_18041, 8), (_18040, 8), (_18039, 8), (_18038, 8), (_18037, 8), (_18036, 8), (_18035, 8), (_18034, 8), (_18033, 8), (_18032, 8), (_18031, 8), (_18030, 8), (_18029, 8), (_18028, 8), (_18027, 8), (_18026, 8), (_18025, 8), (_18024, 8), (_18023, 8), (_18022, 8), (_18376, 8), (_18375, 8), (_18374, 8), (_18373, 8), (_18372, 8), (_18371, 8), (_18370, 8), (_18369, 8), (_18368, 8), (_18367, 8), (_18366, 8), (_18365, 8), (_18364, 8), (_18363, 8), (_18362, 8), (_18361, 8), (_18360, 8), (_18359, 8), (_18358, 8), (_18357, 8), (_18356, 8), (_18355, 8), (_18354, 8), (_18353, 8), (_18352, 8), (_18351, 8), (_18350, 8), (_18349, 8), (_18348, 8), (_18347, 8), (_18346, 8), (_18345, 8), (_18699, 8), (_18698, 8), (_18697, 8), (_18696, 8), (_18695, 8), (_18694, 8), (_18693, 8), (_18692, 8), (_18691, 8), (_18690, 8), (_18689, 8), (_18688, 8), (_18687, 8), (_18686, 8), (_18685, 8), (_18684, 8), (_18683, 8), (_18682, 8), (_18681, 8), (_18680, 8), (_18679, 8), (_18678, 8), (_18677, 8), (_18676, 8), (_18675, 8), (_18674, 8), (_18673, 8), (_18672, 8), (_18671, 8), (_18670, 8), (_18669, 8), (_18668, 8), (_19022, 8), (_19021, 8), (_19020, 8), (_19019, 8), (_19018, 8), (_19017, 8), (_19016, 8), (_19015, 8), (_19014, 8), (_19013, 8), (_19012, 8), (_19011, 8), (_19010, 8), (_19009, 8), (_19008, 8), (_19007, 8), (_19006, 8), (_19005, 8), (_19004, 8), (_19003, 8), (_19002, 8), (_19001, 8), (_19000, 8), (_18999, 8), (_18998, 8), (_18997, 8), (_18996, 8), (_18995, 8), (_18994, 8), (_18993, 8), (_18992, 8), (_18991, 8), (_19345, 8), (_19344, 8), (_19343, 8), (_19342, 8), (_19341, 8), (_19340, 8), (_19339, 8), (_19338, 8), (_19337, 8), (_19336, 8), (_19335, 8), (_19334, 8), (_19333, 8), (_19332, 8), (_19331, 8), (_19330, 8), (_19329, 8), (_19328, 8), (_19327, 8), (_19326, 8), (_19325, 8), (_19324, 8), (_19323, 8), (_19322, 8), (_19321, 8), (_19320, 8), (_19319, 8), (_19318, 8), (_19317, 8), (_19316, 8), (_19315, 8), (_19314, 8), (_19668, 8), (_19667, 8), (_19666, 8), (_19665, 8), (_19664, 8), (_19663, 8), (_19662, 8), (_19661, 8), (_19660, 8), (_19659, 8), (_19658, 8), (_19657, 8), (_19656, 8), (_19655, 8), (_19654, 8), (_19653, 8), (_19652, 8), (_19651, 8), (_19650, 8), (_19649, 8), (_19648, 8), (_19647, 8), (_19646, 8), (_19645, 8), (_19644, 8), (_19643, 8), (_19642, 8), (_19641, 8), (_19640, 8), (_19639, 8), (_19638, 8), (_19637, 8), (_19991, 8), (_19990, 8), (_19989, 8), (_19988, 8), (_19987, 8), (_19986, 8), (_19985, 8), (_19984, 8), (_19983, 8), (_19982, 8), (_19981, 8), (_19980, 8), (_19979, 8), (_19978, 8), (_19977, 8), (_19976, 8), (_19975, 8), (_19974, 8), (_19973, 8), (_19972, 8), (_19971, 8), (_19970, 8), (_19969, 8), (_19968, 8), (_19967, 8), (_19966, 8), (_19965, 8), (_19964, 8), (_19963, 8), (_19962, 8), (_19961, 8), (_19960, 8), (_20314, 8), (_20313, 8), (_20312, 8), (_20311, 8), (_20310, 8), (_20309, 8), (_20308, 8), (_20307, 8), (_20306, 8), (_20305, 8), (_20304, 8), (_20303, 8), (_20302, 8), (_20301, 8), (_20300, 8), (_20299, 8), (_20298, 8), (_20297, 8), (_20296, 8), (_20295, 8), (_20294, 8), (_20293, 8), (_20292, 8), (_20291, 8), (_20290, 8), (_20289, 8), (_20288, 8), (_20287, 8), (_20286, 8), (_20285, 8), (_20284, 8), (_20283, 8), (_20637, 8), (_20636, 8), (_20635, 8), (_20634, 8), (_20633, 8), (_20632, 8), (_20631, 8), (_20630, 8), (_20629, 8), (_20628, 8), (_20627, 8), (_20626, 8), (_20625, 8), (_20624, 8), (_20623, 8), (_20622, 8), (_20621, 8), (_20620, 8), (_20619, 8), (_20618, 8), (_20617, 8), (_20616, 8), (_20615, 8), (_20614, 8), (_20613, 8), (_20612, 8), (_20611, 8), (_20610, 8), (_20609, 8), (_20608, 8), (_20607, 8), (_20606, 8), (_20960, 8), (_20959, 8), (_20958, 8), (_20957, 8), (_20956, 8), (_20955, 8), (_20954, 8), (_20953, 8), (_20952, 8), (_20951, 8), (_20950, 8), (_20949, 8), (_20948, 8), (_20947, 8), (_20946, 8), (_20945, 8), (_20944, 8), (_20943, 8), (_20942, 8), (_20941, 8), (_20940, 8), (_20939, 8), (_20938, 8), (_20937, 8), (_20936, 8), (_20935, 8), (_20934, 8), (_20933, 8), (_20932, 8), (_20931, 8), (_20930, 8), (_20929, 8), (_21283, 8), (_21282, 8), (_21281, 8), (_21280, 8), (_21279, 8), (_21278, 8), (_21277, 8), (_21276, 8), (_21275, 8), (_21274, 8), (_21273, 8), (_21272, 8), (_21271, 8), (_21270, 8), (_21269, 8), (_21268, 8), (_21267, 8), (_21266, 8), (_21265, 8), (_21264, 8), (_21263, 8), (_21262, 8), (_21261, 8), (_21260, 8), (_21259, 8), (_21258, 8), (_21257, 8), (_21256, 8), (_21255, 8), (_21254, 8), (_21253, 8), (_21252, 8), (_21606, 8), (_21605, 8), (_21604, 8), (_21603, 8), (_21602, 8), (_21601, 8), (_21600, 8), (_21599, 8), (_21598, 8), (_21597, 8), (_21596, 8), (_21595, 8), (_21594, 8), (_21593, 8), (_21592, 8), (_21591, 8), (_21590, 8), (_21589, 8), (_21588, 8), (_21587, 8), (_21586, 8), (_21585, 8), (_21584, 8), (_21583, 8), (_21582, 8), (_21581, 8), (_21580, 8), (_21579, 8), (_21578, 8), (_21577, 8), (_21576, 8), (_21575, 8), (_21929, 8), (_21928, 8), (_21927, 8), (_21926, 8), (_21925, 8), (_21924, 8), (_21923, 8), (_21922, 8), (_21921, 8), (_21920, 8), (_21919, 8), (_21918, 8), (_21917, 8), (_21916, 8), (_21915, 8), (_21914, 8), (_21913, 8), (_21912, 8), (_21911, 8), (_21910, 8), (_21909, 8), (_21908, 8), (_21907, 8), (_21906, 8), (_21905, 8), (_21904, 8), (_21903, 8), (_21902, 8), (_21901, 8), (_21900, 8), (_21899, 8), (_21898, 8), (_22252, 8), (_22251, 8), (_22250, 8), (_22249, 8), (_22248, 8), (_22247, 8), (_22246, 8), (_22245, 8), (_22244, 8), (_22243, 8), (_22242, 8), (_22241, 8), (_22240, 8), (_22239, 8), (_22238, 8), (_22237, 8), (_22236, 8), (_22235, 8), (_22234, 8), (_22233, 8), (_22232, 8), (_22231, 8), (_22230, 8), (_22229, 8), (_22228, 8), (_22227, 8), (_22226, 8), (_22225, 8), (_22224, 8), (_22223, 8), (_22222, 8), (_22221, 8), (_22575, 8), (_22574, 8), (_22573, 8), (_22572, 8), (_22571, 8), (_22570, 8), (_22569, 8), (_22568, 8), (_22567, 8), (_22566, 8), (_22565, 8), (_22564, 8), (_22563, 8), (_22562, 8), (_22561, 8), (_22560, 8), (_22559, 8), (_22558, 8), (_22557, 8), (_22556, 8), (_22555, 8), (_22554, 8), (_22553, 8), (_22552, 8), (_22551, 8), (_22550, 8), (_22549, 8), (_22548, 8), (_22547, 8), (_22546, 8), (_22545, 8), (_22544, 8), (_22898, 8), (_22897, 8), (_22896, 8), (_22895, 8), (_22894, 8), (_22893, 8), (_22892, 8), (_22891, 8), (_22890, 8), (_22889, 8), (_22888, 8), (_22887, 8), (_22886, 8), (_22885, 8), (_22884, 8), (_22883, 8), (_22882, 8), (_22881, 8), (_22880, 8), (_22879, 8), (_22878, 8), (_22877, 8), (_22876, 8), (_22875, 8), (_22874, 8), (_22873, 8), (_22872, 8), (_22871, 8), (_22870, 8), (_22869, 8), (_22868, 8), (_22867, 8), (_23221, 8), (_23220, 8), (_23219, 8), (_23218, 8), (_23217, 8), (_23216, 8), (_23215, 8), (_23214, 8), (_23213, 8), (_23212, 8), (_23211, 8), (_23210, 8), (_23209, 8), (_23208, 8), (_23207, 8), (_23206, 8), (_23205, 8), (_23204, 8), (_23203, 8), (_23202, 8), (_23201, 8), (_23200, 8), (_23199, 8), (_23198, 8), (_23197, 8), (_23196, 8), (_23195, 8), (_23194, 8), (_23193, 8), (_23192, 8), (_23191, 8), (_23190, 8), (_23544, 8), (_23543, 8), (_23542, 8), (_23541, 8), (_23540, 8), (_23539, 8), (_23538, 8), (_23537, 8), (_23536, 8), (_23535, 8), (_23534, 8), (_23533, 8), (_23532, 8), (_23531, 8), (_23530, 8), (_23529, 8), (_23528, 8), (_23527, 8), (_23526, 8), (_23525, 8), (_23524, 8), (_23523, 8), (_23522, 8), (_23521, 8), (_23520, 8), (_23519, 8), (_23518, 8), (_23517, 8), (_23516, 8), (_23515, 8), (_23514, 8), (_23513, 8), (_23867, 8), (_23866, 8), (_23865, 8), (_23864, 8), (_23863, 8), (_23862, 8), (_23861, 8), (_23860, 8), (_23859, 8), (_23858, 8), (_23857, 8), (_23856, 8), (_23855, 8), (_23854, 8), (_23853, 8), (_23852, 8), (_23851, 8), (_23850, 8), (_23849, 8), (_23848, 8), (_23847, 8), (_23846, 8), (_23845, 8), (_23844, 8), (_23843, 8), (_23842, 8), (_23841, 8), (_23840, 8), (_23839, 8), (_23838, 8), (_23837, 8), (_23836, 8), (_24190, 8), (_24189, 8), (_24188, 8), (_24187, 8), (_24186, 8), (_24185, 8), (_24184, 8), (_24183, 8), (_24182, 8), (_24181, 8), (_24180, 8), (_24179, 8), (_24178, 8), (_24177, 8), (_24176, 8), (_24175, 8), (_24174, 8), (_24173, 8), (_24172, 8), (_24171, 8), (_24170, 8), (_24169, 8), (_24168, 8), (_24167, 8), (_24166, 8), (_24165, 8), (_24164, 8), (_24163, 8), (_24162, 8), (_24161, 8), (_24160, 8), (_24159, 8), (_24513, 8), (_24512, 8), (_24511, 8), (_24510, 8), (_24509, 8), (_24508, 8), (_24507, 8), (_24506, 8), (_24505, 8), (_24504, 8), (_24503, 8), (_24502, 8), (_24501, 8), (_24500, 8), (_24499, 8), (_24498, 8), (_24497, 8), (_24496, 8), (_24495, 8), (_24494, 8), (_24493, 8), (_24492, 8), (_24491, 8), (_24490, 8), (_24489, 8), (_24488, 8), (_24487, 8), (_24486, 8), (_24485, 8), (_24484, 8), (_24483, 8), (_24482, 8), (_24836, 8), (_24835, 8), (_24834, 8), (_24833, 8), (_24832, 8), (_24831, 8), (_24830, 8), (_24829, 8), (_24828, 8), (_24827, 8), (_24826, 8), (_24825, 8), (_24824, 8), (_24823, 8), (_24822, 8), (_24821, 8), (_24820, 8), (_24819, 8), (_24818, 8), (_24817, 8), (_24816, 8), (_24815, 8), (_24814, 8), (_24813, 8), (_24812, 8), (_24811, 8), (_24810, 8), (_24809, 8), (_24808, 8), (_24807, 8), (_24806, 8), (_24805, 8), (_25159, 8), (_25158, 8), (_25157, 8), (_25156, 8), (_25155, 8), (_25154, 8), (_25153, 8), (_25152, 8), (_25151, 8), (_25150, 8), (_25149, 8), (_25148, 8), (_25147, 8), (_25146, 8), (_25145, 8), (_25144, 8), (_25143, 8), (_25142, 8), (_25141, 8), (_25140, 8), (_25139, 8), (_25138, 8), (_25137, 8), (_25136, 8), (_25135, 8), (_25134, 8), (_25133, 8), (_25132, 8), (_25131, 8), (_25130, 8), (_25129, 8), (_25128, 8), (_25482, 8), (_25481, 8), (_25480, 8), (_25479, 8), (_25478, 8), (_25477, 8), (_25476, 8), (_25475, 8), (_25474, 8), (_25473, 8), (_25472, 8), (_25471, 8), (_25470, 8), (_25469, 8), (_25468, 8), (_25467, 8), (_25466, 8), (_25465, 8), (_25464, 8), (_25463, 8), (_25462, 8), (_25461, 8), (_25460, 8), (_25459, 8), (_25458, 8), (_25457, 8), (_25456, 8), (_25455, 8), (_25454, 8), (_25453, 8), (_25452, 8), (_25451, 8), (_25805, 8), (_25804, 8), (_25803, 8), (_25802, 8), (_25801, 8), (_25800, 8), (_25799, 8), (_25798, 8), (_25797, 8), (_25796, 8), (_25795, 8), (_25794, 8), (_25793, 8), (_25792, 8), (_25791, 8), (_25790, 8), (_25789, 8), (_25788, 8), (_25787, 8), (_25786, 8), (_25785, 8), (_25784, 8), (_25783, 8), (_25782, 8), (_25781, 8), (_25780, 8), (_25779, 8), (_25778, 8), (_25777, 8), (_25776, 8), (_25775, 8), (_25774, 8), (_26128, 8), (_26127, 8), (_26126, 8), (_26125, 8), (_26124, 8), (_26123, 8), (_26122, 8), (_26121, 8), (_26120, 8), (_26119, 8), (_26118, 8), (_26117, 8), (_26116, 8), (_26115, 8), (_26114, 8), (_26113, 8), (_26112, 8), (_26111, 8), (_26110, 8), (_26109, 8), (_26108, 8), (_26107, 8), (_26106, 8), (_26105, 8), (_26104, 8), (_26103, 8), (_26102, 8), (_26101, 8), (_26100, 8), (_26099, 8), (_26098, 8), (_26097, 8), (_26451, 8), (_26450, 8), (_26449, 8), (_26448, 8), (_26447, 8), (_26446, 8), (_26445, 8), (_26444, 8), (_26443, 8), (_26442, 8), (_26441, 8), (_26440, 8), (_26439, 8), (_26438, 8), (_26437, 8), (_26436, 8), (_26435, 8), (_26434, 8), (_26433, 8), (_26432, 8), (_26431, 8), (_26430, 8), (_26429, 8), (_26428, 8), (_26427, 8), (_26426, 8), (_26425, 8), (_26424, 8), (_26423, 8), (_26422, 8), (_26421, 8), (_26420, 8), (_26774, 8), (_26773, 8), (_26772, 8), (_26771, 8), (_26770, 8), (_26769, 8), (_26768, 8), (_26767, 8), (_26766, 8), (_26765, 8), (_26764, 8), (_26763, 8), (_26762, 8), (_26761, 8), (_26760, 8), (_26759, 8), (_26758, 8), (_26757, 8), (_26756, 8), (_26755, 8), (_26754, 8), (_26753, 8), (_26752, 8), (_26751, 8), (_26750, 8), (_26749, 8), (_26748, 8), (_26747, 8), (_26746, 8), (_26745, 8), (_26744, 8), (_26743, 8), (_27097, 8), (_27096, 8), (_27095, 8), (_27094, 8), (_27093, 8), (_27092, 8), (_27091, 8), (_27090, 8), (_27089, 8), (_27088, 8), (_27087, 8), (_27086, 8), (_27085, 8), (_27084, 8), (_27083, 8), (_27082, 8), (_27081, 8), (_27080, 8), (_27079, 8), (_27078, 8), (_27077, 8), (_27076, 8), (_27075, 8), (_27074, 8), (_27073, 8), (_27072, 8), (_27071, 8), (_27070, 8), (_27069, 8), (_27068, 8), (_27067, 8), (_27066, 8), (_27420, 8), (_27419, 8), (_27418, 8), (_27417, 8), (_27416, 8), (_27415, 8), (_27414, 8), (_27413, 8), (_27412, 8), (_27411, 8), (_27410, 8), (_27409, 8), (_27408, 8), (_27407, 8), (_27406, 8), (_27405, 8), (_27404, 8), (_27403, 8), (_27402, 8), (_27401, 8), (_27400, 8), (_27399, 8), (_27398, 8), (_27397, 8), (_27396, 8), (_27395, 8), (_27394, 8), (_27393, 8), (_27392, 8), (_27391, 8), (_27390, 8), (_27389, 8), (_27743, 8), (_27742, 8), (_27741, 8), (_27740, 8), (_27739, 8), (_27738, 8), (_27737, 8), (_27736, 8), (_27735, 8), (_27734, 8), (_27733, 8), (_27732, 8), (_27731, 8), (_27730, 8), (_27729, 8), (_27728, 8), (_27727, 8), (_27726, 8), (_27725, 8), (_27724, 8), (_27723, 8), (_27722, 8), (_27721, 8), (_27720, 8), (_27719, 8), (_27718, 8), (_27717, 8), (_27716, 8), (_27715, 8), (_27714, 8), (_27713, 8), (_27712, 8), (_28066, 8), (_28065, 8), (_28064, 8), (_28063, 8), (_28062, 8), (_28061, 8), (_28060, 8), (_28059, 8), (_28058, 8), (_28057, 8), (_28056, 8), (_28055, 8), (_28054, 8), (_28053, 8), (_28052, 8), (_28051, 8), (_28050, 8), (_28049, 8), (_28048, 8), (_28047, 8), (_28046, 8), (_28045, 8), (_28044, 8), (_28043, 8), (_28042, 8), (_28041, 8), (_28040, 8), (_28039, 8), (_28038, 8), (_28037, 8), (_28036, 8), (_28035, 8), (_28389, 8), (_28388, 8), (_28387, 8), (_28386, 8), (_28385, 8), (_28384, 8), (_28383, 8), (_28382, 8), (_28381, 8), (_28380, 8), (_28379, 8), (_28378, 8), (_28377, 8), (_28376, 8), (_28375, 8), (_28374, 8), (_28373, 8), (_28372, 8), (_28371, 8), (_28370, 8), (_28369, 8), (_28368, 8), (_28367, 8), (_28366, 8), (_28365, 8), (_28364, 8), (_28363, 8), (_28362, 8), (_28361, 8), (_28360, 8), (_28359, 8), (_28358, 8), (_28712, 8), (_28711, 8), (_28710, 8), (_28709, 8), (_28708, 8), (_28707, 8), (_28706, 8), (_28705, 8), (_28704, 8), (_28703, 8), (_28702, 8), (_28701, 8), (_28700, 8), (_28699, 8), (_28698, 8), (_28697, 8), (_28696, 8), (_28695, 8), (_28694, 8), (_28693, 8), (_28692, 8), (_28691, 8), (_28690, 8), (_28689, 8), (_28688, 8), (_28687, 8), (_28686, 8), (_28685, 8), (_28684, 8), (_28683, 8), (_28682, 8), (_28681, 8), (_29035, 8), (_29034, 8), (_29033, 8), (_29032, 8), (_29031, 8), (_29030, 8), (_29029, 8), (_29028, 8), (_29027, 8), (_29026, 8), (_29025, 8), (_29024, 8), (_29023, 8), (_29022, 8), (_29021, 8), (_29020, 8), (_29019, 8), (_29018, 8), (_29017, 8), (_29016, 8), (_29015, 8), (_29014, 8), (_29013, 8), (_29012, 8), (_29011, 8), (_29010, 8), (_29009, 8), (_29008, 8), (_29007, 8), (_29006, 8), (_29005, 8), (_29004, 8), (_29358, 8), (_29357, 8), (_29356, 8), (_29355, 8), (_29354, 8), (_29353, 8), (_29352, 8), (_29351, 8), (_29350, 8), (_29349, 8), (_29348, 8), (_29347, 8), (_29346, 8), (_29345, 8), (_29344, 8), (_29343, 8), (_29342, 8), (_29341, 8), (_29340, 8), (_29339, 8), (_29338, 8), (_29337, 8), (_29336, 8), (_29335, 8), (_29334, 8), (_29333, 8), (_29332, 8), (_29331, 8), (_29330, 8), (_29329, 8), (_29328, 8), (_29327, 8), (_29681, 8), (_29680, 8), (_29679, 8), (_29678, 8), (_29677, 8), (_29676, 8), (_29675, 8), (_29674, 8), (_29673, 8), (_29672, 8), (_29671, 8), (_29670, 8), (_29669, 8), (_29668, 8), (_29667, 8), (_29666, 8), (_29665, 8), (_29664, 8), (_29663, 8), (_29662, 8), (_29661, 8), (_29660, 8), (_29659, 8), (_29658, 8), (_29657, 8), (_29656, 8), (_29655, 8), (_29654, 8), (_29653, 8), (_29652, 8), (_29651, 8), (_29650, 8), (_30004, 8), (_30003, 8), (_30002, 8), (_30001, 8), (_30000, 8), (_29999, 8), (_29998, 8), (_29997, 8), (_29996, 8), (_29995, 8), (_29994, 8), (_29993, 8), (_29992, 8), (_29991, 8), (_29990, 8), (_29989, 8), (_29988, 8), (_29987, 8), (_29986, 8), (_29985, 8), (_29984, 8), (_29983, 8), (_29982, 8), (_29981, 8), (_29980, 8), (_29979, 8), (_29978, 8), (_29977, 8), (_29976, 8), (_29975, 8), (_29974, 8), (_29973, 8), (_30327, 8), (_30326, 8), (_30325, 8), (_30324, 8), (_30323, 8), (_30322, 8), (_30321, 8), (_30320, 8), (_30319, 8), (_30318, 8), (_30317, 8), (_30316, 8), (_30315, 8), (_30314, 8), (_30313, 8), (_30312, 8), (_30311, 8), (_30310, 8), (_30309, 8), (_30308, 8), (_30307, 8), (_30306, 8), (_30305, 8), (_30304, 8), (_30303, 8), (_30302, 8), (_30301, 8), (_30300, 8), (_30299, 8), (_30298, 8), (_30297, 8), (_30296, 8), (_30650, 8), (_30649, 8), (_30648, 8), (_30647, 8), (_30646, 8), (_30645, 8), (_30644, 8), (_30643, 8), (_30642, 8), (_30641, 8), (_30640, 8), (_30639, 8), (_30638, 8), (_30637, 8), (_30636, 8), (_30635, 8), (_30634, 8), (_30633, 8), (_30632, 8), (_30631, 8), (_30630, 8), (_30629, 8), (_30628, 8), (_30627, 8), (_30626, 8), (_30625, 8), (_30624, 8), (_30623, 8), (_30622, 8), (_30621, 8), (_30620, 8), (_30619, 8), (_30973, 8), (_30972, 8), (_30971, 8), (_30970, 8), (_30969, 8), (_30968, 8), (_30967, 8), (_30966, 8), (_30965, 8), (_30964, 8), (_30963, 8), (_30962, 8), (_30961, 8), (_30960, 8), (_30959, 8), (_30958, 8), (_30957, 8), (_30956, 8), (_30955, 8), (_30954, 8), (_30953, 8), (_30952, 8), (_30951, 8), (_30950, 8), (_30949, 8), (_30948, 8), (_30947, 8), (_30946, 8), (_30945, 8), (_30944, 8), (_30943, 8), (_30942, 8), (_31296, 8), (_31295, 8), (_31294, 8), (_31293, 8), (_31292, 8), (_31291, 8), (_31290, 8), (_31289, 8), (_31288, 8), (_31287, 8), (_31286, 8), (_31285, 8), (_31284, 8), (_31283, 8), (_31282, 8), (_31281, 8), (_31280, 8), (_31279, 8), (_31278, 8), (_31277, 8), (_31276, 8), (_31275, 8), (_31274, 8), (_31273, 8), (_31272, 8), (_31271, 8), (_31270, 8), (_31269, 8), (_31268, 8), (_31267, 8), (_31266, 8), (_31265, 8), (_31619, 8), (_31618, 8), (_31617, 8), (_31616, 8), (_31615, 8), (_31614, 8), (_31613, 8), (_31612, 8), (_31611, 8), (_31610, 8), (_31609, 8), (_31608, 8), (_31607, 8), (_31606, 8), (_31605, 8), (_31604, 8), (_31603, 8), (_31602, 8), (_31601, 8), (_31600, 8), (_31599, 8), (_31598, 8), (_31597, 8), (_31596, 8), (_31595, 8), (_31594, 8), (_31593, 8), (_31592, 8), (_31591, 8), (_31590, 8), (_31589, 8), (_31588, 8), (_31942, 8), (_31941, 8), (_31940, 8), (_31939, 8), (_31938, 8), (_31937, 8), (_31936, 8), (_31935, 8), (_31934, 8), (_31933, 8), (_31932, 8), (_31931, 8), (_31930, 8), (_31929, 8), (_31928, 8), (_31927, 8), (_31926, 8), (_31925, 8), (_31924, 8), (_31923, 8), (_31922, 8), (_31921, 8), (_31920, 8), (_31919, 8), (_31918, 8), (_31917, 8), (_31916, 8), (_31915, 8), (_31914, 8), (_31913, 8), (_31912, 8), (_31911, 8), (_32265, 8), (_32264, 8), (_32263, 8), (_32262, 8), (_32261, 8), (_32260, 8), (_32259, 8), (_32258, 8), (_32257, 8), (_32256, 8), (_32255, 8), (_32254, 8), (_32253, 8), (_32252, 8), (_32251, 8), (_32250, 8), (_32249, 8), (_32248, 8), (_32247, 8), (_32246, 8), (_32245, 8), (_32244, 8), (_32243, 8), (_32242, 8), (_32241, 8), (_32240, 8), (_32239, 8), (_32238, 8), (_32237, 8), (_32236, 8), (_32235, 8), (_32234, 8), (_32588, 8), (_32587, 8), (_32586, 8), (_32585, 8), (_32584, 8), (_32583, 8), (_32582, 8), (_32581, 8), (_32580, 8), (_32579, 8), (_32578, 8), (_32577, 8), (_32576, 8), (_32575, 8), (_32574, 8), (_32573, 8), (_32572, 8), (_32571, 8), (_32570, 8), (_32569, 8), (_32568, 8), (_32567, 8), (_32566, 8), (_32565, 8), (_32564, 8), (_32563, 8), (_32562, 8), (_32561, 8), (_32560, 8), (_32559, 8), (_32558, 8), (_32557, 8), (_32911, 8), (_32910, 8), (_32909, 8), (_32908, 8), (_32907, 8), (_32906, 8), (_32905, 8), (_32904, 8), (_32903, 8), (_32902, 8), (_32901, 8), (_32900, 8), (_32899, 8), (_32898, 8), (_32897, 8), (_32896, 8), (_32895, 8), (_32894, 8), (_32893, 8), (_32892, 8), (_32891, 8), (_32890, 8), (_32889, 8), (_32888, 8), (_32887, 8), (_32886, 8), (_32885, 8), (_32884, 8), (_32883, 8), (_32882, 8), (_32881, 8), (_32880, 8), (_33234, 8), (_33233, 8), (_33232, 8), (_33231, 8), (_33230, 8), (_33229, 8), (_33228, 8), (_33227, 8), (_33226, 8), (_33225, 8), (_33224, 8), (_33223, 8), (_33222, 8), (_33221, 8), (_33220, 8), (_33219, 8), (_33218, 8), (_33217, 8), (_33216, 8), (_33215, 8), (_33214, 8), (_33213, 8), (_33212, 8), (_33211, 8), (_33210, 8), (_33209, 8), (_33208, 8), (_33207, 8), (_33206, 8), (_33205, 8), (_33204, 8), (_33203, 8), (_33557, 8), (_33556, 8), (_33555, 8), (_33554, 8), (_33553, 8), (_33552, 8), (_33551, 8), (_33550, 8), (_33549, 8), (_33548, 8), (_33547, 8), (_33546, 8), (_33545, 8), (_33544, 8), (_33543, 8), (_33542, 8), (_33541, 8), (_33540, 8), (_33539, 8), (_33538, 8), (_33537, 8), (_33536, 8), (_33535, 8), (_33534, 8), (_33533, 8), (_33532, 8), (_33531, 8), (_33530, 8), (_33529, 8), (_33528, 8), (_33527, 8), (_33526, 8), (_33880, 8), (_33879, 8), (_33878, 8), (_33877, 8), (_33876, 8), (_33875, 8), (_33874, 8), (_33873, 8), (_33872, 8), (_33871, 8), (_33870, 8), (_33869, 8), (_33868, 8), (_33867, 8), (_33866, 8), (_33865, 8), (_33864, 8), (_33863, 8), (_33862, 8), (_33861, 8), (_33860, 8), (_33859, 8), (_33858, 8), (_33857, 8), (_33856, 8), (_33855, 8), (_33854, 8), (_33853, 8), (_33852, 8), (_33851, 8), (_33850, 8), (_33849, 8), (_34203, 8), (_34202, 8), (_34201, 8), (_34200, 8), (_34199, 8), (_34198, 8), (_34197, 8), (_34196, 8), (_34195, 8), (_34194, 8), (_34193, 8), (_34192, 8), (_34191, 8), (_34190, 8), (_34189, 8), (_34188, 8), (_34187, 8), (_34186, 8), (_34185, 8), (_34184, 8), (_34183, 8), (_34182, 8), (_34181, 8), (_34180, 8), (_34179, 8), (_34178, 8), (_34177, 8), (_34176, 8), (_34175, 8), (_34174, 8), (_34173, 8), (_34172, 8), (_34526, 8), (_34525, 8), (_34524, 8), (_34523, 8), (_34522, 8), (_34521, 8), (_34520, 8), (_34519, 8), (_34518, 8), (_34517, 8), (_34516, 8), (_34515, 8), (_34514, 8), (_34513, 8), (_34512, 8), (_34511, 8), (_34510, 8), (_34509, 8), (_34508, 8), (_34507, 8), (_34506, 8), (_34505, 8), (_34504, 8), (_34503, 8), (_34502, 8), (_34501, 8), (_34500, 8), (_34499, 8), (_34498, 8), (_34497, 8), (_34496, 8), (_34495, 8), (_34849, 8), (_34848, 8), (_34847, 8), (_34846, 8), (_34845, 8), (_34844, 8), (_34843, 8), (_34842, 8), (_34841, 8), (_34840, 8), (_34839, 8), (_34838, 8), (_34837, 8), (_34836, 8), (_34835, 8), (_34834, 8), (_34833, 8), (_34832, 8), (_34831, 8), (_34830, 8), (_34829, 8), (_34828, 8), (_34827, 8), (_34826, 8), (_34825, 8), (_34824, 8), (_34823, 8), (_34822, 8), (_34821, 8), (_34820, 8), (_34819, 8), (_34818, 8), (_35172, 8), (_35171, 8), (_35170, 8), (_35169, 8), (_35168, 8), (_35167, 8), (_35166, 8), (_35165, 8), (_35164, 8), (_35163, 8), (_35162, 8), (_35161, 8), (_35160, 8), (_35159, 8), (_35158, 8), (_35157, 8), (_35156, 8), (_35155, 8), (_35154, 8), (_35153, 8), (_35152, 8), (_35151, 8), (_35150, 8), (_35149, 8), (_35148, 8), (_35147, 8), (_35146, 8), (_35145, 8), (_35144, 8), (_35143, 8), (_35142, 8), (_35141, 8), (_35495, 8), (_35494, 8), (_35493, 8), (_35492, 8), (_35491, 8), (_35490, 8), (_35489, 8), (_35488, 8), (_35487, 8), (_35486, 8), (_35485, 8), (_35484, 8), (_35483, 8), (_35482, 8), (_35481, 8), (_35480, 8), (_35479, 8), (_35478, 8), (_35477, 8), (_35476, 8), (_35475, 8), (_35474, 8), (_35473, 8), (_35472, 8), (_35471, 8), (_35470, 8), (_35469, 8), (_35468, 8), (_35467, 8), (_35466, 8), (_35465, 8), (_35464, 8), (_35818, 8), (_35817, 8), (_35816, 8), (_35815, 8), (_35814, 8), (_35813, 8), (_35812, 8), (_35811, 8), (_35810, 8), (_35809, 8), (_35808, 8), (_35807, 8), (_35806, 8), (_35805, 8), (_35804, 8), (_35803, 8), (_35802, 8), (_35801, 8), (_35800, 8), (_35799, 8), (_35798, 8), (_35797, 8), (_35796, 8), (_35795, 8), (_35794, 8), (_35793, 8), (_35792, 8), (_35791, 8), (_35790, 8), (_35789, 8), (_35788, 8), (_35787, 8), (_36141, 8), (_36140, 8), (_36139, 8), (_36138, 8), (_36137, 8), (_36136, 8), (_36135, 8), (_36134, 8), (_36133, 8), (_36132, 8), (_36131, 8), (_36130, 8), (_36129, 8), (_36128, 8), (_36127, 8), (_36126, 8), (_36125, 8), (_36124, 8), (_36123, 8), (_36122, 8), (_36121, 8), (_36120, 8), (_36119, 8), (_36118, 8), (_36117, 8), (_36116, 8), (_36115, 8), (_36114, 8), (_36113, 8), (_36112, 8), (_36111, 8), (_36110, 8), (_36464, 8), (_36463, 8), (_36462, 8), (_36461, 8), (_36460, 8), (_36459, 8), (_36458, 8), (_36457, 8), (_36456, 8), (_36455, 8), (_36454, 8), (_36453, 8), (_36452, 8), (_36451, 8), (_36450, 8), (_36449, 8), (_36448, 8), (_36447, 8), (_36446, 8), (_36445, 8), (_36444, 8), (_36443, 8), (_36442, 8), (_36441, 8), (_36440, 8), (_36439, 8), (_36438, 8), (_36437, 8), (_36436, 8), (_36435, 8), (_36434, 8), (_36433, 8), (_36787, 8), (_36786, 8), (_36785, 8), (_36784, 8), (_36783, 8), (_36782, 8), (_36781, 8), (_36780, 8), (_36779, 8), (_36778, 8), (_36777, 8), (_36776, 8), (_36775, 8), (_36774, 8), (_36773, 8), (_36772, 8), (_36771, 8), (_36770, 8), (_36769, 8), (_36768, 8), (_36767, 8), (_36766, 8), (_36765, 8), (_36764, 8), (_36763, 8), (_36762, 8), (_36761, 8), (_36760, 8), (_36759, 8), (_36758, 8), (_36757, 8), (_36756, 8), (_37110, 8), (_37109, 8), (_37108, 8), (_37107, 8), (_37106, 8), (_37105, 8), (_37104, 8), (_37103, 8), (_37102, 8), (_37101, 8), (_37100, 8), (_37099, 8), (_37098, 8), (_37097, 8), (_37096, 8), (_37095, 8), (_37094, 8), (_37093, 8), (_37092, 8), (_37091, 8), (_37090, 8), (_37089, 8), (_37088, 8), (_37087, 8), (_37086, 8), (_37085, 8), (_37084, 8), (_37083, 8), (_37082, 8), (_37081, 8), (_37080, 8), (_37079, 8), (_37433, 8), (_37432, 8), (_37431, 8), (_37430, 8), (_37429, 8), (_37428, 8), (_37427, 8), (_37426, 8), (_37425, 8), (_37424, 8), (_37423, 8), (_37422, 8), (_37421, 8), (_37420, 8), (_37419, 8), (_37418, 8), (_37417, 8), (_37416, 8), (_37415, 8), (_37414, 8), (_37413, 8), (_37412, 8), (_37411, 8), (_37410, 8), (_37409, 8), (_37408, 8), (_37407, 8), (_37406, 8), (_37405, 8), (_37404, 8), (_37403, 8), (_37402, 8), (_37756, 8), (_37755, 8), (_37754, 8), (_37753, 8), (_37752, 8), (_37751, 8), (_37750, 8), (_37749, 8), (_37748, 8), (_37747, 8), (_37746, 8), (_37745, 8), (_37744, 8), (_37743, 8), (_37742, 8), (_37741, 8), (_37740, 8), (_37739, 8), (_37738, 8), (_37737, 8), (_37736, 8), (_37735, 8), (_37734, 8), (_37733, 8), (_37732, 8), (_37731, 8), (_37730, 8), (_37729, 8), (_37728, 8), (_37727, 8), (_37726, 8), (_37725, 8), (_38079, 8), (_38078, 8), (_38077, 8), (_38076, 8), (_38075, 8), (_38074, 8), (_38073, 8), (_38072, 8), (_38071, 8), (_38070, 8), (_38069, 8), (_38068, 8), (_38067, 8), (_38066, 8), (_38065, 8), (_38064, 8), (_38063, 8), (_38062, 8), (_38061, 8), (_38060, 8), (_38059, 8), (_38058, 8), (_38057, 8), (_38056, 8), (_38055, 8), (_38054, 8), (_38053, 8), (_38052, 8), (_38051, 8), (_38050, 8), (_38049, 8), (_38048, 8), (_38402, 8), (_38401, 8), (_38400, 8), (_38399, 8), (_38398, 8), (_38397, 8), (_38396, 8), (_38395, 8), (_38394, 8), (_38393, 8), (_38392, 8), (_38391, 8), (_38390, 8), (_38389, 8), (_38388, 8), (_38387, 8), (_38386, 8), (_38385, 8), (_38384, 8), (_38383, 8), (_38382, 8), (_38381, 8), (_38380, 8), (_38379, 8), (_38378, 8), (_38377, 8), (_38376, 8), (_38375, 8), (_38374, 8), (_38373, 8), (_38372, 8), (_38371, 8), (_38725, 8), (_38724, 8), (_38723, 8), (_38722, 8), (_38721, 8), (_38720, 8), (_38719, 8), (_38718, 8), (_38717, 8), (_38716, 8), (_38715, 8), (_38714, 8), (_38713, 8), (_38712, 8), (_38711, 8), (_38710, 8), (_38709, 8), (_38708, 8), (_38707, 8), (_38706, 8), (_38705, 8), (_38704, 8), (_38703, 8), (_38702, 8), (_38701, 8), (_38700, 8), (_38699, 8), (_38698, 8), (_38697, 8), (_38696, 8), (_38695, 8), (_38694, 8), (_39048, 8), (_39047, 8), (_39046, 8), (_39045, 8), (_39044, 8), (_39043, 8), (_39042, 8), (_39041, 8), (_39040, 8), (_39039, 8), (_39038, 8), (_39037, 8), (_39036, 8), (_39035, 8), (_39034, 8), (_39033, 8), (_39032, 8), (_39031, 8), (_39030, 8), (_39029, 8), (_39028, 8), (_39027, 8), (_39026, 8), (_39025, 8), (_39024, 8), (_39023, 8), (_39022, 8), (_39021, 8), (_39020, 8), (_39019, 8), (_39018, 8), (_39017, 8), (_39371, 8), (_39370, 8), (_39369, 8), (_39368, 8), (_39367, 8), (_39366, 8), (_39365, 8), (_39364, 8), (_39363, 8), (_39362, 8), (_39361, 8), (_39360, 8), (_39359, 8), (_39358, 8), (_39357, 8), (_39356, 8), (_39355, 8), (_39354, 8), (_39353, 8), (_39352, 8), (_39351, 8), (_39350, 8), (_39349, 8), (_39348, 8), (_39347, 8), (_39346, 8), (_39345, 8), (_39344, 8), (_39343, 8), (_39342, 8), (_39341, 8), (_39340, 8), (_39694, 8), (_39693, 8), (_39692, 8), (_39691, 8), (_39690, 8), (_39689, 8), (_39688, 8), (_39687, 8), (_39686, 8), (_39685, 8), (_39684, 8), (_39683, 8), (_39682, 8), (_39681, 8), (_39680, 8), (_39679, 8), (_39678, 8), (_39677, 8), (_39676, 8), (_39675, 8), (_39674, 8), (_39673, 8), (_39672, 8), (_39671, 8), (_39670, 8), (_39669, 8), (_39668, 8), (_39667, 8), (_39666, 8), (_39665, 8), (_39664, 8), (_39663, 8), (_40017, 8), (_40016, 8), (_40015, 8), (_40014, 8), (_40013, 8), (_40012, 8), (_40011, 8), (_40010, 8), (_40009, 8), (_40008, 8), (_40007, 8), (_40006, 8), (_40005, 8), (_40004, 8), (_40003, 8), (_40002, 8), (_40001, 8), (_40000, 8), (_39999, 8), (_39998, 8), (_39997, 8), (_39996, 8), (_39995, 8), (_39994, 8), (_39993, 8), (_39992, 8), (_39991, 8), (_39990, 8), (_39989, 8), (_39988, 8), (_39987, 8), (_39986, 8), (_40340, 8), (_40339, 8), (_40338, 8), (_40337, 8), (_40336, 8), (_40335, 8), (_40334, 8), (_40333, 8), (_40332, 8), (_40331, 8), (_40330, 8), (_40329, 8), (_40328, 8), (_40327, 8), (_40326, 8), (_40325, 8), (_40324, 8), (_40323, 8), (_40322, 8), (_40321, 8), (_40320, 8), (_40319, 8), (_40318, 8), (_40317, 8), (_40316, 8), (_40315, 8), (_40314, 8), (_40313, 8), (_40312, 8), (_40311, 8), (_40310, 8), (_40309, 8), (_40663, 8), (_40662, 8), (_40661, 8), (_40660, 8), (_40659, 8), (_40658, 8), (_40657, 8), (_40656, 8), (_40655, 8), (_40654, 8), (_40653, 8), (_40652, 8), (_40651, 8), (_40650, 8), (_40649, 8), (_40648, 8), (_40647, 8), (_40646, 8), (_40645, 8), (_40644, 8), (_40643, 8), (_40642, 8), (_40641, 8), (_40640, 8), (_40639, 8), (_40638, 8), (_40637, 8), (_40636, 8), (_40635, 8), (_40634, 8), (_40633, 8), (_40632, 8), (_40986, 8), (_40985, 8), (_40984, 8), (_40983, 8), (_40982, 8), (_40981, 8), (_40980, 8), (_40979, 8), (_40978, 8), (_40977, 8), (_40976, 8), (_40975, 8), (_40974, 8), (_40973, 8), (_40972, 8), (_40971, 8), (_40970, 8), (_40969, 8), (_40968, 8), (_40967, 8), (_40966, 8), (_40965, 8), (_40964, 8), (_40963, 8), (_40962, 8), (_40961, 8), (_40960, 8), (_40959, 8), (_40958, 8), (_40957, 8), (_40956, 8), (_40955, 8), (_41309, 8), (_41308, 8), (_41307, 8), (_41306, 8), (_41305, 8), (_41304, 8), (_41303, 8), (_41302, 8), (_41301, 8), (_41300, 8), (_41299, 8), (_41298, 8), (_41297, 8), (_41296, 8), (_41295, 8), (_41294, 8), (_41293, 8), (_41292, 8), (_41291, 8), (_41290, 8), (_41289, 8), (_41288, 8), (_41287, 8), (_41286, 8), (_41285, 8), (_41284, 8), (_41283, 8), (_41282, 8), (_41281, 8), (_41280, 8), (_41279, 8), (_41278, 8), (_41632, 8), (_41631, 8), (_41630, 8), (_41629, 8), (_41628, 8), (_41627, 8), (_41626, 8), (_41625, 8), (_41624, 8), (_41623, 8), (_41622, 8), (_41621, 8), (_41620, 8), (_41619, 8), (_41618, 8), (_41617, 8), (_41616, 8), (_41615, 8), (_41614, 8), (_41613, 8), (_41612, 8), (_41611, 8), (_41610, 8), (_41609, 8), (_41608, 8), (_41607, 8), (_41606, 8), (_41605, 8), (_41604, 8), (_41603, 8), (_41602, 8), (_41601, 8), (_41955, 8), (_41954, 8), (_41953, 8), (_41952, 8), (_41951, 8), (_41950, 8), (_41949, 8), (_41948, 8), (_41947, 8), (_41946, 8), (_41945, 8), (_41944, 8), (_41943, 8), (_41942, 8), (_41941, 8), (_41940, 8), (_41939, 8), (_41938, 8), (_41937, 8), (_41936, 8), (_41935, 8), (_41934, 8), (_41933, 8), (_41932, 8), (_41931, 8), (_41930, 8), (_41929, 8), (_41928, 8), (_41927, 8), (_41926, 8), (_41925, 8), (_41924, 8), (_42278, 8), (_42277, 8), (_42276, 8), (_42275, 8), (_42274, 8), (_42273, 8), (_42272, 8), (_42271, 8), (_42270, 8), (_42269, 8), (_42268, 8), (_42267, 8), (_42266, 8), (_42265, 8), (_42264, 8), (_42263, 8), (_42262, 8), (_42261, 8), (_42260, 8), (_42259, 8), (_42258, 8), (_42257, 8), (_42256, 8), (_42255, 8), (_42254, 8), (_42253, 8), (_42252, 8), (_42251, 8), (_42250, 8), (_42249, 8), (_42248, 8), (_42247, 8), (_42601, 8), (_42600, 8), (_42599, 8), (_42598, 8), (_42597, 8), (_42596, 8), (_42595, 8), (_42594, 8), (_42593, 8), (_42592, 8), (_42591, 8), (_42590, 8), (_42589, 8), (_42588, 8), (_42587, 8), (_42586, 8), (_42585, 8), (_42584, 8), (_42583, 8), (_42582, 8), (_42581, 8), (_42580, 8), (_42579, 8), (_42578, 8), (_42577, 8), (_42576, 8), (_42575, 8), (_42574, 8), (_42573, 8), (_42572, 8), (_42571, 8), (_42570, 8), (_42924, 8), (_42923, 8), (_42922, 8), (_42921, 8), (_42920, 8), (_42919, 8), (_42918, 8), (_42917, 8), (_42916, 8), (_42915, 8), (_42914, 8), (_42913, 8), (_42912, 8), (_42911, 8), (_42910, 8), (_42909, 8), (_42908, 8), (_42907, 8), (_42906, 8), (_42905, 8), (_42904, 8), (_42903, 8), (_42902, 8), (_42901, 8), (_42900, 8), (_42899, 8), (_42898, 8), (_42897, 8), (_42896, 8), (_42895, 8), (_42894, 8), (_42893, 8), (_43247, 8), (_43246, 8), (_43245, 8), (_43244, 8), (_43243, 8), (_43242, 8), (_43241, 8), (_43240, 8), (_43239, 8), (_43238, 8), (_43237, 8), (_43236, 8), (_43235, 8), (_43234, 8), (_43233, 8), (_43232, 8), (_43231, 8), (_43230, 8), (_43229, 8), (_43228, 8), (_43227, 8), (_43226, 8), (_43225, 8), (_43224, 8), (_43223, 8), (_43222, 8), (_43221, 8), (_43220, 8), (_43219, 8), (_43218, 8), (_43217, 8), (_43216, 8), (_43570, 8), (_43569, 8), (_43568, 8), (_43567, 8), (_43566, 8), (_43565, 8), (_43564, 8), (_43563, 8), (_43562, 8), (_43561, 8), (_43560, 8), (_43559, 8), (_43558, 8), (_43557, 8), (_43556, 8), (_43555, 8), (_43554, 8), (_43553, 8), (_43552, 8), (_43551, 8), (_43550, 8), (_43549, 8), (_43548, 8), (_43547, 8), (_43546, 8), (_43545, 8), (_43544, 8), (_43543, 8), (_43542, 8), (_43541, 8), (_43540, 8), (_43539, 8), (_43893, 8), (_43892, 8), (_43891, 8), (_43890, 8), (_43889, 8), (_43888, 8), (_43887, 8), (_43886, 8), (_43885, 8), (_43884, 8), (_43883, 8), (_43882, 8), (_43881, 8), (_43880, 8), (_43879, 8), (_43878, 8), (_43877, 8), (_43876, 8), (_43875, 8), (_43874, 8), (_43873, 8), (_43872, 8), (_43871, 8), (_43870, 8), (_43869, 8), (_43868, 8), (_43867, 8), (_43866, 8), (_43865, 8), (_43864, 8), (_43863, 8), (_43862, 8), (_44216, 8), (_44215, 8), (_44214, 8), (_44213, 8), (_44212, 8), (_44211, 8), (_44210, 8), (_44209, 8), (_44208, 8), (_44207, 8), (_44206, 8), (_44205, 8), (_44204, 8), (_44203, 8), (_44202, 8), (_44201, 8), (_44200, 8), (_44199, 8), (_44198, 8), (_44197, 8), (_44196, 8), (_44195, 8), (_44194, 8), (_44193, 8), (_44192, 8), (_44191, 8), (_44190, 8), (_44189, 8), (_44188, 8), (_44187, 8), (_44186, 8), (_44185, 8), (_44539, 8), (_44538, 8), (_44537, 8), (_44536, 8), (_44535, 8), (_44534, 8), (_44533, 8), (_44532, 8), (_44531, 8), (_44530, 8), (_44529, 8), (_44528, 8), (_44527, 8), (_44526, 8), (_44525, 8), (_44524, 8), (_44523, 8), (_44522, 8), (_44521, 8), (_44520, 8), (_44519, 8), (_44518, 8), (_44517, 8), (_44516, 8), (_44515, 8), (_44514, 8), (_44513, 8), (_44512, 8), (_44511, 8), (_44510, 8), (_44509, 8), (_44508, 8), (_44862, 8), (_44861, 8), (_44860, 8), (_44859, 8), (_44858, 8), (_44857, 8), (_44856, 8), (_44855, 8), (_44854, 8), (_44853, 8), (_44852, 8), (_44851, 8), (_44850, 8), (_44849, 8), (_44848, 8), (_44847, 8), (_44846, 8), (_44845, 8), (_44844, 8), (_44843, 8), (_44842, 8), (_44841, 8), (_44840, 8), (_44839, 8), (_44838, 8), (_44837, 8), (_44836, 8), (_44835, 8), (_44834, 8), (_44833, 8), (_44832, 8), (_44831, 8), (_45185, 8), (_45184, 8), (_45183, 8), (_45182, 8), (_45181, 8), (_45180, 8), (_45179, 8), (_45178, 8), (_45177, 8), (_45176, 8), (_45175, 8), (_45174, 8), (_45173, 8), (_45172, 8), (_45171, 8), (_45170, 8), (_45169, 8), (_45168, 8), (_45167, 8), (_45166, 8), (_45165, 8), (_45164, 8), (_45163, 8), (_45162, 8), (_45161, 8), (_45160, 8), (_45159, 8), (_45158, 8), (_45157, 8), (_45156, 8), (_45155, 8), (_45154, 8), (_45508, 8), (_45507, 8), (_45506, 8), (_45505, 8), (_45504, 8), (_45503, 8), (_45502, 8), (_45501, 8), (_45500, 8), (_45499, 8), (_45498, 8), (_45497, 8), (_45496, 8), (_45495, 8), (_45494, 8), (_45493, 8), (_45492, 8), (_45491, 8), (_45490, 8), (_45489, 8), (_45488, 8), (_45487, 8), (_45486, 8), (_45485, 8), (_45484, 8), (_45483, 8), (_45482, 8), (_45481, 8), (_45480, 8), (_45479, 8), (_45478, 8), (_45477, 8), (_45831, 8), (_45830, 8), (_45829, 8), (_45828, 8), (_45827, 8), (_45826, 8), (_45825, 8), (_45824, 8), (_45823, 8), (_45822, 8), (_45821, 8), (_45820, 8), (_45819, 8), (_45818, 8), (_45817, 8), (_45816, 8), (_45815, 8), (_45814, 8), (_45813, 8), (_45812, 8), (_45811, 8), (_45810, 8), (_45809, 8), (_45808, 8), (_45807, 8), (_45806, 8), (_45805, 8), (_45804, 8), (_45803, 8), (_45802, 8), (_45801, 8), (_45800, 8), (_46154, 8), (_46153, 8), (_46152, 8), (_46151, 8), (_46150, 8), (_46149, 8), (_46148, 8), (_46147, 8), (_46146, 8), (_46145, 8), (_46144, 8), (_46143, 8), (_46142, 8), (_46141, 8), (_46140, 8), (_46139, 8), (_46138, 8), (_46137, 8), (_46136, 8), (_46135, 8), (_46134, 8), (_46133, 8), (_46132, 8), (_46131, 8), (_46130, 8), (_46129, 8), (_46128, 8), (_46127, 8), (_46126, 8), (_46125, 8), (_46124, 8), (_46123, 8), (_46477, 8), (_46476, 8), (_46475, 8), (_46474, 8), (_46473, 8), (_46472, 8), (_46471, 8), (_46470, 8), (_46469, 8), (_46468, 8), (_46467, 8), (_46466, 8), (_46465, 8), (_46464, 8), (_46463, 8), (_46462, 8), (_46461, 8), (_46460, 8), (_46459, 8), (_46458, 8), (_46457, 8), (_46456, 8), (_46455, 8), (_46454, 8), (_46453, 8), (_46452, 8), (_46451, 8), (_46450, 8), (_46449, 8), (_46448, 8), (_46447, 8), (_46446, 8), (_46800, 8), (_46799, 8), (_46798, 8), (_46797, 8), (_46796, 8), (_46795, 8), (_46794, 8), (_46793, 8), (_46792, 8), (_46791, 8), (_46790, 8), (_46789, 8), (_46788, 8), (_46787, 8), (_46786, 8), (_46785, 8), (_46784, 8), (_46783, 8), (_46782, 8), (_46781, 8), (_46780, 8), (_46779, 8), (_46778, 8), (_46777, 8), (_46776, 8), (_46775, 8), (_46774, 8), (_46773, 8), (_46772, 8), (_46771, 8), (_46770, 8), (_46769, 8), (_47123, 8), (_47122, 8), (_47121, 8), (_47120, 8), (_47119, 8), (_47118, 8), (_47117, 8), (_47116, 8), (_47115, 8), (_47114, 8), (_47113, 8), (_47112, 8), (_47111, 8), (_47110, 8), (_47109, 8), (_47108, 8), (_47107, 8), (_47106, 8), (_47105, 8), (_47104, 8), (_47103, 8), (_47102, 8), (_47101, 8), (_47100, 8), (_47099, 8), (_47098, 8), (_47097, 8), (_47096, 8), (_47095, 8), (_47094, 8), (_47093, 8), (_47092, 8), (_47446, 8), (_47445, 8), (_47444, 8), (_47443, 8), (_47442, 8), (_47441, 8), (_47440, 8), (_47439, 8), (_47438, 8), (_47437, 8), (_47436, 8), (_47435, 8), (_47434, 8), (_47433, 8), (_47432, 8), (_47431, 8), (_47430, 8), (_47429, 8), (_47428, 8), (_47427, 8), (_47426, 8), (_47425, 8), (_47424, 8), (_47423, 8), (_47422, 8), (_47421, 8), (_47420, 8), (_47419, 8), (_47418, 8), (_47417, 8), (_47416, 8), (_47415, 8), (_47769, 8), (_47768, 8), (_47767, 8), (_47766, 8), (_47765, 8), (_47764, 8), (_47763, 8), (_47762, 8), (_47761, 8), (_47760, 8), (_47759, 8), (_47758, 8), (_47757, 8), (_47756, 8), (_47755, 8), (_47754, 8), (_47753, 8), (_47752, 8), (_47751, 8), (_47750, 8), (_47749, 8), (_47748, 8), (_47747, 8), (_47746, 8), (_47745, 8), (_47744, 8), (_47743, 8), (_47742, 8), (_47741, 8), (_47740, 8), (_47739, 8), (_47738, 8), (_48092, 8), (_48091, 8), (_48090, 8), (_48089, 8), (_48088, 8), (_48087, 8), (_48086, 8), (_48085, 8), (_48084, 8), (_48083, 8), (_48082, 8), (_48081, 8), (_48080, 8), (_48079, 8), (_48078, 8), (_48077, 8), (_48076, 8), (_48075, 8), (_48074, 8), (_48073, 8), (_48072, 8), (_48071, 8), (_48070, 8), (_48069, 8), (_48068, 8), (_48067, 8), (_48066, 8), (_48065, 8), (_48064, 8), (_48063, 8), (_48062, 8), (_48061, 8), (_48415, 8), (_48414, 8), (_48413, 8), (_48412, 8), (_48411, 8), (_48410, 8), (_48409, 8), (_48408, 8), (_48407, 8), (_48406, 8), (_48405, 8), (_48404, 8), (_48403, 8), (_48402, 8), (_48401, 8), (_48400, 8), (_48399, 8), (_48398, 8), (_48397, 8), (_48396, 8), (_48395, 8), (_48394, 8), (_48393, 8), (_48392, 8), (_48391, 8), (_48390, 8), (_48389, 8), (_48388, 8), (_48387, 8), (_48386, 8), (_48385, 8), (_48384, 8), (_48738, 8), (_48737, 8), (_48736, 8), (_48735, 8), (_48734, 8), (_48733, 8), (_48732, 8), (_48731, 8), (_48730, 8), (_48729, 8), (_48728, 8), (_48727, 8), (_48726, 8), (_48725, 8), (_48724, 8), (_48723, 8), (_48722, 8), (_48721, 8), (_48720, 8), (_48719, 8), (_48718, 8), (_48717, 8), (_48716, 8), (_48715, 8), (_48714, 8), (_48713, 8), (_48712, 8), (_48711, 8), (_48710, 8), (_48709, 8), (_48708, 8), (_48707, 8), (_49061, 8), (_49060, 8), (_49059, 8), (_49058, 8), (_49057, 8), (_49056, 8), (_49055, 8), (_49054, 8), (_49053, 8), (_49052, 8), (_49051, 8), (_49050, 8), (_49049, 8), (_49048, 8), (_49047, 8), (_49046, 8), (_49045, 8), (_49044, 8), (_49043, 8), (_49042, 8), (_49041, 8), (_49040, 8), (_49039, 8), (_49038, 8), (_49037, 8), (_49036, 8), (_49035, 8), (_49034, 8), (_49033, 8), (_49032, 8), (_49031, 8), (_49030, 8), (_49384, 8), (_49383, 8), (_49382, 8), (_49381, 8), (_49380, 8), (_49379, 8), (_49378, 8), (_49377, 8), (_49376, 8), (_49375, 8), (_49374, 8), (_49373, 8), (_49372, 8), (_49371, 8), (_49370, 8), (_49369, 8), (_49368, 8), (_49367, 8), (_49366, 8), (_49365, 8), (_49364, 8), (_49363, 8), (_49362, 8), (_49361, 8), (_49360, 8), (_49359, 8), (_49358, 8), (_49357, 8), (_49356, 8), (_49355, 8), (_49354, 8), (_49353, 8), (_49707, 8), (_49706, 8), (_49705, 8), (_49704, 8), (_49703, 8), (_49702, 8), (_49701, 8), (_49700, 8), (_49699, 8), (_49698, 8), (_49697, 8), (_49696, 8), (_49695, 8), (_49694, 8), (_49693, 8), (_49692, 8), (_49691, 8), (_49690, 8), (_49689, 8), (_49688, 8), (_49687, 8), (_49686, 8), (_49685, 8), (_49684, 8), (_49683, 8), (_49682, 8), (_49681, 8), (_49680, 8), (_49679, 8), (_49678, 8), (_49677, 8), (_49676, 8), (_50030, 8), (_50029, 8), (_50028, 8), (_50027, 8), (_50026, 8), (_50025, 8), (_50024, 8), (_50023, 8), (_50022, 8), (_50021, 8), (_50020, 8), (_50019, 8), (_50018, 8), (_50017, 8), (_50016, 8), (_50015, 8), (_50014, 8), (_50013, 8), (_50012, 8), (_50011, 8), (_50010, 8), (_50009, 8), (_50008, 8), (_50007, 8), (_50006, 8), (_50005, 8), (_50004, 8), (_50003, 8), (_50002, 8), (_50001, 8), (_50000, 8), (_49999, 8), (_50353, 8), (_50352, 8), (_50351, 8), (_50350, 8), (_50349, 8), (_50348, 8), (_50347, 8), (_50346, 8), (_50345, 8), (_50344, 8), (_50343, 8), (_50342, 8), (_50341, 8), (_50340, 8), (_50339, 8), (_50338, 8), (_50337, 8), (_50336, 8), (_50335, 8), (_50334, 8), (_50333, 8), (_50332, 8), (_50331, 8), (_50330, 8), (_50329, 8), (_50328, 8), (_50327, 8), (_50326, 8), (_50325, 8), (_50324, 8), (_50323, 8), (_50322, 8), (_50676, 8), (_50675, 8), (_50674, 8), (_50673, 8), (_50672, 8), (_50671, 8), (_50670, 8), (_50669, 8), (_50668, 8), (_50667, 8), (_50666, 8), (_50665, 8), (_50664, 8), (_50663, 8), (_50662, 8), (_50661, 8), (_50660, 8), (_50659, 8), (_50658, 8), (_50657, 8), (_50656, 8), (_50655, 8), (_50654, 8), (_50653, 8), (_50652, 8), (_50651, 8), (_50650, 8), (_50649, 8), (_50648, 8), (_50647, 8), (_50646, 8), (_50645, 8), (_50999, 8), (_50998, 8), (_50997, 8), (_50996, 8), (_50995, 8), (_50994, 8), (_50993, 8), (_50992, 8), (_50991, 8), (_50990, 8), (_50989, 8), (_50988, 8), (_50987, 8), (_50986, 8), (_50985, 8), (_50984, 8), (_50983, 8), (_50982, 8), (_50981, 8), (_50980, 8), (_50979, 8), (_50978, 8), (_50977, 8), (_50976, 8), (_50975, 8), (_50974, 8), (_50973, 8), (_50972, 8), (_50971, 8), (_50970, 8), (_50969, 8), (_50968, 8), (_51322, 8), (_51321, 8), (_51320, 8), (_51319, 8), (_51318, 8), (_51317, 8), (_51316, 8), (_51315, 8), (_51314, 8), (_51313, 8), (_51312, 8), (_51311, 8), (_51310, 8), (_51309, 8), (_51308, 8), (_51307, 8), (_51306, 8), (_51305, 8), (_51304, 8), (_51303, 8), (_51302, 8), (_51301, 8), (_51300, 8), (_51299, 8), (_51298, 8), (_51297, 8), (_51296, 8), (_51295, 8), (_51294, 8), (_51293, 8), (_51292, 8), (_51291, 8), (_51645, 8), (_51644, 8), (_51643, 8), (_51642, 8), (_51641, 8), (_51640, 8), (_51639, 8), (_51638, 8), (_51637, 8), (_51636, 8), (_51635, 8), (_51634, 8), (_51633, 8), (_51632, 8), (_51631, 8), (_51630, 8), (_51629, 8), (_51628, 8), (_51627, 8), (_51626, 8), (_51625, 8), (_51624, 8), (_51623, 8), (_51622, 8), (_51621, 8), (_51620, 8), (_51619, 8), (_51618, 8), (_51617, 8), (_51616, 8), (_51615, 8), (_51614, 8), (_51968, 8), (_51967, 8), (_51966, 8), (_51965, 8), (_51964, 8), (_51963, 8), (_51962, 8), (_51961, 8), (_51960, 8), (_51959, 8), (_51958, 8), (_51957, 8), (_51956, 8), (_51955, 8), (_51954, 8), (_51953, 8), (_51952, 8), (_51951, 8), (_51950, 8), (_51949, 8), (_51948, 8), (_51947, 8), (_51946, 8), (_51945, 8), (_51944, 8), (_51943, 8), (_51942, 8), (_51941, 8), (_51940, 8), (_51939, 8), (_51938, 8), (_51937, 8), (_52291, 8), (_52290, 8), (_52289, 8), (_52288, 8), (_52287, 8), (_52286, 8), (_52285, 8), (_52284, 8), (_52283, 8), (_52282, 8), (_52281, 8), (_52280, 8), (_52279, 8), (_52278, 8), (_52277, 8), (_52276, 8), (_52275, 8), (_52274, 8), (_52273, 8), (_52272, 8), (_52271, 8), (_52270, 8), (_52269, 8), (_52268, 8), (_52267, 8), (_52266, 8), (_52265, 8), (_52264, 8), (_52263, 8), (_52262, 8), (_52261, 8), (_52260, 8), (_52614, 8), (_52613, 8), (_52612, 8), (_52611, 8), (_52610, 8), (_52609, 8), (_52608, 8), (_52607, 8), (_52606, 8), (_52605, 8), (_52604, 8), (_52603, 8), (_52602, 8), (_52601, 8), (_52600, 8), (_52599, 8), (_52598, 8), (_52597, 8), (_52596, 8), (_52595, 8), (_52594, 8), (_52593, 8), (_52592, 8), (_52591, 8), (_52590, 8), (_52589, 8), (_52588, 8), (_52587, 8), (_52586, 8), (_52585, 8), (_52584, 8), (_52583, 8), (_52937, 8), (_52936, 8), (_52935, 8), (_52934, 8), (_52933, 8), (_52932, 8), (_52931, 8), (_52930, 8), (_52929, 8), (_52928, 8), (_52927, 8), (_52926, 8), (_52925, 8), (_52924, 8), (_52923, 8), (_52922, 8), (_52921, 8), (_52920, 8), (_52919, 8), (_52918, 8), (_52917, 8), (_52916, 8), (_52915, 8), (_52914, 8), (_52913, 8), (_52912, 8), (_52911, 8), (_52910, 8), (_52909, 8), (_52908, 8), (_52907, 8), (_52906, 8), (_53260, 8), (_53259, 8), (_53258, 8), (_53257, 8), (_53256, 8), (_53255, 8), (_53254, 8), (_53253, 8), (_53252, 8), (_53251, 8), (_53250, 8), (_53249, 8), (_53248, 8), (_53247, 8), (_53246, 8), (_53245, 8), (_53244, 8), (_53243, 8), (_53242, 8), (_53241, 8), (_53240, 8), (_53239, 8), (_53238, 8), (_53237, 8), (_53236, 8), (_53235, 8), (_53234, 8), (_53233, 8), (_53232, 8), (_53231, 8), (_53230, 8), (_53229, 8), (_53583, 8), (_53582, 8), (_53581, 8), (_53580, 8), (_53579, 8), (_53578, 8), (_53577, 8), (_53576, 8), (_53575, 8), (_53574, 8), (_53573, 8), (_53572, 8), (_53571, 8), (_53570, 8), (_53569, 8), (_53568, 8), (_53567, 8), (_53566, 8), (_53565, 8), (_53564, 8), (_53563, 8), (_53562, 8), (_53561, 8), (_53560, 8), (_53559, 8), (_53558, 8), (_53557, 8), (_53556, 8), (_53555, 8), (_53554, 8), (_53553, 8), (_53552, 8), (_53906, 8), (_53905, 8), (_53904, 8), (_53903, 8), (_53902, 8), (_53901, 8), (_53900, 8), (_53899, 8), (_53898, 8), (_53897, 8), (_53896, 8), (_53895, 8), (_53894, 8), (_53893, 8), (_53892, 8), (_53891, 8), (_53890, 8), (_53889, 8), (_53888, 8), (_53887, 8), (_53886, 8), (_53885, 8), (_53884, 8), (_53883, 8), (_53882, 8), (_53881, 8), (_53880, 8), (_53879, 8), (_53878, 8), (_53877, 8), (_53876, 8), (_53875, 8), (_54229, 8), (_54228, 8), (_54227, 8), (_54226, 8), (_54225, 8), (_54224, 8), (_54223, 8), (_54222, 8), (_54221, 8), (_54220, 8), (_54219, 8), (_54218, 8), (_54217, 8), (_54216, 8), (_54215, 8), (_54214, 8), (_54213, 8), (_54212, 8), (_54211, 8), (_54210, 8), (_54209, 8), (_54208, 8), (_54207, 8), (_54206, 8), (_54205, 8), (_54204, 8), (_54203, 8), (_54202, 8), (_54201, 8), (_54200, 8), (_54199, 8), (_54198, 8), (_54552, 8), (_54551, 8), (_54550, 8), (_54549, 8), (_54548, 8), (_54547, 8), (_54546, 8), (_54545, 8), (_54544, 8), (_54543, 8), (_54542, 8), (_54541, 8), (_54540, 8), (_54539, 8), (_54538, 8), (_54537, 8), (_54536, 8), (_54535, 8), (_54534, 8), (_54533, 8), (_54532, 8), (_54531, 8), (_54530, 8), (_54529, 8), (_54528, 8), (_54527, 8), (_54526, 8), (_54525, 8), (_54524, 8), (_54523, 8), (_54522, 8), (_54521, 8), (_54875, 8), (_54874, 8), (_54873, 8), (_54872, 8), (_54871, 8), (_54870, 8), (_54869, 8), (_54868, 8), (_54867, 8), (_54866, 8), (_54865, 8), (_54864, 8), (_54863, 8), (_54862, 8), (_54861, 8), (_54860, 8), (_54859, 8), (_54858, 8), (_54857, 8), (_54856, 8), (_54855, 8), (_54854, 8), (_54853, 8), (_54852, 8), (_54851, 8), (_54850, 8), (_54849, 8), (_54848, 8), (_54847, 8), (_54846, 8), (_54845, 8), (_54844, 8), (_55198, 8), (_55197, 8), (_55196, 8), (_55195, 8), (_55194, 8), (_55193, 8), (_55192, 8), (_55191, 8), (_55190, 8), (_55189, 8), (_55188, 8), (_55187, 8), (_55186, 8), (_55185, 8), (_55184, 8), (_55183, 8), (_55182, 8), (_55181, 8), (_55180, 8), (_55179, 8), (_55178, 8), (_55177, 8), (_55176, 8), (_55175, 8), (_55174, 8), (_55173, 8), (_55172, 8), (_55171, 8), (_55170, 8), (_55169, 8), (_55168, 8), (_55167, 8), (_55521, 8), (_55520, 8), (_55519, 8), (_55518, 8), (_55517, 8), (_55516, 8), (_55515, 8), (_55514, 8), (_55513, 8), (_55512, 8), (_55511, 8), (_55510, 8), (_55509, 8), (_55508, 8), (_55507, 8), (_55506, 8), (_55505, 8), (_55504, 8), (_55503, 8), (_55502, 8), (_55501, 8), (_55500, 8), (_55499, 8), (_55498, 8), (_55497, 8), (_55496, 8), (_55495, 8), (_55494, 8), (_55493, 8), (_55492, 8), (_55491, 8), (_55490, 8), (_55844, 8), (_55843, 8), (_55842, 8), (_55841, 8), (_55840, 8), (_55839, 8), (_55838, 8), (_55837, 8), (_55836, 8), (_55835, 8), (_55834, 8), (_55833, 8), (_55832, 8), (_55831, 8), (_55830, 8), (_55829, 8), (_55828, 8), (_55827, 8), (_55826, 8), (_55825, 8), (_55824, 8), (_55823, 8), (_55822, 8), (_55821, 8), (_55820, 8), (_55819, 8), (_55818, 8), (_55817, 8), (_55816, 8), (_55815, 8), (_55814, 8), (_55813, 8), (_56167, 8), (_56166, 8), (_56165, 8), (_56164, 8), (_56163, 8), (_56162, 8), (_56161, 8), (_56160, 8), (_56159, 8), (_56158, 8), (_56157, 8), (_56156, 8), (_56155, 8), (_56154, 8), (_56153, 8), (_56152, 8), (_56151, 8), (_56150, 8), (_56149, 8), (_56148, 8), (_56147, 8), (_56146, 8), (_56145, 8), (_56144, 8), (_56143, 8), (_56142, 8), (_56141, 8), (_56140, 8), (_56139, 8), (_56138, 8), (_56137, 8), (_56136, 8), (_56490, 8), (_56489, 8), (_56488, 8), (_56487, 8), (_56486, 8), (_56485, 8), (_56484, 8), (_56483, 8), (_56482, 8), (_56481, 8), (_56480, 8), (_56479, 8), (_56478, 8), (_56477, 8), (_56476, 8), (_56475, 8), (_56474, 8), (_56473, 8), (_56472, 8), (_56471, 8), (_56470, 8), (_56469, 8), (_56468, 8), (_56467, 8), (_56466, 8), (_56465, 8), (_56464, 8), (_56463, 8), (_56462, 8), (_56461, 8), (_56460, 8), (_56459, 8), (_56813, 8), (_56812, 8), (_56811, 8), (_56810, 8), (_56809, 8), (_56808, 8), (_56807, 8), (_56806, 8), (_56805, 8), (_56804, 8), (_56803, 8), (_56802, 8), (_56801, 8), (_56800, 8), (_56799, 8), (_56798, 8), (_56797, 8), (_56796, 8), (_56795, 8), (_56794, 8), (_56793, 8), (_56792, 8), (_56791, 8), (_56790, 8), (_56789, 8), (_56788, 8), (_56787, 8), (_56786, 8), (_56785, 8), (_56784, 8), (_56783, 8), (_56782, 8), (_57136, 8), (_57135, 8), (_57134, 8), (_57133, 8), (_57132, 8), (_57131, 8), (_57130, 8), (_57129, 8), (_57128, 8), (_57127, 8), (_57126, 8), (_57125, 8), (_57124, 8), (_57123, 8), (_57122, 8), (_57121, 8), (_57120, 8), (_57119, 8), (_57118, 8), (_57117, 8), (_57116, 8), (_57115, 8), (_57114, 8), (_57113, 8), (_57112, 8), (_57111, 8), (_57110, 8), (_57109, 8), (_57108, 8), (_57107, 8), (_57106, 8), (_57105, 8), (_57459, 8), (_57458, 8), (_57457, 8), (_57456, 8), (_57455, 8), (_57454, 8), (_57453, 8), (_57452, 8), (_57451, 8), (_57450, 8), (_57449, 8), (_57448, 8), (_57447, 8), (_57446, 8), (_57445, 8), (_57444, 8), (_57443, 8), (_57442, 8), (_57441, 8), (_57440, 8), (_57439, 8), (_57438, 8), (_57437, 8), (_57436, 8), (_57435, 8), (_57434, 8), (_57433, 8), (_57432, 8), (_57431, 8), (_57430, 8), (_57429, 8), (_57428, 8), (_57782, 8), (_57781, 8), (_57780, 8), (_57779, 8), (_57778, 8), (_57777, 8), (_57776, 8), (_57775, 8), (_57774, 8), (_57773, 8), (_57772, 8), (_57771, 8), (_57770, 8), (_57769, 8), (_57768, 8), (_57767, 8), (_57766, 8), (_57765, 8), (_57764, 8), (_57763, 8), (_57762, 8), (_57761, 8), (_57760, 8), (_57759, 8), (_57758, 8), (_57757, 8), (_57756, 8), (_57755, 8), (_57754, 8), (_57753, 8), (_57752, 8), (_57751, 8), (_58105, 8), (_58104, 8), (_58103, 8), (_58102, 8), (_58101, 8), (_58100, 8), (_58099, 8), (_58098, 8), (_58097, 8), (_58096, 8), (_58095, 8), (_58094, 8), (_58093, 8), (_58092, 8), (_58091, 8), (_58090, 8), (_58089, 8), (_58088, 8), (_58087, 8), (_58086, 8), (_58085, 8), (_58084, 8), (_58083, 8), (_58082, 8), (_58081, 8), (_58080, 8), (_58079, 8), (_58078, 8), (_58077, 8), (_58076, 8), (_58075, 8), (_58074, 8), (_58428, 8), (_58427, 8), (_58426, 8), (_58425, 8), (_58424, 8), (_58423, 8), (_58422, 8), (_58421, 8), (_58420, 8), (_58419, 8), (_58418, 8), (_58417, 8), (_58416, 8), (_58415, 8), (_58414, 8), (_58413, 8), (_58412, 8), (_58411, 8), (_58410, 8), (_58409, 8), (_58408, 8), (_58407, 8), (_58406, 8), (_58405, 8), (_58404, 8), (_58403, 8), (_58402, 8), (_58401, 8), (_58400, 8), (_58399, 8), (_58398, 8), (_58397, 8), (_58751, 8), (_58750, 8), (_58749, 8), (_58748, 8), (_58747, 8), (_58746, 8), (_58745, 8), (_58744, 8), (_58743, 8), (_58742, 8), (_58741, 8), (_58740, 8), (_58739, 8), (_58738, 8), (_58737, 8), (_58736, 8), (_58735, 8), (_58734, 8), (_58733, 8), (_58732, 8), (_58731, 8), (_58730, 8), (_58729, 8), (_58728, 8), (_58727, 8), (_58726, 8), (_58725, 8), (_58724, 8), (_58723, 8), (_58722, 8), (_58721, 8), (_58720, 8), (_59074, 8), (_59073, 8), (_59072, 8), (_59071, 8), (_59070, 8), (_59069, 8), (_59068, 8), (_59067, 8), (_59066, 8), (_59065, 8), (_59064, 8), (_59063, 8), (_59062, 8), (_59061, 8), (_59060, 8), (_59059, 8), (_59058, 8), (_59057, 8), (_59056, 8), (_59055, 8), (_59054, 8), (_59053, 8), (_59052, 8), (_59051, 8), (_59050, 8), (_59049, 8), (_59048, 8), (_59047, 8), (_59046, 8), (_59045, 8), (_59044, 8), (_59043, 8), (_59397, 8), (_59396, 8), (_59395, 8), (_59394, 8), (_59393, 8), (_59392, 8), (_59391, 8), (_59390, 8), (_59389, 8), (_59388, 8), (_59387, 8), (_59386, 8), (_59385, 8), (_59384, 8), (_59383, 8), (_59382, 8), (_59381, 8), (_59380, 8), (_59379, 8), (_59378, 8), (_59377, 8), (_59376, 8), (_59375, 8), (_59374, 8), (_59373, 8), (_59372, 8), (_59371, 8), (_59370, 8), (_59369, 8), (_59368, 8), (_59367, 8), (_59366, 8), (_59720, 8), (_59719, 8), (_59718, 8), (_59717, 8), (_59716, 8), (_59715, 8), (_59714, 8), (_59713, 8), (_59712, 8), (_59711, 8), (_59710, 8), (_59709, 8), (_59708, 8), (_59707, 8), (_59706, 8), (_59705, 8), (_59704, 8), (_59703, 8), (_59702, 8), (_59701, 8), (_59700, 8), (_59699, 8), (_59698, 8), (_59697, 8), (_59696, 8), (_59695, 8), (_59694, 8), (_59693, 8), (_59692, 8), (_59691, 8), (_59690, 8), (_59689, 8), (_60043, 8), (_60042, 8), (_60041, 8), (_60040, 8), (_60039, 8), (_60038, 8), (_60037, 8), (_60036, 8), (_60035, 8), (_60034, 8), (_60033, 8), (_60032, 8), (_60031, 8), (_60030, 8), (_60029, 8), (_60028, 8), (_60027, 8), (_60026, 8), (_60025, 8), (_60024, 8), (_60023, 8), (_60022, 8), (_60021, 8), (_60020, 8), (_60019, 8), (_60018, 8), (_60017, 8), (_60016, 8), (_60015, 8), (_60014, 8), (_60013, 8), (_60012, 8), (_60366, 8), (_60365, 8), (_60364, 8), (_60363, 8), (_60362, 8), (_60361, 8), (_60360, 8), (_60359, 8), (_60358, 8), (_60357, 8), (_60356, 8), (_60355, 8), (_60354, 8), (_60353, 8), (_60352, 8), (_60351, 8), (_60350, 8), (_60349, 8), (_60348, 8), (_60347, 8), (_60346, 8), (_60345, 8), (_60344, 8), (_60343, 8), (_60342, 8), (_60341, 8), (_60340, 8), (_60339, 8), (_60338, 8), (_60337, 8), (_60336, 8), (_60335, 8), (_60689, 8), (_60688, 8), (_60687, 8), (_60686, 8), (_60685, 8), (_60684, 8), (_60683, 8), (_60682, 8), (_60681, 8), (_60680, 8), (_60679, 8), (_60678, 8), (_60677, 8), (_60676, 8), (_60675, 8), (_60674, 8), (_60673, 8), (_60672, 8), (_60671, 8), (_60670, 8), (_60669, 8), (_60668, 8), (_60667, 8), (_60666, 8), (_60665, 8), (_60664, 8), (_60663, 8), (_60662, 8), (_60661, 8), (_60660, 8), (_60659, 8), (_60658, 8), (_61012, 8), (_61011, 8), (_61010, 8), (_61009, 8), (_61008, 8), (_61007, 8), (_61006, 8), (_61005, 8), (_61004, 8), (_61003, 8), (_61002, 8), (_61001, 8), (_61000, 8), (_60999, 8), (_60998, 8), (_60997, 8), (_60996, 8), (_60995, 8), (_60994, 8), (_60993, 8), (_60992, 8), (_60991, 8), (_60990, 8), (_60989, 8), (_60988, 8), (_60987, 8), (_60986, 8), (_60985, 8), (_60984, 8), (_60983, 8), (_60982, 8), (_60981, 8), (_61335, 8), (_61334, 8), (_61333, 8), (_61332, 8), (_61331, 8), (_61330, 8), (_61329, 8), (_61328, 8), (_61327, 8), (_61326, 8), (_61325, 8), (_61324, 8), (_61323, 8), (_61322, 8), (_61321, 8), (_61320, 8), (_61319, 8), (_61318, 8), (_61317, 8), (_61316, 8), (_61315, 8), (_61314, 8), (_61313, 8), (_61312, 8), (_61311, 8), (_61310, 8), (_61309, 8), (_61308, 8), (_61307, 8), (_61306, 8), (_61305, 8), (_61304, 8), (_61658, 8), (_61657, 8), (_61656, 8), (_61655, 8), (_61654, 8), (_61653, 8), (_61652, 8), (_61651, 8), (_61650, 8), (_61649, 8), (_61648, 8), (_61647, 8), (_61646, 8), (_61645, 8), (_61644, 8), (_61643, 8), (_61642, 8), (_61641, 8), (_61640, 8), (_61639, 8), (_61638, 8), (_61637, 8), (_61636, 8), (_61635, 8), (_61634, 8), (_61633, 8), (_61632, 8), (_61631, 8), (_61630, 8), (_61629, 8), (_61628, 8), (_61627, 8), (_61981, 8), (_61980, 8), (_61979, 8), (_61978, 8), (_61977, 8), (_61976, 8), (_61975, 8), (_61974, 8), (_61973, 8), (_61972, 8), (_61971, 8), (_61970, 8), (_61969, 8), (_61968, 8), (_61967, 8), (_61966, 8), (_61965, 8), (_61964, 8), (_61963, 8), (_61962, 8), (_61961, 8), (_61960, 8), (_61959, 8), (_61958, 8), (_61957, 8), (_61956, 8), (_61955, 8), (_61954, 8), (_61953, 8), (_61952, 8), (_61951, 8), (_61950, 8), (_62304, 8), (_62303, 8), (_62302, 8), (_62301, 8), (_62300, 8), (_62299, 8), (_62298, 8), (_62297, 8), (_62296, 8), (_62295, 8), (_62294, 8), (_62293, 8), (_62292, 8), (_62291, 8), (_62290, 8), (_62289, 8), (_62288, 8), (_62287, 8), (_62286, 8), (_62285, 8), (_62284, 8), (_62283, 8), (_62282, 8), (_62281, 8), (_62280, 8), (_62279, 8), (_62278, 8), (_62277, 8), (_62276, 8), (_62275, 8), (_62274, 8), (_62273, 8), (_62627, 8), (_62626, 8), (_62625, 8), (_62624, 8), (_62623, 8), (_62622, 8), (_62621, 8), (_62620, 8), (_62619, 8), (_62618, 8), (_62617, 8), (_62616, 8), (_62615, 8), (_62614, 8), (_62613, 8), (_62612, 8), (_62611, 8), (_62610, 8), (_62609, 8), (_62608, 8), (_62607, 8), (_62606, 8), (_62605, 8), (_62604, 8), (_62603, 8), (_62602, 8), (_62601, 8), (_62600, 8), (_62599, 8), (_62598, 8), (_62597, 8), (_62596, 8), (_62950, 8), (_62949, 8), (_62948, 8), (_62947, 8), (_62946, 8), (_62945, 8), (_62944, 8), (_62943, 8), (_62942, 8), (_62941, 8), (_62940, 8), (_62939, 8), (_62938, 8), (_62937, 8), (_62936, 8), (_62935, 8), (_62934, 8), (_62933, 8), (_62932, 8), (_62931, 8), (_62930, 8), (_62929, 8), (_62928, 8), (_62927, 8), (_62926, 8), (_62925, 8), (_62924, 8), (_62923, 8), (_62922, 8), (_62921, 8), (_62920, 8), (_62919, 8), (_63273, 8), (_63272, 8), (_63271, 8), (_63270, 8), (_63269, 8), (_63268, 8), (_63267, 8), (_63266, 8), (_63265, 8), (_63264, 8), (_63263, 8), (_63262, 8), (_63261, 8), (_63260, 8), (_63259, 8), (_63258, 8), (_63257, 8), (_63256, 8), (_63255, 8), (_63254, 8), (_63253, 8), (_63252, 8), (_63251, 8), (_63250, 8), (_63249, 8), (_63248, 8), (_63247, 8), (_63246, 8), (_63245, 8), (_63244, 8), (_63243, 8), (_63242, 8), (_63596, 8), (_63595, 8), (_63594, 8), (_63593, 8), (_63592, 8), (_63591, 8), (_63590, 8), (_63589, 8), (_63588, 8), (_63587, 8), (_63586, 8), (_63585, 8), (_63584, 8), (_63583, 8), (_63582, 8), (_63581, 8), (_63580, 8), (_63579, 8), (_63578, 8), (_63577, 8), (_63576, 8), (_63575, 8), (_63574, 8), (_63573, 8), (_63572, 8), (_63571, 8), (_63570, 8), (_63569, 8), (_63568, 8), (_63567, 8), (_63566, 8), (_63565, 8), (_63919, 8), (_63918, 8), (_63917, 8), (_63916, 8), (_63915, 8), (_63914, 8), (_63913, 8), (_63912, 8), (_63911, 8), (_63910, 8), (_63909, 8), (_63908, 8), (_63907, 8), (_63906, 8), (_63905, 8), (_63904, 8), (_63903, 8), (_63902, 8), (_63901, 8), (_63900, 8), (_63899, 8), (_63898, 8), (_63897, 8), (_63896, 8), (_63895, 8), (_63894, 8), (_63893, 8), (_63892, 8), (_63891, 8), (_63890, 8), (_63889, 8), (_63888, 8), (_64242, 8), (_64241, 8), (_64240, 8), (_64239, 8), (_64238, 8), (_64237, 8), (_64236, 8), (_64235, 8), (_64234, 8), (_64233, 8), (_64232, 8), (_64231, 8), (_64230, 8), (_64229, 8), (_64228, 8), (_64227, 8), (_64226, 8), (_64225, 8), (_64224, 8), (_64223, 8), (_64222, 8), (_64221, 8), (_64220, 8), (_64219, 8), (_64218, 8), (_64217, 8), (_64216, 8), (_64215, 8), (_64214, 8), (_64213, 8), (_64212, 8), (_64211, 8), (_64565, 8), (_64564, 8), (_64563, 8), (_64562, 8), (_64561, 8), (_64560, 8), (_64559, 8), (_64558, 8), (_64557, 8), (_64556, 8), (_64555, 8), (_64554, 8), (_64553, 8), (_64552, 8), (_64551, 8), (_64550, 8), (_64549, 8), (_64548, 8), (_64547, 8), (_64546, 8), (_64545, 8), (_64544, 8), (_64543, 8), (_64542, 8), (_64541, 8), (_64540, 8), (_64539, 8), (_64538, 8), (_64537, 8), (_64536, 8), (_64535, 8), (_64534, 8), (_64888, 8), (_64887, 8), (_64886, 8), (_64885, 8), (_64884, 8), (_64883, 8), (_64882, 8), (_64881, 8), (_64880, 8), (_64879, 8), (_64878, 8), (_64877, 8), (_64876, 8), (_64875, 8), (_64874, 8), (_64873, 8), (_64872, 8), (_64871, 8), (_64870, 8), (_64869, 8), (_64868, 8), (_64867, 8), (_64866, 8), (_64865, 8), (_64864, 8), (_64863, 8), (_64862, 8), (_64861, 8), (_64860, 8), (_64859, 8), (_64858, 8), (_64857, 8), (_65211, 8), (_65210, 8), (_65209, 8), (_65208, 8), (_65207, 8), (_65206, 8), (_65205, 8), (_65204, 8), (_65203, 8), (_65202, 8), (_65201, 8), (_65200, 8), (_65199, 8), (_65198, 8), (_65197, 8), (_65196, 8), (_65195, 8), (_65194, 8), (_65193, 8), (_65192, 8), (_65191, 8), (_65190, 8), (_65189, 8), (_65188, 8), (_65187, 8), (_65186, 8), (_65185, 8), (_65184, 8), (_65183, 8), (_65182, 8), (_65181, 8), (_65180, 8), (_65534, 8), (_65533, 8), (_65532, 8), (_65531, 8), (_65530, 8), (_65529, 8), (_65528, 8), (_65527, 8), (_65526, 8), (_65525, 8), (_65524, 8), (_65523, 8), (_65522, 8), (_65521, 8), (_65520, 8), (_65519, 8), (_65518, 8), (_65517, 8), (_65516, 8), (_65515, 8), (_65514, 8), (_65513, 8), (_65512, 8), (_65511, 8), (_65510, 8), (_65509, 8), (_65508, 8), (_65507, 8), (_65506, 8), (_65505, 8), (_65504, 8), (_65503, 8), (_65857, 8), (_65856, 8), (_65855, 8), (_65854, 8), (_65853, 8), (_65852, 8), (_65851, 8), (_65850, 8), (_65849, 8), (_65848, 8), (_65847, 8), (_65846, 8), (_65845, 8), (_65844, 8), (_65843, 8), (_65842, 8), (_65841, 8), (_65840, 8), (_65839, 8), (_65838, 8), (_65837, 8), (_65836, 8), (_65835, 8), (_65834, 8), (_65833, 8), (_65832, 8), (_65831, 8), (_65830, 8), (_65829, 8), (_65828, 8), (_65827, 8), (_65826, 8), (_66180, 8), (_66179, 8), (_66178, 8), (_66177, 8), (_66176, 8), (_66175, 8), (_66174, 8), (_66173, 8), (_66172, 8), (_66171, 8), (_66170, 8), (_66169, 8), (_66168, 8), (_66167, 8), (_66166, 8), (_66165, 8), (_66164, 8), (_66163, 8), (_66162, 8), (_66161, 8), (_66160, 8), (_66159, 8), (_66158, 8), (_66157, 8), (_66156, 8), (_66155, 8), (_66154, 8), (_66153, 8), (_66152, 8), (_66151, 8), (_66150, 8), (_66149, 8), (_66503, 8), (_66502, 8), (_66501, 8), (_66500, 8), (_66499, 8), (_66498, 8), (_66497, 8), (_66496, 8), (_66495, 8), (_66494, 8), (_66493, 8), (_66492, 8), (_66491, 8), (_66490, 8), (_66489, 8), (_66488, 8), (_66487, 8), (_66486, 8), (_66485, 8), (_66484, 8), (_66483, 8), (_66482, 8), (_66481, 8), (_66480, 8), (_66479, 8), (_66478, 8), (_66477, 8), (_66476, 8), (_66475, 8), (_66474, 8), (_66473, 8), (_66472, 8), (_66826, 8), (_66825, 8), (_66824, 8), (_66823, 8), (_66822, 8), (_66821, 8), (_66820, 8), (_66819, 8), (_66818, 8), (_66817, 8), (_66816, 8), (_66815, 8), (_66814, 8), (_66813, 8), (_66812, 8), (_66811, 8), (_66810, 8), (_66809, 8), (_66808, 8), (_66807, 8), (_66806, 8), (_66805, 8), (_66804, 8), (_66803, 8), (_66802, 8), (_66801, 8), (_66800, 8), (_66799, 8), (_66798, 8), (_66797, 8), (_66796, 8), (_66795, 8), (_67149, 8), (_67148, 8), (_67147, 8), (_67146, 8), (_67145, 8), (_67144, 8), (_67143, 8), (_67142, 8), (_67141, 8), (_67140, 8), (_67139, 8), (_67138, 8), (_67137, 8), (_67136, 8), (_67135, 8), (_67134, 8), (_67133, 8), (_67132, 8), (_67131, 8), (_67130, 8), (_67129, 8), (_67128, 8), (_67127, 8), (_67126, 8), (_67125, 8), (_67124, 8), (_67123, 8), (_67122, 8), (_67121, 8), (_67120, 8), (_67119, 8), (_67118, 8), (_67472, 8), (_67471, 8), (_67470, 8), (_67469, 8), (_67468, 8), (_67467, 8), (_67466, 8), (_67465, 8), (_67464, 8), (_67463, 8), (_67462, 8), (_67461, 8), (_67460, 8), (_67459, 8), (_67458, 8), (_67457, 8), (_67456, 8), (_67455, 8), (_67454, 8), (_67453, 8), (_67452, 8), (_67451, 8), (_67450, 8), (_67449, 8), (_67448, 8), (_67447, 8), (_67446, 8), (_67445, 8), (_67444, 8), (_67443, 8), (_67442, 8), (_67441, 8), (_67795, 8), (_67794, 8), (_67793, 8), (_67792, 8), (_67791, 8), (_67790, 8), (_67789, 8), (_67788, 8), (_67787, 8), (_67786, 8), (_67785, 8), (_67784, 8), (_67783, 8), (_67782, 8), (_67781, 8), (_67780, 8), (_67779, 8), (_67778, 8), (_67777, 8), (_67776, 8), (_67775, 8), (_67774, 8), (_67773, 8), (_67772, 8), (_67771, 8), (_67770, 8), (_67769, 8), (_67768, 8), (_67767, 8), (_67766, 8), (_67765, 8), (_67764, 8), (_68118, 8), (_68117, 8), (_68116, 8), (_68115, 8), (_68114, 8), (_68113, 8), (_68112, 8), (_68111, 8), (_68110, 8), (_68109, 8), (_68108, 8), (_68107, 8), (_68106, 8), (_68105, 8), (_68104, 8), (_68103, 8), (_68102, 8), (_68101, 8), (_68100, 8), (_68099, 8), (_68098, 8), (_68097, 8), (_68096, 8), (_68095, 8), (_68094, 8), (_68093, 8), (_68092, 8), (_68091, 8), (_68090, 8), (_68089, 8), (_68088, 8), (_68087, 8), (_68441, 8), (_68440, 8), (_68439, 8), (_68438, 8), (_68437, 8), (_68436, 8), (_68435, 8), (_68434, 8), (_68433, 8), (_68432, 8), (_68431, 8), (_68430, 8), (_68429, 8), (_68428, 8), (_68427, 8), (_68426, 8), (_68425, 8), (_68424, 8), (_68423, 8), (_68422, 8), (_68421, 8), (_68420, 8), (_68419, 8), (_68418, 8), (_68417, 8), (_68416, 8), (_68415, 8), (_68414, 8), (_68413, 8), (_68412, 8), (_68411, 8), (_68410, 8), (_68764, 8), (_68763, 8), (_68762, 8), (_68761, 8), (_68760, 8), (_68759, 8), (_68758, 8), (_68757, 8), (_68756, 8), (_68755, 8), (_68754, 8), (_68753, 8), (_68752, 8), (_68751, 8), (_68750, 8), (_68749, 8), (_68748, 8), (_68747, 8), (_68746, 8), (_68745, 8), (_68744, 8), (_68743, 8), (_68742, 8), (_68741, 8), (_68740, 8), (_68739, 8), (_68738, 8), (_68737, 8), (_68736, 8), (_68735, 8), (_68734, 8), (_68733, 8), (_69087, 8), (_69086, 8), (_69085, 8), (_69084, 8), (_69083, 8), (_69082, 8), (_69081, 8), (_69080, 8), (_69079, 8), (_69078, 8), (_69077, 8), (_69076, 8), (_69075, 8), (_69074, 8), (_69073, 8), (_69072, 8), (_69071, 8), (_69070, 8), (_69069, 8), (_69068, 8), (_69067, 8), (_69066, 8), (_69065, 8), (_69064, 8), (_69063, 8), (_69062, 8), (_69061, 8), (_69060, 8), (_69059, 8), (_69058, 8), (_69057, 8), (_69056, 8), (_69410, 8), (_69409, 8), (_69408, 8), (_69407, 8), (_69406, 8), (_69405, 8), (_69404, 8), (_69403, 8), (_69402, 8), (_69401, 8), (_69400, 8), (_69399, 8), (_69398, 8), (_69397, 8), (_69396, 8), (_69395, 8), (_69394, 8), (_69393, 8), (_69392, 8), (_69391, 8), (_69390, 8), (_69389, 8), (_69388, 8), (_69387, 8), (_69386, 8), (_69385, 8), (_69384, 8), (_69383, 8), (_69382, 8), (_69381, 8), (_69380, 8), (_69379, 8), (_69733, 8), (_69732, 8), (_69731, 8), (_69730, 8), (_69729, 8), (_69728, 8), (_69727, 8), (_69726, 8), (_69725, 8), (_69724, 8), (_69723, 8), (_69722, 8), (_69721, 8), (_69720, 8), (_69719, 8), (_69718, 8), (_69717, 8), (_69716, 8), (_69715, 8), (_69714, 8), (_69713, 8), (_69712, 8), (_69711, 8), (_69710, 8), (_69709, 8), (_69708, 8), (_69707, 8), (_69706, 8), (_69705, 8), (_69704, 8), (_69703, 8), (_69702, 8), (_70056, 8), (_70055, 8), (_70054, 8), (_70053, 8), (_70052, 8), (_70051, 8), (_70050, 8), (_70049, 8), (_70048, 8), (_70047, 8), (_70046, 8), (_70045, 8), (_70044, 8), (_70043, 8), (_70042, 8), (_70041, 8), (_70040, 8), (_70039, 8), (_70038, 8), (_70037, 8), (_70036, 8), (_70035, 8), (_70034, 8), (_70033, 8), (_70032, 8), (_70031, 8), (_70030, 8), (_70029, 8), (_70028, 8), (_70027, 8), (_70026, 8), (_70025, 8), (_70379, 8), (_70378, 8), (_70377, 8), (_70376, 8), (_70375, 8), (_70374, 8), (_70373, 8), (_70372, 8), (_70371, 8), (_70370, 8), (_70369, 8), (_70368, 8), (_70367, 8), (_70366, 8), (_70365, 8), (_70364, 8), (_70363, 8), (_70362, 8), (_70361, 8), (_70360, 8), (_70359, 8), (_70358, 8), (_70357, 8), (_70356, 8), (_70355, 8), (_70354, 8), (_70353, 8), (_70352, 8), (_70351, 8), (_70350, 8), (_70349, 8), (_70348, 8), (_70702, 8), (_70701, 8), (_70700, 8), (_70699, 8), (_70698, 8), (_70697, 8), (_70696, 8), (_70695, 8), (_70694, 8), (_70693, 8), (_70692, 8), (_70691, 8), (_70690, 8), (_70689, 8), (_70688, 8), (_70687, 8), (_70686, 8), (_70685, 8), (_70684, 8), (_70683, 8), (_70682, 8), (_70681, 8), (_70680, 8), (_70679, 8), (_70678, 8), (_70677, 8), (_70676, 8), (_70675, 8), (_70674, 8), (_70673, 8), (_70672, 8), (_70671, 8), (_71025, 8), (_71024, 8), (_71023, 8), (_71022, 8), (_71021, 8), (_71020, 8), (_71019, 8), (_71018, 8), (_71017, 8), (_71016, 8), (_71015, 8), (_71014, 8), (_71013, 8), (_71012, 8), (_71011, 8), (_71010, 8), (_71009, 8), (_71008, 8), (_71007, 8), (_71006, 8), (_71005, 8), (_71004, 8), (_71003, 8), (_71002, 8), (_71001, 8), (_71000, 8), (_70999, 8), (_70998, 8), (_70997, 8), (_70996, 8), (_70995, 8), (_70994, 8), (_71348, 8), (_71347, 8), (_71346, 8), (_71345, 8), (_71344, 8), (_71343, 8), (_71342, 8), (_71341, 8), (_71340, 8), (_71339, 8), (_71338, 8), (_71337, 8), (_71336, 8), (_71335, 8), (_71334, 8), (_71333, 8), (_71332, 8), (_71331, 8), (_71330, 8), (_71329, 8), (_71328, 8), (_71327, 8), (_71326, 8), (_71325, 8), (_71324, 8), (_71323, 8), (_71322, 8), (_71321, 8), (_71320, 8), (_71319, 8), (_71318, 8), (_71317, 8), (_71671, 8), (_71670, 8), (_71669, 8), (_71668, 8), (_71667, 8), (_71666, 8), (_71665, 8), (_71664, 8), (_71663, 8), (_71662, 8), (_71661, 8), (_71660, 8), (_71659, 8), (_71658, 8), (_71657, 8), (_71656, 8), (_71655, 8), (_71654, 8), (_71653, 8), (_71652, 8), (_71651, 8), (_71650, 8), (_71649, 8), (_71648, 8), (_71647, 8), (_71646, 8), (_71645, 8), (_71644, 8), (_71643, 8), (_71642, 8), (_71641, 8), (_71640, 8), (_71994, 8), (_71993, 8), (_71992, 8), (_71991, 8), (_71990, 8), (_71989, 8), (_71988, 8), (_71987, 8), (_71986, 8), (_71985, 8), (_71984, 8), (_71983, 8), (_71982, 8), (_71981, 8), (_71980, 8), (_71979, 8), (_71978, 8), (_71977, 8), (_71976, 8), (_71975, 8), (_71974, 8), (_71973, 8), (_71972, 8), (_71971, 8), (_71970, 8), (_71969, 8), (_71968, 8), (_71967, 8), (_71966, 8), (_71965, 8), (_71964, 8), (_71963, 8), (_72317, 8), (_72316, 8), (_72315, 8), (_72314, 8), (_72313, 8), (_72312, 8), (_72311, 8), (_72310, 8), (_72309, 8), (_72308, 8), (_72307, 8), (_72306, 8), (_72305, 8), (_72304, 8), (_72303, 8), (_72302, 8), (_72301, 8), (_72300, 8), (_72299, 8), (_72298, 8), (_72297, 8), (_72296, 8), (_72295, 8), (_72294, 8), (_72293, 8), (_72292, 8), (_72291, 8), (_72290, 8), (_72289, 8), (_72288, 8), (_72287, 8), (_72286, 8), (_72640, 8), (_72639, 8), (_72638, 8), (_72637, 8), (_72636, 8), (_72635, 8), (_72634, 8), (_72633, 8), (_72632, 8), (_72631, 8), (_72630, 8), (_72629, 8), (_72628, 8), (_72627, 8), (_72626, 8), (_72625, 8), (_72624, 8), (_72623, 8), (_72622, 8), (_72621, 8), (_72620, 8), (_72619, 8), (_72618, 8), (_72617, 8), (_72616, 8), (_72615, 8), (_72614, 8), (_72613, 8), (_72612, 8), (_72611, 8), (_72610, 8), (_72609, 8), (_72963, 8), (_72962, 8), (_72961, 8), (_72960, 8), (_72959, 8), (_72958, 8), (_72957, 8), (_72956, 8), (_72955, 8), (_72954, 8), (_72953, 8), (_72952, 8), (_72951, 8), (_72950, 8), (_72949, 8), (_72948, 8), (_72947, 8), (_72946, 8), (_72945, 8), (_72944, 8), (_72943, 8), (_72942, 8), (_72941, 8), (_72940, 8), (_72939, 8), (_72938, 8), (_72937, 8), (_72936, 8), (_72935, 8), (_72934, 8), (_72933, 8), (_72932, 8), (_73286, 8), (_73285, 8), (_73284, 8), (_73283, 8), (_73282, 8), (_73281, 8), (_73280, 8), (_73279, 8), (_73278, 8), (_73277, 8), (_73276, 8), (_73275, 8), (_73274, 8), (_73273, 8), (_73272, 8), (_73271, 8), (_73270, 8), (_73269, 8), (_73268, 8), (_73267, 8), (_73266, 8), (_73265, 8), (_73264, 8), (_73263, 8), (_73262, 8), (_73261, 8), (_73260, 8), (_73259, 8), (_73258, 8), (_73257, 8), (_73256, 8), (_73255, 8), (_73609, 8), (_73608, 8), (_73607, 8), (_73606, 8), (_73605, 8), (_73604, 8), (_73603, 8), (_73602, 8), (_73601, 8), (_73600, 8), (_73599, 8), (_73598, 8), (_73597, 8), (_73596, 8), (_73595, 8), (_73594, 8), (_73593, 8), (_73592, 8), (_73591, 8), (_73590, 8), (_73589, 8), (_73588, 8), (_73587, 8), (_73586, 8), (_73585, 8), (_73584, 8), (_73583, 8), (_73582, 8), (_73581, 8), (_73580, 8), (_73579, 8), (_73578, 8), (_73932, 8), (_73931, 8), (_73930, 8), (_73929, 8), (_73928, 8), (_73927, 8), (_73926, 8), (_73925, 8), (_73924, 8), (_73923, 8), (_73922, 8), (_73921, 8), (_73920, 8), (_73919, 8), (_73918, 8), (_73917, 8), (_73916, 8), (_73915, 8), (_73914, 8), (_73913, 8), (_73912, 8), (_73911, 8), (_73910, 8), (_73909, 8), (_73908, 8), (_73907, 8), (_73906, 8), (_73905, 8), (_73904, 8), (_73903, 8), (_73902, 8), (_73901, 8), (_74255, 8), (_74254, 8), (_74253, 8), (_74252, 8), (_74251, 8), (_74250, 8), (_74249, 8), (_74248, 8), (_74247, 8), (_74246, 8), (_74245, 8), (_74244, 8), (_74243, 8), (_74242, 8), (_74241, 8), (_74240, 8), (_74239, 8), (_74238, 8), (_74237, 8), (_74236, 8), (_74235, 8), (_74234, 8), (_74233, 8), (_74232, 8), (_74231, 8), (_74230, 8), (_74229, 8), (_74228, 8), (_74227, 8), (_74226, 8), (_74225, 8), (_74224, 8), (_74578, 8), (_74577, 8), (_74576, 8), (_74575, 8), (_74574, 8), (_74573, 8), (_74572, 8), (_74571, 8), (_74570, 8), (_74569, 8), (_74568, 8), (_74567, 8), (_74566, 8), (_74565, 8), (_74564, 8), (_74563, 8), (_74562, 8), (_74561, 8), (_74560, 8), (_74559, 8), (_74558, 8), (_74557, 8), (_74556, 8), (_74555, 8), (_74554, 8), (_74553, 8), (_74552, 8), (_74551, 8), (_74550, 8), (_74549, 8), (_74548, 8), (_74547, 8), (_74901, 8), (_74900, 8), (_74899, 8), (_74898, 8), (_74897, 8), (_74896, 8), (_74895, 8), (_74894, 8), (_74893, 8), (_74892, 8), (_74891, 8), (_74890, 8), (_74889, 8), (_74888, 8), (_74887, 8), (_74886, 8), (_74885, 8), (_74884, 8), (_74883, 8), (_74882, 8), (_74881, 8), (_74880, 8), (_74879, 8), (_74878, 8), (_74877, 8), (_74876, 8), (_74875, 8), (_74874, 8), (_74873, 8), (_74872, 8), (_74871, 8), (_74870, 8), (_75224, 8), (_75223, 8), (_75222, 8), (_75221, 8), (_75220, 8), (_75219, 8), (_75218, 8), (_75217, 8), (_75216, 8), (_75215, 8), (_75214, 8), (_75213, 8), (_75212, 8), (_75211, 8), (_75210, 8), (_75209, 8), (_75208, 8), (_75207, 8), (_75206, 8), (_75205, 8), (_75204, 8), (_75203, 8), (_75202, 8), (_75201, 8), (_75200, 8), (_75199, 8), (_75198, 8), (_75197, 8), (_75196, 8), (_75195, 8), (_75194, 8), (_75193, 8), (_75547, 8), (_75546, 8), (_75545, 8), (_75544, 8), (_75543, 8), (_75542, 8), (_75541, 8), (_75540, 8), (_75539, 8), (_75538, 8), (_75537, 8), (_75536, 8), (_75535, 8), (_75534, 8), (_75533, 8), (_75532, 8), (_75531, 8), (_75530, 8), (_75529, 8), (_75528, 8), (_75527, 8), (_75526, 8), (_75525, 8), (_75524, 8), (_75523, 8), (_75522, 8), (_75521, 8), (_75520, 8), (_75519, 8), (_75518, 8), (_75517, 8), (_75516, 8), (_75870, 8), (_75869, 8), (_75868, 8), (_75867, 8), (_75866, 8), (_75865, 8), (_75864, 8), (_75863, 8), (_75862, 8), (_75861, 8), (_75860, 8), (_75859, 8), (_75858, 8), (_75857, 8), (_75856, 8), (_75855, 8), (_75854, 8), (_75853, 8), (_75852, 8), (_75851, 8), (_75850, 8), (_75849, 8), (_75848, 8), (_75847, 8), (_75846, 8), (_75845, 8), (_75844, 8), (_75843, 8), (_75842, 8), (_75841, 8), (_75840, 8), (_75839, 8), (_76193, 8), (_76192, 8), (_76191, 8), (_76190, 8), (_76189, 8), (_76188, 8), (_76187, 8), (_76186, 8), (_76185, 8), (_76184, 8), (_76183, 8), (_76182, 8), (_76181, 8), (_76180, 8), (_76179, 8), (_76178, 8), (_76177, 8), (_76176, 8), (_76175, 8), (_76174, 8), (_76173, 8), (_76172, 8), (_76171, 8), (_76170, 8), (_76169, 8), (_76168, 8), (_76167, 8), (_76166, 8), (_76165, 8), (_76164, 8), (_76163, 8), (_76162, 8), (_76516, 8), (_76515, 8), (_76514, 8), (_76513, 8), (_76512, 8), (_76511, 8), (_76510, 8), (_76509, 8), (_76508, 8), (_76507, 8), (_76506, 8), (_76505, 8), (_76504, 8), (_76503, 8), (_76502, 8), (_76501, 8), (_76500, 8), (_76499, 8), (_76498, 8), (_76497, 8), (_76496, 8), (_76495, 8), (_76494, 8), (_76493, 8), (_76492, 8), (_76491, 8), (_76490, 8), (_76489, 8), (_76488, 8), (_76487, 8), (_76486, 8), (_76485, 8), (_76839, 8), (_76838, 8), (_76837, 8), (_76836, 8), (_76835, 8), (_76834, 8), (_76833, 8), (_76832, 8), (_76831, 8), (_76830, 8), (_76829, 8), (_76828, 8), (_76827, 8), (_76826, 8), (_76825, 8), (_76824, 8), (_76823, 8), (_76822, 8), (_76821, 8), (_76820, 8), (_76819, 8), (_76818, 8), (_76817, 8), (_76816, 8), (_76815, 8), (_76814, 8), (_76813, 8), (_76812, 8), (_76811, 8), (_76810, 8), (_76809, 8), (_76808, 8), (_77162, 8), (_77161, 8), (_77160, 8), (_77159, 8), (_77158, 8), (_77157, 8), (_77156, 8), (_77155, 8), (_77154, 8), (_77153, 8), (_77152, 8), (_77151, 8), (_77150, 8), (_77149, 8), (_77148, 8), (_77147, 8), (_77146, 8), (_77145, 8), (_77144, 8), (_77143, 8), (_77142, 8), (_77141, 8), (_77140, 8), (_77139, 8), (_77138, 8), (_77137, 8), (_77136, 8), (_77135, 8), (_77134, 8), (_77133, 8), (_77132, 8), (_77131, 8), (_77485, 8), (_77484, 8), (_77483, 8), (_77482, 8), (_77481, 8), (_77480, 8), (_77479, 8), (_77478, 8), (_77477, 8), (_77476, 8), (_77475, 8), (_77474, 8), (_77473, 8), (_77472, 8), (_77471, 8), (_77470, 8), (_77469, 8), (_77468, 8), (_77467, 8), (_77466, 8), (_77465, 8), (_77464, 8), (_77463, 8), (_77462, 8), (_77461, 8), (_77460, 8), (_77459, 8), (_77458, 8), (_77457, 8), (_77456, 8), (_77455, 8), (_77454, 8), (_77808, 8), (_77807, 8), (_77806, 8), (_77805, 8), (_77804, 8), (_77803, 8), (_77802, 8), (_77801, 8), (_77800, 8), (_77799, 8), (_77798, 8), (_77797, 8), (_77796, 8), (_77795, 8), (_77794, 8), (_77793, 8), (_77792, 8), (_77791, 8), (_77790, 8), (_77789, 8), (_77788, 8), (_77787, 8), (_77786, 8), (_77785, 8), (_77784, 8), (_77783, 8), (_77782, 8), (_77781, 8), (_77780, 8), (_77779, 8), (_77778, 8), (_77777, 8), (_78131, 8), (_78130, 8), (_78129, 8), (_78128, 8), (_78127, 8), (_78126, 8), (_78125, 8), (_78124, 8), (_78123, 8), (_78122, 8), (_78121, 8), (_78120, 8), (_78119, 8), (_78118, 8), (_78117, 8), (_78116, 8), (_78115, 8), (_78114, 8), (_78113, 8), (_78112, 8), (_78111, 8), (_78110, 8), (_78109, 8), (_78108, 8), (_78107, 8), (_78106, 8), (_78105, 8), (_78104, 8), (_78103, 8), (_78102, 8), (_78101, 8), (_78100, 8), (_78454, 8), (_78453, 8), (_78452, 8), (_78451, 8), (_78450, 8), (_78449, 8), (_78448, 8), (_78447, 8), (_78446, 8), (_78445, 8), (_78444, 8), (_78443, 8), (_78442, 8), (_78441, 8), (_78440, 8), (_78439, 8), (_78438, 8), (_78437, 8), (_78436, 8), (_78435, 8), (_78434, 8), (_78433, 8), (_78432, 8), (_78431, 8), (_78430, 8), (_78429, 8), (_78428, 8), (_78427, 8), (_78426, 8), (_78425, 8), (_78424, 8), (_78423, 8), (_78777, 8), (_78776, 8), (_78775, 8), (_78774, 8), (_78773, 8), (_78772, 8), (_78771, 8), (_78770, 8), (_78769, 8), (_78768, 8), (_78767, 8), (_78766, 8), (_78765, 8), (_78764, 8), (_78763, 8), (_78762, 8), (_78761, 8), (_78760, 8), (_78759, 8), (_78758, 8), (_78757, 8), (_78756, 8), (_78755, 8), (_78754, 8), (_78753, 8), (_78752, 8), (_78751, 8), (_78750, 8), (_78749, 8), (_78748, 8), (_78747, 8), (_78746, 8), (_79100, 8), (_79099, 8), (_79098, 8), (_79097, 8), (_79096, 8), (_79095, 8), (_79094, 8), (_79093, 8), (_79092, 8), (_79091, 8), (_79090, 8), (_79089, 8), (_79088, 8), (_79087, 8), (_79086, 8), (_79085, 8), (_79084, 8), (_79083, 8), (_79082, 8), (_79081, 8), (_79080, 8), (_79079, 8), (_79078, 8), (_79077, 8), (_79076, 8), (_79075, 8), (_79074, 8), (_79073, 8), (_79072, 8), (_79071, 8), (_79070, 8), (_79069, 8), (_79423, 8), (_79422, 8), (_79421, 8), (_79420, 8), (_79419, 8), (_79418, 8), (_79417, 8), (_79416, 8), (_79415, 8), (_79414, 8), (_79413, 8), (_79412, 8), (_79411, 8), (_79410, 8), (_79409, 8), (_79408, 8), (_79407, 8), (_79406, 8), (_79405, 8), (_79404, 8), (_79403, 8), (_79402, 8), (_79401, 8), (_79400, 8), (_79399, 8), (_79398, 8), (_79397, 8), (_79396, 8), (_79395, 8), (_79394, 8), (_79393, 8), (_79392, 8), (_79746, 8), (_79745, 8), (_79744, 8), (_79743, 8), (_79742, 8), (_79741, 8), (_79740, 8), (_79739, 8), (_79738, 8), (_79737, 8), (_79736, 8), (_79735, 8), (_79734, 8), (_79733, 8), (_79732, 8), (_79731, 8), (_79730, 8), (_79729, 8), (_79728, 8), (_79727, 8), (_79726, 8), (_79725, 8), (_79724, 8), (_79723, 8), (_79722, 8), (_79721, 8), (_79720, 8), (_79719, 8), (_79718, 8), (_79717, 8), (_79716, 8), (_79715, 8), (_80069, 8), (_80068, 8), (_80067, 8), (_80066, 8), (_80065, 8), (_80064, 8), (_80063, 8), (_80062, 8), (_80061, 8), (_80060, 8), (_80059, 8), (_80058, 8), (_80057, 8), (_80056, 8), (_80055, 8), (_80054, 8), (_80053, 8), (_80052, 8), (_80051, 8), (_80050, 8), (_80049, 8), (_80048, 8), (_80047, 8), (_80046, 8), (_80045, 8), (_80044, 8), (_80043, 8), (_80042, 8), (_80041, 8), (_80040, 8), (_80039, 8), (_80038, 8), (_80392, 8), (_80391, 8), (_80390, 8), (_80389, 8), (_80388, 8), (_80387, 8), (_80386, 8), (_80385, 8), (_80384, 8), (_80383, 8), (_80382, 8), (_80381, 8), (_80380, 8), (_80379, 8), (_80378, 8), (_80377, 8), (_80376, 8), (_80375, 8), (_80374, 8), (_80373, 8), (_80372, 8), (_80371, 8), (_80370, 8), (_80369, 8), (_80368, 8), (_80367, 8), (_80366, 8), (_80365, 8), (_80364, 8), (_80363, 8), (_80362, 8), (_80361, 8), (_80715, 8), (_80714, 8), (_80713, 8), (_80712, 8), (_80711, 8), (_80710, 8), (_80709, 8), (_80708, 8), (_80707, 8), (_80706, 8), (_80705, 8), (_80704, 8), (_80703, 8), (_80702, 8), (_80701, 8), (_80700, 8), (_80699, 8), (_80698, 8), (_80697, 8), (_80696, 8), (_80695, 8), (_80694, 8), (_80693, 8), (_80692, 8), (_80691, 8), (_80690, 8), (_80689, 8), (_80688, 8), (_80687, 8), (_80686, 8), (_80685, 8), (_80684, 8), (_81038, 8), (_81037, 8), (_81036, 8), (_81035, 8), (_81034, 8), (_81033, 8), (_81032, 8), (_81031, 8), (_81030, 8), (_81029, 8), (_81028, 8), (_81027, 8), (_81026, 8), (_81025, 8), (_81024, 8), (_81023, 8), (_81022, 8), (_81021, 8), (_81020, 8), (_81019, 8), (_81018, 8), (_81017, 8), (_81016, 8), (_81015, 8), (_81014, 8), (_81013, 8), (_81012, 8), (_81011, 8), (_81010, 8), (_81009, 8), (_81008, 8), (_81007, 8), (_81361, 8), (_81360, 8), (_81359, 8), (_81358, 8), (_81357, 8), (_81356, 8), (_81355, 8), (_81354, 8), (_81353, 8), (_81352, 8), (_81351, 8), (_81350, 8), (_81349, 8), (_81348, 8), (_81347, 8), (_81346, 8), (_81345, 8), (_81344, 8), (_81343, 8), (_81342, 8), (_81341, 8), (_81340, 8), (_81339, 8), (_81338, 8), (_81337, 8), (_81336, 8), (_81335, 8), (_81334, 8), (_81333, 8), (_81332, 8), (_81331, 8), (_81330, 8), (_81684, 8), (_81683, 8), (_81682, 8), (_81681, 8), (_81680, 8), (_81679, 8), (_81678, 8), (_81677, 8), (_81676, 8), (_81675, 8), (_81674, 8), (_81673, 8), (_81672, 8), (_81671, 8), (_81670, 8), (_81669, 8), (_81668, 8), (_81667, 8), (_81666, 8), (_81665, 8), (_81664, 8), (_81663, 8), (_81662, 8), (_81661, 8), (_81660, 8), (_81659, 8), (_81658, 8), (_81657, 8), (_81656, 8), (_81655, 8), (_81654, 8), (_81653, 8), (_82007, 8), (_82006, 8), (_82005, 8), (_82004, 8), (_82003, 8), (_82002, 8), (_82001, 8), (_82000, 8), (_81999, 8), (_81998, 8), (_81997, 8), (_81996, 8), (_81995, 8), (_81994, 8), (_81993, 8), (_81992, 8), (_81991, 8), (_81990, 8), (_81989, 8), (_81988, 8), (_81987, 8), (_81986, 8), (_81985, 8), (_81984, 8), (_81983, 8), (_81982, 8), (_81981, 8), (_81980, 8), (_81979, 8), (_81978, 8), (_81977, 8), (_81976, 8), (_82330, 8), (_82329, 8), (_82328, 8), (_82327, 8), (_82326, 8), (_82325, 8), (_82324, 8), (_82323, 8), (_82322, 8), (_82321, 8), (_82320, 8), (_82319, 8), (_82318, 8), (_82317, 8), (_82316, 8), (_82315, 8), (_82314, 8), (_82313, 8), (_82312, 8), (_82311, 8), (_82310, 8), (_82309, 8), (_82308, 8), (_82307, 8), (_82306, 8), (_82305, 8), (_82304, 8), (_82303, 8), (_82302, 8), (_82301, 8), (_82300, 8), (_82299, 8), (_82653, 8), (_82652, 8), (_82651, 8), (_82650, 8), (_82649, 8), (_82648, 8), (_82647, 8), (_82646, 8), (_82645, 8), (_82644, 8), (_82643, 8), (_82642, 8), (_82641, 8), (_82640, 8), (_82639, 8), (_82638, 8), (_82637, 8), (_82636, 8), (_82635, 8), (_82634, 8), (_82633, 8), (_82632, 8), (_82631, 8), (_82630, 8), (_82629, 8), (_82628, 8), (_82627, 8), (_82626, 8), (_82625, 8), (_82624, 8), (_82623, 8), (_82622, 8)] [_82945, _82946, _82947, _82948, _82949, _82950, _82951, _82952, _82953, _82954, _82955, _82956, _82957, _82958, _82959, _82960, _82961, _82962, _82963, _82964, _82965, _82966, _82967, _82968, _82969, _82970, _82971, _82972, _82973, _82974, _82975, _82976]", "EXPR [ (1, _256) (-1766847064778384329583297500742918515827483896875618958121606201292619776, _82945) (-6901746346790563787434755862277025452451108972170386555162524223799296, _82946) (-26959946667150639794667015087019630673637144422540572481103610249216, _82947) (-105312291668557186697918027683670432318895095400549111254310977536, _82948) (-411376139330301510538742295639337626245683966408394965837152256, _82949) (-1606938044258990275541962092341162602522202993782792835301376, _82950) (-6277101735386680763835789423207666416102355444464034512896, _82951) (-24519928653854221733733552434404946937899825954937634816, _82952) (-95780971304118053647396689196894323976171195136475136, _82953) (-374144419156711147060143317175368453031918731001856, _82954) (-1461501637330902918203684832716283019655932542976, _82955) (-5708990770823839524233143877797980545530986496, _82956) (-22300745198530623141535718272648361505980416, _82957) (-87112285931760246646623899502532662132736, _82958) (-340282366920938463463374607431768211456, _82959) (-1329227995784915872903807060280344576, _82960) (-5192296858534827628530496329220096, _82961) (-20282409603651670423947251286016, _82962) (-79228162514264337593543950336, _82963) (-309485009821345068724781056, _82964) (-1208925819614629174706176, _82965) (-4722366482869645213696, _82966) (-18446744073709551616, _82967) (-72057594037927936, _82968) (-281474976710656, _82969) (-1099511627776, _82970) (-4294967296, _82971) (-16777216, _82972) (-65536, _82973) (-256, _82974) (-1, _82975) 0 ]", "unconstrained func 0", "[Const { destination: Direct(5), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(6), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(7), bit_size: Integer(U32), value: 3 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(7), offset_address: Direct(5) }, Cast { destination: Direct(1), source: Direct(1), bit_size: Integer(U32) }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(7), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(3), op: IntegerDiv, lhs: Direct(0), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Mul, lhs: Direct(3), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Sub, lhs: Direct(0), rhs: Direct(4) }, Store { destination_pointer: Direct(9), source: Direct(4) }, BinaryIntOp { destination: Direct(9), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(6) }, Mov { destination: Direct(0), source: Direct(3) }, BinaryIntOp { destination: Direct(8), op: LessThan, bit_size: U32, lhs: Direct(9), rhs: Direct(7) }, JumpIf { condition: Direct(8), location: 7 }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, Stop { return_data: HeapVector { pointer: Direct(9), size: Direct(1) } }]", @@ -114730,14 +114730,14 @@ expression: artifact "unconstrained func 2", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "pL3NrvxNclZ7Lz32oDK+g1s5OkIGDLJkGWTMmSDu/bx7V6znhUEzaE+6EuyOrMr6P876Za694n/+5T/9w3/4H//l3//jP//n//rf//Lv/p//+Zf/8C//+E//9I//5d//03/9j3//r//4X//5j//f//m//u4v/D///b/+yz/8wx//X3/53/7nf/y3/tvf/8s//PO//uXf/fP/+Kd/+ru//H9//0//4/d/6b//t7//59/Xf/37f/njf/r5u7/8wz//pz9e/yj4n//xn/7hZ/S//u7P//bnr/9X33t5/+33IlQg/7YKWX+tgv31CmnDJ0jbPyu8+T8q+F+vUG12Fapj/lqF/9t7KGveQ3n+WyuE/00VelRh/6YK2UGF7L/pU8xHFebzV7+L/9u/B/sU/x4s7W/5F+XGe3he769VeO+vl2hnJbs/f1OBpcD4/NUC/5d/kvGhQNi/tYD331Ign/41uf8bC4T9bQWUiOi/bQ0oEH/bO4jP+7cVyPf5t32EXP4t1yf/jQVe/G0FXAX2byow/W8rUK7/6xyfv6mA1V8p8P/+8f/6+//4j//yf+yrf/n88X3/3V/e73/a73/673/G73/m73/W73/273/O73/u9791/+Xvf/t9/+vv+99/3wLvW+F9S7xvjfct8r5V7FvF7j18q9i3in2r2LeKfavYt4p9q9i3in+r+LeK30f5VvE/qvyxKp7fl/q+/FHljy/L5/uyvy/x+b6874v9/m+Gf1++VSK//7P6vnyrxLdKfKvkt0p+q+S3Sn6r5LdKft9Lft9Lfqvkt0p+q9S3Sn2rlH1f/PsS35fve6lvlervy3xf9velP9+Xb5X+Vulvlf5W6W+V/n6i/r6X/r6X/r6X+VaZ9335fqL5fqL5fqL5VplvlflWmW+V+VbZ7yfa73vZ73vZ73vZb5X9rst+P9F+P9F+P9F+q7zP517fvdq9+r3Gvea91r32vX7Lvc93hd773Ou7V7vXq/eu3rt67+q9q/fmXu/92b0/u/dnV8/8XuNe817rXq+eXT27en71/Or5fV6/9+f3/vze3/0Df973ep/X7/PGfd77V/7i6sXVi6t3/9Lf/VN/92/93T/2d//aX169vPW7f/Dv/sW/+yf/8url1bt/9e/+2b/7d//uH/67f/nv/um/+7f/6urVrd/983/37/9dAF5dvb56l4F3IXiXgncx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hxt+uOGHm2h75Tznhxt+uOGHG3644YcbfrjhhxvzUse81OGHG3644YebWHvlPOeHG3644Ycbfrjhhxt+uOGHG/NSx7zU4YcbfrjBww0ebvBwg4cbPNzg4QYPN3i44YcbfrgxL3XwcMMPN/xwww83qefmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3KSem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HCTem5e6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDTeo5P9zg4Sad5/xwk3puXuqYlzp4uMHDDR5u0j1ctveh56nn5qUOHm7S93nqeeq5ealjXurg4QYPN3i4SfdwOd6Hnqeem5c6eLhJ3+ep56nn5qWOeamDhxs83ODhppzn5TwvPS89Ny918HBTzvPS89Jz81LHvNTBww0ebvBwU+7hyn07P9zwww0/3ODhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDTem5eamDhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzel5+alDh5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/clJ6blzp4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cFN6XnqOhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzel56XneLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HDTet56jocbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83reet53i44Ycbfrjhhxt+uOGHGzzc4OEGDzf8cMMPN/xw03puXurg4YYfbvjhhh9u+OGGH27wcIOHGzzc8MMNP9zww03ruXmpg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83refmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3LSem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HDTem5e6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDzei5eamDhxs83ODhBg83/HCDh5txD8cPN3i4wcMNHm7wcPPHw+1/q++e4Y+H+7caq++eYT5OZubjZGY+Tmbm42RmPk5m5uNkZq6MK+PKuDKejCfjyXgynown48l4Mp6MJyNkhIyQETJCRsgIGSEj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D4eHO3i4g4c7eLiDhzt4uIOHO+U8L+d5Oc/LeV7O83IPV+7by317fX9XO+U8L7/by/d5+T4v93DlPC/neTnPy3lezvNyD1fu28t9e1175Twvv9vL93n5Pi/3cOU8L+d5Oc/LeV7O89Lzct+Ohzt4uIOHO3i4g4c7eLiDhzt4uFN6Xnpeeo6HO+Ue7vPD/a7slZ6XnuPhTvk+Lz0vPS89Lz3Hwx083MHDnXIP9/nh/r/S89Lz0nM83Cnf56Xnpeel56XneLiDhzt4uFPu4T4/3O/KXul56Tke7pTv89Lz0vPS89JzPNzBwx083CnneTnPS89Lz1vP8XCnneet563nreet53i4g4c7eLjT7uHafXvreet56zke7rTv89bz1vPW89ZzPNzBwx083Gn3cO2+vfW89bz1HA932vd563nreet56zke7uDhDh7utPO8neet563nred4uNPO89bz1vPW89ZzPNzBwx083Gn3cO2+vfW89bz1HA932vd563nreet56zke7uDhDh7utHu4dt/eet563nqOhzvt+7z1vPW89bz1HA938HAHD3faPVy7b289bz1vPcfDnfZ93nreet563nqOhzt4uIOHO+13e7tvbz1vPW89x8Od8bt99Hz0fPR89BwPd/BwBw93xj3cuG8fPR89Hz3Hw53xfT56Pno+ej56joc7eLiDhzvjHm7ct4+ej56PnuPhzvg+Hz0fPR89Hz3Hwx083MHDnXEPN+7bR89Hz0fP8XBn/G4fPR89Hz0fPcfDHTzcwcOdcQ837ttHz0fPR8/xcGd8n4+ej56Pno+e4+EOHu7g4c64hxv37aPno+ej53i4M77PR89Hz0fPR8/xcAcPd/BwZ9zDjfv20fPR89FzPNwZ3+ej56Pno+ej53i4g4c7eLgzvs/H9/no+ej56Dke7ox7uNHz1fPV89VzPNzBwx083Fn3cOu+ffV89Xz1HA931j3c6vnq+er56jke7uDhDh7urHu4dd++er56vnqOhzvrHm71fPV89Xz1HA938HAHD3fWPdy6b189Xz1fPcfDHTzcwcMdPNxZPcfDnXUPt77P8XAHD3fwcAcPd/54uP1v9d0z/PFw/1ZhlVZl1VZj9d1lLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5m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3s/nh/tdHatr9azCKq3Kqq2+jOs8v3p+9fzq+XWeX+f51fOr51fPr55fPb96fvX8Xhn3WYVVWpWVjCtDz6+eXz2/en71/Or51fP7ZLy2sld6fvX84+F+VzL0/Or51fOr51fPr55fPb/O8+s8v3p+9fzq+XWeX+f51fOr51fPr55fPb96fvX8lozyPvT86vnV84+H+/+qZej51fOr51fPr55fPb96/vnhflfeh55fPb96/vFwvysZen71/Or51fOr51fPr55/frjflfeh51fPr55/PNzvSoaePz1/ev70/On50/On58/v9s8P97saq2+vnp4/v9uf3+1Pz5+ePz1/ev70/On50/PPD/e7OlbX6lmFlYwrQ8+fnj89f3r+9Pzp+dPzzw/3u0ore6XnT88/Hu7/q5Ch50/Pn54/PX96/vT86fnnh/tdeR96/vT86fnzu/353f70/On50/On50/Pn54/Pf/8cL8r70PPn54/PX9+t39+uN+VDD1/ev70/On50/On558f7nflfej50/On58/v9s8P97uSoedPz5+ePz1/ev70/PPD/a68Dz1/ev70/Pnd/vnhflcy9Pzpeeh56Hnoeeh5+D4P3+eh56Hnoefhd/vnh/tdydDz0PPQ89Dz0PPQ888P97v63kfoeeh56Hn43f754X5XMvQ89Dz0PPQ89Dz0/PPD/a6elb3S89Dz8Lv988P9rmToeeh56Hnoeeh56Pnnh/tdeR96Hnoeeh5+t4eeh/M8nOeh5+F3e6QM3+eh56HnoefhPP/j4fa/1XfP8MfD/VuVVVuN1XfPEP1jdayu1bOS0TJaRstoGS1jZIyMkTEyRsbIGBkjY2SMjJWxMlbGylgZK2NlrAy/28P3efo+Tz1PPU89T+d5Os9Tz1PPU89Tzz8/3O9Khp6nnqeep55/frjflQw9Tz1PPU+/29P3eep56nnqeep56nnqeer554f7XR2ra/WswkqG7/PU89Tz1PPU89Tz1PPU888P97tKK3ul56nn6Xd7+j5PPf/8cL8rGc7z1PN0nqfzPPU83cOle7iPh/td2Su/29P3efo+T/dw6TxP53k6z9N5ns7zdA/3+eF+V/aq7ZXzPP1uT9/n6fs83cOl8zyd5+k8T+d5Os/TPdznh/td2auxV87z9Ls9fZ+n7/N0D5fO83Sep/M8nefpPC89L/ft5b794+F+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nes5Hu7g4Q4e7uDhTul56Tke7pSel56Xnpee4+EOHu7g4c7nh/tdydDz0vPSczzcKd/npeel56Xnped4uIOHO3i48/nhfldj9ay+fpSe4+FO+T4vPS89Lz0vPcfDHTzcwcOdzw/3uzpW9krPS8/xcKd8n5eef36435UM5zke7pTzvJzneLjz+eF+V/aq7ZXzHA938HAHD3fwcKec5+U8L+d5Oc/Lef754X5X3sfYq7FXzvPyu718n5fv888P97uS4Twv53k5z8t5/vnhflfex7NXz145z8vv9vJ9Xr7PPz/c70qG87yc5+U8L+d56fnnh/td2avv72oHD3fwcAcPd/BwBw938HCn9bz1vPUcD3faPdznh/tdhVValZUM3+et563nreet53i4g4c7eLjT7uE+P9zv6lqN1bOS4fu89bz1vPW89RwPd/BwBw932j3c54f7/0rPW89bz/Fwp32ft563nreet57j4Q4e7uDhTjvP23neet563nqOhzvtPG89bz1vPW89x8MdPNzBw512D9fX+9Dz1vPWczzcad/nreet563nred4uIOHO3i40+7h+nkfet563nqOhzvt+7z1vPW89bz1HA938HAHD3faed7O89bz1vPWczzcuc7zq+dXz6+eXz3Hwx083MHDnese7rpvv3p+9fzqOR7uXN/nV8+vnl89v3qOhzt4uIOHO9c93HXffvX86vnVczzcub7Pr55fPb96fvUcD3fwcAcPd657uOu+/er51fOr53i4c32fXz2/en71/Oo5Hu7g4Q4e7ly/26/79qvnV8+vnuPhzvW7/er51fOr51fP8XAHD3fwcOe6h7vu26+eXz2/eo6HO9f3+dXzq+dXz6+e4+EOHu7g4c51D3fdt189v3p+9RwPd67v86vnV8+vnl89x8MdPNzBw53rHu66b796fvX86jke7ly/26+ej56Pno+e4+EOHu7g4c64hxv37aPno+ej53i4M77PR89Hz0fPR8/xcAcPd/BwZ9zDjfv20fPR89FzPNwZ3+ej56Pno+ej53i4g4c7eLgz7uHGffvo+ej56Dke7ozv89Hz0fPR89FzPNzBwx083Bnf5+P7fPR89Hz0HA93xj3c6Pno+ej56Dke7uDhDh7ujHu4cd8+ej56PnqOhzvjHm70fPR89Hz0HA938HAHD3fGPdy4bx89Hz0fPcfDnXEPN3o+ej56PnqOhzt4uIOHO+Mebty3j56Pno+e4+EOHu7g4Q4e7oye4+HOcw/3fJ/j4Q4e7uDhDh7u/PFw+9/qu2f44+H+W50fq2MVVmlVVm11rcZKxpERMkJGyAgZISNkhIyQETJCRspIGSkjZaSMlJEyUkbKSBklo2T43f58nz/f53i4g4c7eLiDhzt4uPP0/Ok5Hu48PX96/vT86Tke7uDhDh7uPPftz3370/On50/P8XDn+T5/ev70/On503M83MHDHTzcee7bn/v2p+dPz5+e4+HO833+9Pzp+dPzp+d4uIOHO3i489y3P/ftT8+fnj89x8Od5/v86flz3/6c5895joc76zxf5zke7qx7ODzcwcMdPNzBwx083MHDHTzcWef5Os/Xeb7O83Wer3u4dd++7tvX39XWeb5+t6/v8/V9vu7h1nm+zvN1nq/zfJ3n6x5u3bev+/b1d7V1nq/f7ev7fH2fr3u4dZ6v83yd5+s8X+f56vm6b8fDHTzcwcMdPNzBwx083MHDHTzcWT1fPV89x8OddQ+3/q62er56vnqOhzvr+3z1fPV89Xz1HA938HAHD3fWPdz6u9rq+er56jke7qzv89Xz1fPV89VzPNzBwx083Fn3cOvvaqvnq+er53i4s77PV89Xz1fPV8/xcAcPd/BwwQ8X/HDBDxc/X8+DHy7wcPHznefBDxc/X8/jm5f6/9XX88DDBR4u8HDxc2R89+3x8/U8fr6exzcv9XclI2SEjJARMr6eBx4u8HCBh4ufkPHdt8dP2qu0V2mvUkbKSBkpI2WkvUrPUZ6jPEfJKO+j7FXZq7JXJaNklIyW0TLaXrXnaM/RnqNltPfR9qrt1bVXV8aVcWVcGVfGtVfXc1zPcT3HyBjvY+zV2KuxVyNjZIyMkTEynr16nuN5juc5noznfTx79ezVs1dPxspYGStjZay9Ws+xnmM9x8r47tuDHy6Onh89x8MFP1zwwwU/XPDDBT9c4OECDxd4uOCHC3644IeLo+dHz/FwwQ8X/HDBDxf8cMEPF3i4wMMFHi744YIfLvjh4uj50XM8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uDh6fvQcDxf8cMEPF/xwwQ8X/HCBhws8XODhgh8u+OGCHy6Onh89x8MFP1zwwwU/XPDDBT9c4OECDxd4uOCHC3644IeLo+dHz/FwwQ8X/HDBDxf8cMEPF3i4wMMFHi744YIfLvjh4uj50XM8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uDh6HnqOhwt+uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxeh56HneLjghwt+uOCHC3644IcLPFzg4QIPF/xwwQ8X/HAReh56jocLfrjghwt+uOCHC364wMMFHi7wcMEPF/xwwQ8Xoeeh53i4wMMFHi7wcMEPF3i4iJLRMvQcDxd4uMDDxR8Pt/+t/t0zxB8P92/1rPZbfZxMxMfJRHycTMTHyUR8nEzEx8lEXBlXxpVxZYyMkTEyRsbIGBkjY2SMjJHxZDwZT8aT8WQ8GU/Gk/FkPBnrfax3vt65nuPhAg8XeLjAw0Xoeeg5Hi744YIfLvjhgh8u8HCBhws8XPDDBT9c8MNF6nnqOR4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9cpJ6nnuPhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDRep56jkeLvjhgh8u+OGCHy744QIPF+k8T+c5Hi744QIPF3i4wMMFHi7wcIGHCzxc8MMFP1zww0U6z9N5zg8X/HDBDxd57ZXznB8u+OGCHy744YIfLvjhgh8u0nmeznN+uOCHC364yGevnOf8cMEPF/xwwQ8X/HDBDxf8cJHO83Se88MFP1zg4QIPF3i4wMMFHi7wcIGHCzxc8MMFP1yUnuPhgh8u+OGCHy5Kz0vP8XDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OGi9Lz0HA8X/HDBDxf8cMEPF/xwgYcLPFzg4YIfLvjhgh8uSs9Lz/FwwQ8X/HDBDxf8cMEPF3i4wMMFHi744YIfLvjhovScHy7wcFHOc364KD0vPS89x8MFHi7wcFFXxvU+9Lz0vPQcDxfl+7z0vPS89Lz0HA8XeLjAw0WNjPE+9Lz0vPQcDxfl+7z0vPS89Lz0HA8XeLjAw0U5z8t5Xnpeel56joeLcp6Xnpeel563nuPhAg8XeLho93D93bcHP1zwwwU/XODhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDRet56zkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XLSet57j4YIfLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww0Xrees5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1y0nree4+GCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MNF63nrOR4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9ctJ63nuPhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDxdXzq+d4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cHH1/Oo5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1xcPb96jocLfrjghwt+uOCHC364wMMFHi7wcMEPF/xwwQ8XV8+vnuPhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDxdXzq+d4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cHH1/Oo5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1xcPb96jocLPFzg4QIPF/xwgYeL6x6OHy7wcIGHCzxc4OHij4fb/1bfPcMfD/dvda3G6ll99wzzcTIxHycT83EyMR8nE3NkHBlHxpFxZBwZISNkhIyQETJCRsgIGSEjZKSMlJEyUkbKSBkpI2X43T6+z/nhAg8XeLjAwwUeLvBwMXo+eo6HC3644IcLfrjghws8XODhAg8X/HDBDxf8cDF6PnqOhwt+uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxej56PneLjghwt+uOCHC3644IcLPFzg4QIPF/xwwQ8X/HAxej56jocLfrjghwt+uOCHC364wMPFOM/HeY6HC364wMMFHi7wcIGHCzxc4OECDxf8cMEPF/xw8Zznz3nODxf8cMEPF8/f1Z7znB8u+OGCHy744YIfLvjhgh8unvP8Oc/54YIfLvjh4vm72nOe88MFP1zwwwU/XPDDBT9c8MPFc54/5zk/XPDDBR4u8HCBhws8XODhAg8XeLjAwwU/XPDDxdNzPFzwwwU/XPDDxdPzp+d4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cPH0/Ok5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1w8PX96jocLfrjghwt+uOCHC364wMMFHi7wcMEPF/xwwQ8XT8/54QIPF+s854eL1fPV89VzPFzg4QIPF+sebt23r56vnq+e4+FifZ+vnq+er56vnuPhAg8XeLhY93Drvn31fPV89RwPF+v7fPV89Xz1fPUcDxd4uMDDxTrP13m+er56vnqOh4t1nq+er56vnq+e4+ECDxd4uFj3cOu+nR8u+OGCHy7wcMEPF/xwwQ8X/HDBDxd4uMDDBR4u+OGCHy744WL1fPUcDxf8cMEPF/xwwQ8X/HCBhws8XODhgh8u+OGCHy5Wz1fP8XDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OFi9Xz1HA+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uf76e58/X88TDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy5+v5/nz9TzxcMkPl/xwyQ+X/HDJD5d4uMTDJR4u+eGSHy754fIn7VXZq5JRMkpGySgZZa/Kc5TnKM/RMtr7aHvV9qrtVctoGS2jZbSMa6+u57ie43qOK+N6H9deXXt17dWVMTJGxsgYGWOvxnOM5xjPMTLG+3j26tmrZ6+ejCfjyXgynoxnr57nWM+xnmNlrPex9mrt1dqrlbEy9JwfLvnhkh8u8XCJh0s8XPLDJT9c8sPl0XPzUhMPl/xwyQ+X/HDJD5f8cImHSzxc4uGSHy754ZIfLo+em5eaeLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HB59Ny81MTDJR4u8XCJh0t+uMTD5SkZJUPP8XCJh0s8XP7xcPvf6t89Q/7xcP9WZdVW12qsntV+q4+TyfNxMnmujCvjyrgyrowr48q4MkbGyBgZI2NkjIyRMTJGxsh4Mp6MJ+PJeDKejOd9PO/8eed6jodLPFzi4RIPl+alpnmpiYdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xwGXpuXmri4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw2XouXmpiYdLfrjkh0t+uOSHS364xMMlHi7xcMkPl/xwyQ+XoefmpSYeLvnhkh8u+eGSHy754RIPl+alpnmpiYdLfrjEwyUeLvFwiYdLPFzi4RIPl/xwyQ+X/HBpXmqal5r8cMkPl/xwGddeOc/54ZIfLvnhkh8u+eGSHy754dK81DQvNfnhkh8u+eEyxl45z/nhkh8u+eGSHy754ZIfLvnh0rzUNC81+eGSHy7xcImHSzxc4uESD5d4uMTDJR4u+eGSHy7NS008XPLDJT9c8sNl6rl5qYmHS3645IdLfrjkh0t+uMTDJR4u8XDJD5f8cMkPl6nn5qUmHi754ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1ymnpuXmni45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xwmXrOD5d4uEznOT9cpp6bl5rmpSYeLvFwiYfLbBntfeh56rl5qYmHy7wy9Dz13LzUNC818XCJh0s8XObIGO9Dz1PPzUtNPFzmyNDz1HPzUtO81MTDJR4u8XCZzvN0nqeep56bl5p4uEzneep56rl5qWleauLhEg+XeLis7x4u67tvT3645IdLfrjEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vSc/NSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uS8/NS008XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uCw9Ny818XDJD5f8cMkPl/xwyQ+XeLjEwyUeLvnhkh8u+eGy9Lz0HA+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uS89Lz/FwyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnhsvS89BwPl/xwyQ+X/HDJD5f8cImHSzxc4uGSHy754ZIfLlvPW8/xcMkPl/xwyQ+X/HDJD5d4uMTDJR4u+eGSHy754bL13LzUxMMlP1zywyU/XPLDJT9c4uESD5d4uOSHS3645IfL1nPzUhMPl/xwyQ+X/HDJD5f8cImHSzxc4uGSHy754ZIfLlvPzUtNPFzywyU/XPLDJT9c8sMlHi7xcImHS3645IdLfrhsPTcvNfFwyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnhsvXcvNTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vWc/NSEw+XeLjEwyUeLvnhEg+X7R6OHy7xcImHSzxc4uHyj4f7u3/54+Hqv9WxCqu0Kqu2ulZj9ay+u4x7ZBwZR8aRcWQcGUfGkXFkHBkhI2SEjJARMkJGyAgZISNkpIyUkTJSht/t1/c5P1zi4RIPl3i4xMMlHi7NS03zUhMPl/xwyQ+X/HDJD5d4uMTDJR4u+eGSHy754fLquXmpiYdLfrjkh0t+uOSHS364xMMlHi7xcMkPl/xwyQ+XV8/NS008XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uLx6bl5q4uGSHy754ZIfLvnhkh8u8XBpXmqal5p4uOSHSzxc4uESD5d4uMTDJR4u8XDJD5f8cMkPl+alpnmpyQ+X/HDJD5fj72rmpSY/XPLDJT9c8sMlP1zywyU/XJqXmualJj9c8sMlP1yOv6uZl5r8cMkPl/xwyQ+X/HDJD5f8cGleapqXmvxwyQ+XeLjEwyUeLvFwiYdLPFzi4RIPl/xwyQ+X5qUmHi754ZIfLvnhcvTcvNTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vRc/NSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uR8/NS008XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uBw954dLPFyO85wfLp+em5ea5qUmHi7xcImHy+ce7rlvf3r+9Ny81MTD5fN9/vT86bl5qWleauLhEg+XeLh87uGe+/an50/PzUtNPFw+3+dPz5+em5ea5qUmHi7xcImHy+c8f87zp+dPz81LTTxcPuf50/On5+alpnmpiYdLPFzi4fK5h3vu2/nhkh8u+eESD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy6fnpuXmni45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xw+fTcvNTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8un5+alJh4u+eGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9crp6vnuPhkh8u+eGSHy754ZIfLvFwiYdLPFzywyU/XPLD5er56jkeLvnhkh8u+eGSHy754RIPl3i4xMMlP1zywyU/XK6er57j4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw+Xq+eo5Hi754ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1yunpuXmni45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xwuXpuXmri4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw+XquXmpiYdLfrjkh0t+uOSHS364xMMVHq7wcMUPV/xwxQ9XP1/Py7zUwsMVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oern6/nZV5q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPVT9qrtFcpIz1Heo70HCmjZJSMklGeozxHySjP8dvz/W/1756h/ni4/1b9Y3WswiqtyqqtrtVYyWgZV8aVcWVcGVfGlXFlXBlXxpUxMkbGyBgZI2NkjIyRMTJGxpPxZDzv43nnzzt/3sfzPp7/r57/r553vt75eucrY73z9c5XxspYGStDz/nhih+u+OHq6Ll5qYWHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV0fPzUstPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrg6em5eauHhih+u+OGKH6744YofrvBwZV5qmZdaeLjihys8XOHhCg9XeLjCwxUervBwxQ9X/HDFD1fmpZZ5qcUPV/xwxQ9Xp+3VtVdXxpVxZVwZV8a1V9dzXM9xPcfIGO9j7NXYq7FXI2NkjIyRMTKevXqe43mO5zn0nB+u8HCFhys8XOHhCg9XeLjCwxUervjhih+uzEstPFzxwxU/XPHDVei5eamFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1eh5+alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9chZ6bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cBV6zg9XeLgK5zk/XIWem5da5qUWHq7wcIWHq2gZ7X3oeei5eamFh6u4MvQ89Ny81DIvtfBwhYcrPFzFlXG9Dz0PPTcvtfBwFSNDz0PPzUst81ILD1d4uMLDVTjPw3keeh56bl5q4eEqnOeh56Hn5qWWeamFhys8XOHhKlbGeh96zg9X/HCFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1ep5+alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9cpZ6bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cJV6bl5q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cNV6nnqOR6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHD/X9lr/Q89RwPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744YofrlLPU8/xcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744Sr1PPUcD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH65Kz81LLTxc8cMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364Kj03L7XwcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744ar03LzUwsMVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oer0nPzUgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744YofrkrPzUstPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrgqPTcvtfBwhYcrPFzh4YofrvBwVU+G73M8XOHhCg9XeLj64+H2v9V3z/DHw/1bPavvnqE/Tqb642SqP06m+uNkqj9OpvrjZKo/Tqb642SqP06m+kfGkXFkHBlHxpFxZBwZR8aRcWSEjJARMkJGyAgZISNkhIyQ4Xd7+z7nhys8XOHhCg9XeLjCw5V5qWVeauHhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XLWem5daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HDVem5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHDVeu5eamFhyt+uOKHK3644ocrfrjCw5V5qWVeauHhih+u8HCFhys8XOHhCg9XeLjCwxU/XPHDFT9cmZda5qUWP1zxwxU/XN3v72plXmrxwxU/XPHDFT9c8cMVP1zxw5V5qWVeavHDFT9c8cPV/f6uVualFj9c8cMVP1zxwxU/XPHDFT9cmZda5qUWP1zxwxUervBwhYcrPFzh4QoPV3i4wsMVP1zxw5V5qYWHK3644ocrfri6em5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1dVz81ILD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH66unpuXWni44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xwdfWcH67wcHWd5/xwdfXcvNQyL7XwcIWHKzxcjXu4cd8+ej56bl5q4eFqfJ+Pno+em5da5qUWHq7wcIWHq3EPN+7bR89Hz81LLTxcje/z0fPRc/NSy7zUwsMVHq7wcDXO83Gej56PnpuXWni4Guf56PnouXmpZV5q4eEKD1d4uBr3cOO+nR+u+OGKH67wcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744Wr03LzUwsMVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oer0XPzUgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744YofrkbPzUstPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrh6ev70HA9X/HDFD1f8cMUPV/xwhYcrPFzh4Yofrvjhih+unp4/PcfDFT9c8cMVP1zxwxU/XOHhCg9XeLjihyt+uOKHq6fnT8/xcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744erp+dNzPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrh6em5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1dNz81ILD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH66enpuXWni44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xwtXpuXmrh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw9XquXmphYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9Xq+fmpRYervBwhYcrPFzxwxUertY9HD9c4eEKD1d4uMLD1R8Pt/+tvnuGPx7u3+pajdWz+u4ZFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOBg9X6/ucH67wcIWHKzxc4eEKD1fmpZZ5qYWHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cLVfz9u81MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH65+v521eauPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPD9c/X8zYvtfFwzQ/X/HDND9f8cM0P13i4Ni+1zUttPFzzwzUervFwjYdrPFzj4RoP13i45odrfrjmh2vzUtu81OaHa3645ofrn7ZXba9aRstoGVfGlXHt1fUc13Ncz3FlXO/j2qtrr8ZejYyRMTJGxsgYezWeYzzHeI4n43kfz149e/Xs1ZPxZDwZT8aTsfZqPcd6jvUcK2O9j7VXa6/WXn2/25sfrvnhmh+u+eGaH67xcI2Hazxc88M1P1zzw/XRc/NSGw/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+uj56bl9p4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cH30nB+u8XB9SoaeHz03L7XNS208XOPhGg/Xp2W096HnR8/NS208XJ+WoedHz81LbfNSGw/XeLjGw/W5Mq73oedHz81LbTxcn5Gh50fPzUtt81IbD9d4uMbD9RkZ433o+dFz81IbD9fnydDzo+fmpbZ5qY2Hazxc4+H6rIz1PvScH6754RoP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754ZofrkPPzUttPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrgOPTcvtfFwzQ/X/HDND9f8cM0P13i4xsM1Hq754ZofrvnhOvTcvNTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vQ89BzPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrgOPQ89x8M1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr0PPQczxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364Dj0PPcfDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Rz81IbD9f8cM0P1/xwzQ/X/HCNh2s8XOPhmh+u+eGaH65Tz81LbTxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364Tj03L7XxcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754Tr13LzUxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr1HPzUhsP1/xwzQ/Xqef8cM0P13i4xsM1Hq754ZofrvnhOvXcvNTGwzUervFwjYdrfrjGw3U+GU+GnuPhGg/XeLj+4+H2v9W/e4b+4+H+rcqqra7VWD2rf3cZXR8n0/VxMl0fJ9P1cTJdHyfT9XEyXR8n0/VxMl0fJ9P1I+PIODKOjCPjyDgyjowj48g4MkJGyAgZISNkhAy/28v3OT9c4+EaD9d4uMbDNR6uzUtt81IbD9f8cM0P1/xwzQ/XeLjGwzUervnhmh+u+eG69Ny81MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Jz81IbD9f8cM0P1/xwzQ/X/HCNh2s8XOPhmh+u+eGaH65Lz81LbTxc88M1P1zzwzU/XPPDNR6uzUtt81IbD9f8cI2Hazxc4+EaD9d4uMbDNR6u+eGaH6754dq81DYvtfnhmh+u+eG6v7+rtXmpzQ/X/HDND9f8cM0P1/xwzQ/X5qW2eanND9f8cM0P1/39Xa3NS21+uOaHa3645odrfrjmh2t+uDYvtc1LbX645odrPFzj4RoP13i4xsM1Hq7xcI2Ha3645odr81IbD9f8cM0P1/xw3XpuXmrj4Zofrvnhmh+u+eGaH67xcI2Hazxc88M1P1zzw3XruXmpjYdrfrjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/XrefmpTYervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XLee88M1Hq7bec4P163n5qW2eamNh2s8XOPhut3Dtfv2q+dXz81LbTxcX9/nV8+vnpuX2ualNh6u8XCNh+vrHu66b796fvXcvNTGw/X1fX71/Oq5ealtXmrj4RoP13i4vs7z6zy/en713LzUxsP1dZ5fPb96bl5qm5faeLjGwzUerq97uOu+nR+u+eGaH67xcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754frquXmpjYdrfrjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/XV8/NS208XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uL56bl5q4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88P11fPRczxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364Hj0fPcfDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Hz0XM8XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uB49Hz3HwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vRc/NSGw/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+uR8/NS208XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uB49Ny+18XDND9f8cM0P1/xwzQ/XeLjGwzUervnhmh+u+eF69Ny81MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH66fn5qU2Hq754Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1w/PTcvtfFwjYdrPFzj4ZofrvFw/dzD8cM1Hq7xcI2Hazxc//Fwf/cvfzxc/bc6VmGVVmXVVtdqrJ7Vd5fxWkbLaBkto2W0jJbRMlpGy7gyrowr48q4Mq6MK+PKuDKujJExMkbGyPC7/fk+54drPFzj4RoP13i4xsO1ealtXmrj4Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1w/PTcvtfFwzQ/X/HDND9f8cM0P13i4xsM1Hq754ZofrvnhevXcvNTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vVc/NSGw/X/HDND9f8cM0P1/xwjYdr81LbvNTGwzU/XOPhGg/XeLjGwzUervFwjYdrfrjmh2t+uDYvtc1LbX645odrfrhef1czL7X54Zofrvnhmh+u+eGaH6754dq81DYvtfnhmh+u+eF6/V3NvNTmh2t+uOaHa3645odrfrjmh2vzUtu81OaHa364xsM1Hq7xcI2Hazxc4+EaD9d4uOaHa364Ni+18XDND9f8cM0P16vn5qU2Hq754Zofrvnhmh/u8sNdPNzFw1083OWHu/xwlx/u/nw9v+alXjzc5Ye7/HCXH+7yw11+uIuHu3i4i4e7/HCXH+7yw92fr+fXvNSLh7v8cJcf7vLDXX64yw938XAXD3fxcJcf7vLDXX64+5P2Ku1VykgZKaNklIyyV+U5ynOU5ygZ5X2UvSp71faqZbSMltEyWkbbq/Yc7Tnac1wZ1/u49uraq2uvrowr48q4Mq6MsVfjOcZzjOcYGeN9jL0aezX2amQ8GU/Gk/FkPHv1PMfzHM9zPBnP+1h7tfZq7dXKWBkrY2WsjLVXeo6Hu3i4yw93+eEuP9w9em5e6sXDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9w9em5e6sXDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9w9em5e6sXDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9w9en70HA93+eEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cPfo+dFzPNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3aPnR8/xcJcf7vLDXX64yw93+eEuHu7i4S4e7vLDXX64yw93j54fPcfDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9wNPTcv9eLhLj/c5Ye7/HCXH+7yw1083MXDXTzc5Ye7/HCXH+6GnpuXevFwlx/u8sNdfrjLD3f54S4e7uLhLh7u8sNdfrjLD3dDz81LvXi4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7uh5+alXjzc5Ye7/HCXH+7yw11+uIuHu3i4i4e7/HCXH+7yw93Qc/NSLx7u8sNdfrjLD3f54S4/3MXDXTzcxcNdfrjLD3f54W7ouXmpFw938XAXD3fxcJcf7uLhbjwZT4ae4+EuHu7i4e4fD7f/rf7dM9w/Hu6/1f5YHauwSquyaqtrNVYyPk7m5sfJ3Pw4mZsfJ3Pz42RufpzMzY+TuflxMjc/Tubmx8nc/JFxZBwZR8aRcWQcGUfGkXFkHBkhI2T43Z7f9/nlh7t4uIuHu3i4i4e7eLhrXuo1L/Xi4S4/3OWHu/xwlx/u4uEuHu7i4S4/3OWHu/xwN/XcvNSLh7v8cJcf7vLDXX64yw938XAXD3fxcJcf7vLDXX64m3puXurFw11+uMsPd/nhLj/c5Ye7eLiLh7t4uMsPd/nhLj/cTT03L/Xi4S4/3OWHu/xwlx/u8sNdPNw1L/Wal3rxcJcf7uLhLh7u4uEuHu7i4S4e7uLhLj/c5Ye7/HDXvNRrXurlh7v8cJcf7ub3d7VrXurlh7v8cJcf7vLDXX64yw93+eGueanXvNTLD3f54S4/3K3v72rXvNTLD3f54S4/3OWHu/xwlx/u8sNd81KveamXH+7yw1083MXDXTzcxcNdPNzFw1083MXDXX64yw93zUu9eLjLD3f54S4/3C09Ny/14uEuP9zlh7v8cJcf7vLDXTzcxcNdPNzlh7v8cJcf7paem5d68XCXH+7yw11+uMsPd/nhLh7u4uEuHu7yw11+uMsPd0vPzUu9eLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu6Xn/HAXD3fLec4Pd0vPzUu95qVePNzFw1083K2Vsd6Hnpeem5d68XC3fZ+3nreem5d6zUu9eLiLh7t4uNvu4fq7b7+t563n5qVePNxt3+et563n5qVe81IvHu7i4S4e7rbzvJ3nreet5+alXjzcbed563nruXmp17zUi4e7eLiLh7vtHq6/+/bLD3f54S4/3MXDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9xtPTcv9eLhLj/c5Ye7/HCXH+7yw1083MXDXTzc5Ye7/HCXH+62npuXevFwlx/u8sNdfrjLD3f54S4e7uLhLh7u8sNdfrjLD3dbz81LvXi4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7ut563neLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu1fPr57j4S4/3OWHu/xwlx/u8sNdPNzFw1083OWHu/xwlx/uXj2/eo6Hu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfrh79fzqOR7u8sNdfrjLD3f54S4/3MXDXTzcxcNdfrjLD3f54e7Vc/NSLx7u8sNdfrjLD3f54S4/3MXDXTzcxcNdfrjLD3f54e7Vc/NSLx7u8sNdfrjLD3f54S4/3MXDXTzcxcNdfrjLD3f54e7Vc/NSLx7u8sNdfrjLD3f54S4/3MXDXTzcxcNdfrjLD3f54e7Vc/NSLx7u8sNdfrjLD3f54S4/3MXDXTzcxcNdfrjLD3f54e7ouXmpFw93+eEuP9zlh7v8cJcf7uLhLh7u4uEuP9zlh7v8cHf03LzUi4e7eLiLh7t4uMsPd/Fwd9zD8cNdPNzFw1083MXD3T8ebv9bffcMfzzcv9Wz+u4Z5uNk7nyczJ2Pk7nzcTJ3Pk7mzsfJ3CkZJaNklIyW0TJaRstoGS2jZbSMltEyrowr48q4Mq6MK+PKuDKujCvD7/bxfc4Pd/FwFw938XAXD3fxcNe81Gte6sXDXX64yw93+eEuP9zFw1083MXDXX64yw93+eHu6Ll5qRcPd/nhLj/c5Ye7/HCXH+7i4S4e7uLhLj/c5Ye7/HD36bl5qRcPd/nhLj/c5Ye7/HCXH+7i4S4e7uLhLj/c5Ye7/HD36bl5qRcPd/nhLj/c5Ye7/HCXH+7i4a55qde81IuHu/xwFw938XAXD3fxcBcPd/FwFw93+eEuP9zlh7vmpV7zUi8/3OWHu/xw9/m7mnmplx/u8sNdfrjLD3f54S4/3OWHu+alXvNSLz/c5Ye7/HD3+buaeamXH+7yw11+uMsPd/nhLj/c5Ye75qVe81IvP9zlh7t4uIuHu3i4i4e7eLiLh7t4uIuHu/xwlx/umpd68XCXH+7yw11+uPv03LzUi4e7/HCXH+7yw11+uMsPd/FwFw938XCXH+7yw11+uLt6bl7qxcNdfrjLD3f54S4/3OWHu3i4i4e7eLjLD3f54S4/3F09Ny/14uEuP9zlh7v8cJcf7vLDXTzcxcNdPNzlh7v8cJcf7q6e88NdPNxd5zk/3F09Ny/1mpd68XAXD3fxcHfdw6379tXz1XPzUi8e7q7v89Xz1XPzUq95qRcPd/FwFw931z3cum9fPV89Ny/14uHu+j5fPV89Ny/1mpd68XAXD3fxcHed5+s8Xz1fPTcv9eLh7jrPV89Xz81LvealXjzcxcNdPNxd93Drvp0f7vLDXX64i4e7/HCXH+7yw11+uMsPd/FwFw938XCXH+7yww0/3Px8PR/zUgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbn6+no95qYOHG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPNz9hr9JepYyUkTJSRspIe5WeIz1Heo6SUd5H2auyV2WvSkbJKBklo2S0vWrP0Z6jPUfLaO+j7VXbq7ZXLePKuDKujCvj2qvrOa7nuJ7jyrjex9irsVdjr0bGyBgZI2NkjL0az/E8x/McT8bzPp69evbq2asn48l4MlbGylh7tZ5jPcd6jpWx3sfaKz03L3XwcMMPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744ebouXmpg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83R8/NSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uDl6bl7q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MPN0XPzUgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbo6em5c6eLjBww0ebvBwww83eLg5I2Nk6DkebvBwg4ebPx5u/1v9u2eYPx7u3+pajdWz2m/1cTJzPk5mzsfJzPk4mTkrY2WsjJWxMj5OZuLjZCY+Tmbi42QmPk5m4uNkJj5OZuLjZCY+Tmbi42QmfmQcGUfGkXFkHBlHxpFxZHy/2ye+7/Phhxs83ODhBg83eLjBw415qWNe6uDhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3ISem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HATem5e6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDTei5eamDhxt+uOGHG3644YcbfrjBw415qWNe6uDhhh9u8HCDhxs83ODhBg83eLjBww0/3PDDDT/cmJc65qUOP9zwww0/3MTaK+c5P9zwww0/3PDDDT/c8MMNP9yYlzrmpQ4/3PDDDT/c5Pd3tTEvdfjhhh9u+OGGH2744YYfbvjhxrzUMS91+OGGH27wcIOHGzzc4OEGDzd4uMHDDR5u+OGGH27MSx083PDDDT/c8MNN6rl5qYOHG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPN6nn5qUOHm744YYfbvjhhh9u+OEGDzd4uMHDDT/c8MMNP9yknpuXOni44Ycbfrjhhxt+uOGHGzzc4OEGDzf8cMMPN/xwk3rODzd4uEnnOT/cpJ6blzrmpQ4ebvBwg4ebXBnrfeh56rl5qYOHm1wZep56bl7qmJc6eLjBww0ebuq7h5v67tun9Lz03LzUwcNN+T4vPS89Ny91zEsdPNzg4QYPN+U8L+d56XnpuXmpg4ebcp6Xnpeem5c65qUOHm7wcIOHm0oZ33378MMNP9zwww0ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3JSem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HBTem5e6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDTem5eamDhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzel56XneLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HDTet56jocbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83reet53i44Ycbfrjhhxt+uOGHGzzc4OEGDzf8cMMPN/xw03reeo6HG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPN63n5qUOHm744YYfbvjhhh9u+OEGDzd4uMHDDT/c8MMNP9y0npuXOni44Ycbfrjhhxt+uOGHGzzc4OEGDzf8cMMPN/xw03puXurg4YYfbvjhhh9u+OGGH27wcIOHGzzc8MMNP9zww03ruXmpg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83V8/NSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uLl6bl7q4OEGDzd4uMHDDT/c4OHmuofjhxs83ODhBg83eLj54+H2v9V3z/DHw/1blVVbXauxelbfXcb9OJm5Hyczt2SUjJJRMkpGySgZJaNltIyW0TJaRstoGS2jZbSMK+PKuDKujCvjyvC7/fo+54cbPNzg4QYPN3i4wcONealjXurg4YYfbvjhhh9u+OEGDzd4uMHDDT/c8MMNP9xcPTcvdfBwww83/HDDDzf8cMMPN3i4wcMNHm744YYfbvjhZvTcvNTBww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5vRc/NSBw83/HDDDzf8cMMPN/xwg4cb81LHvNTBww0/3ODhBg83eLjBww0ebvBwg4cbfrjhhxt+uDEvdcxLHX644YcbfrgZf1czL3X44YYfbvjhhh9u+OGGH2744ca81DEvdfjhhh9u+OFm/F3NvNThhxt+uOGHG3644YcbfrjhhxvzUse81OGHG364wcMNHm7wcIOHGzzc4OEGDzd4uOGHG364MS918HDDDzf8cMMPN6Pn5qUOHm744YYfbvjhhh9u+OEGDzd4uMHDDT/c8MMNP9yMnpuXOni44Ycbfrjhhxt+uOGHGzzc4OEGDzf8cMMPN/xw8/TcvNTBww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5un5/xwg4eb5zznh5un5+aljnmpg4cbPNzg4ea5h3vu25+ePz03L3XwcPN8nz89f3puXuqYlzp4uMHDDR5unnu457796fnTc/NSBw83z/f50/On5+aljnmpg4cbPNzg4eY5z5/z/On503PzUgcPN895/vT86bl5qWNe6uDhBg83eLh57uGe+3Z+uOGHG364wcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yebp+fmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3Kyem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HCzem5e6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDzer56jkebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3Kyer57j4YYfbvjhhh9u+OGGH27wcIOHGzzc8MMNP9zww83q+eo5Hm744YYfbvjhhh9u+OEGDzd4uMHDDT/c8MMNP9ysnq+e4+GGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MPN6rl5qYOHG3644Yd7/HCPH+7xwz083MPDPTzc44d7/HCPH+79fD1/5qU+PNzjh3v8cI8f7vHDPX64h4d7eLiHh3v8cI8f7vHDvZ+v58+81IeHe/xwjx/u8cM9frjHD/fwcA8P9/Bwjx/u8cM9frj3k/Yq7VXKKBklo2SUjLJX5TnKc5TnKBnlfbS9anvV9qpltIyW0TJaRtur9hzXc1zPcWVc7+Paq2uvrr26Mq7nuJ5jPMfIGBkjY2SM5xjPMTLGc/z2fP9W7989w/vj4f6twiqtyqqtrtVYPav9VitjZayMlbEyVsbKWBkr4+Nk3vk4mXc+Tuadj5N55+Nk3vk4mXc+Tuadj5N55+Nk3vk4mXd+ZBwZR8aRcWR8v9vf+b7PHz/cw8M9PNzDwz083MPDPfNSn3mpDw/3+OEeP9zjh3v8cA8P9/BwDw/3+OEeP9zjh3tHz81LfXi4xw/3+OEeP9zjh3v8cA8P9/BwDw/3+OEeP9zjh3tHz81LfXi4xw/3+OEeP9zjh3v8cA8P9/BwDw/3+OEeP9zjh3tHz81LfXi4xw/3+OEeP9zjh3v8cA8P98xLfealPjzc44d7eLiHh3t4uIeHe3i4h4d7eLjHD/f44R4/3DMv9ZmX+vjhHj/c44d7Z+3V2quVsTJWxspYGWuvnOfmpT7zUh8/3OOHe/xwL76/qz3zUh8/3OOHe/xwjx/u8cM9frjHD/fMS33mpT5+uMcP9/BwDw/38HAPD/fwcA8P9/BwDw/3+OEeP9wzL/Xh4R4/3OOHe/xwL/TcvNSHh3v8cI8f7vHDPX64xw/38HAPD/fwcI8f7vHDPX64F3puXurDwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/cCz03L/Xh4R4/3OOHe/xwjx/u8cM9PNzDwz083OOHe/xwjx/uhZ7zwz083AvnOT/cCz03L/WZl/rwcA8P9/BwL56M533oeei5eakPD/diZeh56Ll5qc+81IeHe3i4h4d7+d3Dvfzu21/qeeq5eakPD/fy+z5/qeep5+alPvNSHx7u4eEeHu6l8zyd56nnqefmpT483Evneep56rl5qc+81IeHe3i4h4d7GTK++/bHD/f44R4/3MPDPX64xw/3+OEeP9zjh3t4uIeHe3i4xw/3+OEeP9xLPTcv9eHhHj/c44d7/HCPH+7xwz083MPDPTzc44d7/HCPH+6lnpuX+vBwjx/u8cM9frjHD/f44R4e7uHhHh7u8cM9frjHD/dSz81LfXi4xw/3+OEeP9zjh3v8cA8P9/BwDw/3+OEeP9zjh3up56nneLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe6Xnped4uMcP9/jhHj/c44d7/HAPD/fwcA8P9/jhHj/c44d7peel53i4xw/3+OEeP9zjh3v8cA8P9/BwDw/3+OEeP9zjh3ul56XneLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe6Xn5qU+PNzjh3v8cI8f7vHDPX64h4d7eLiHh3v8cI8f7vHDvdJz81IfHu7xwz1+uMcP9/jhHj/cw8M9PNzDwz1+uMcP9/jhXum5eakPD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xwr/TcvNSHh3v8cI8f7vHDPX64xw/38HAPD/fwcI8f7vHDPX64V3puXurDwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/caz03L/Xh4R4e7uHhHh7u8cM9PNxr93D8cA8P9/BwDw/38HDvj4fb/1bfPcMfD/ffKn+sjlVYpVVZtdW1GisZKaNklIySUTJKRskoGSWjZJSMltEyWkbLaBkto2W0jJbRMq6MK8Pv9vZ9zg/38HAPD/fwcA8P9/Bwz7zUZ17qw8M9frjHD/f44R4/3MPDPTzcw8M9frjHD/f44V7ruXmpDw/3+OEeP9zjh3v8cI8f7uHhHh7u4eEeP9zjh3v8cK/13LzUh4d7/HCPH+7xwz1+uMcP9/BwDw/38HCPH+7xwz1+uHf13LzUh4d7/HCPH+7xwz1+uMcP9/Bwz7zUZ17qw8M9friHh3t4uIeHe3i4h4d7eLiHh3v8cI8f7vHDPfNSn3mpjx/u8cM9frh30145z/nhHj/c44d7/HCPH+7xwz1+uGde6jMv9fHDPX64xw/3btsr5zk/3OOHe/xwjx/u8cM9frjHD/fMS33mpT5+uMcP9/BwDw/38HAPD/fwcA8P9/BwDw/3+OEeP9wzL/Xh4R4/3OOHe/xw7+q5eakPD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xw7+q5eakPD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xwb/TcvNSHh3v8cI8f7vHDPX64xw/38HAPD/fwcI8f7vHDPX64N3rOD/fwcG+c5/xwb/TcvNRnXurDwz083MPDvXEPN+7bR89Hz81LfXi4N77PR89Hz81LfealPjzcw8M9PNwb93Djvn30fPTcvNSHh3vj+3z0fPTcvNRnXurDwz083MPDvXGej/N89Hz03LzUh4d74zwfPR89Ny/1mZf68HAPD/fwcG/cw437dn64xw/3+OEeHu7xwz1+uMcP9/jhHj/cw8M9PNzDwz1+uMcP9/jh3ui5eakPD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xw7+m5eakPD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xw7+m5eakPD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xw7+n503M83OOHe/xwjx/u8cM9friHh3t4uIeHe/xwjx/u8cO9p+dPz/Fwjx/u8cM9frjHD/f44R4e7uHhHh7u8cM9frjHD/eenj89x8M9frjHD/f44R4/3OOHe3i4h4d7eLjHD/f44R4/3Ht6/vQcD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xw7+m5eakPD/f44R4/3OOHe/xwjx/u4eEeHu7h4R4/3OOHe/xwb/XcvNSHh3v8cI8f7vHDPX64xw/38HAPD/fwcI8f7vHDPX64t3puXurDwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/cWz03L/Xh4R4/3OOHe/xwjx/u8cM9PNzDwz083OOHe/xwjx/urZ6bl/rwcI8f7vHDPX64xw/3+OEeHu7h4R4e7vHDPX64xw/3Vs/NS314uIeHe3i4h4d7/HAPD/fWPRw/3MPDPTzcw8M9PNz74+H2v9V3z/DHw/1bPavvnmFxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMx+nMz+fJzM/nyczP58nMz+fJzM/nyczP58nMz+fJzM/nyczP58nMz+/Mj4frfvz/d9vvxwi4dbPNzi4RYPt3i4NS91zUtdPNzywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfbn/Qc6TlSRspIGSkjZXw9Xzzc4uEWD7f8cMsPt/xw+/P1fM1LXTzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364/Wl7de3VlXFlXBlXxpVx7dX1HNdzXM8xMsb7GHs19mrs1cgYGSNjZIyMZ6+e53ie43mOJ+N5H89ePXv17NWTsTJWxspYGWuv1nOs51jPsTK++/blh9vz/V1tzUtdfrjlh1t+uOWHW3645Ydbfrg1L3XNS11+uOWHWzzc4uEWD7d4uMXDLR5u8XCLh1t+uOWHW/NSFw+3/HDLD7f8cHv03LzUxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfbo+fmpS4ebvnhlh9u+eGWH2754RYPt3i4xcMtP9zywy0/3B49Ny918XDLD7f8cMsPt/xwyw+3eLjFwy0ebvnhlh9u+eH26Dk/3OLh9owMPT96bl7qmpe6eLjFwy0ebs+T8bwPPT96bl7q4uH2PBl6fvTcvNQ1L3XxcIuHWzzcnpWx3oeeHz03L3XxcBvf9/mGnoeem5e65qUuHm7xcIuH23Ceh/M89Dz03LzUxcNtOM9Dz0PPzUtd81IXD7d4uMXDbYSM7759+eGWH2754RYPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfbkPPzUtdPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645YdbfrgNPTcvdfFwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnhNvTcvNTFwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9vQ89BzPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645YdbfrgNPQ89x8MtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb1PPUczzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364TT1PPcfDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH29Rz81IXD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25Tz81LXTzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364TT03L3XxcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754Tb13LzUxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb1HPzUhcPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfbkvPzUtdPNzi4RYPt3i45YdbPNzWkeH7HA+3eLjFwy0ebv94uP1v9d0z/PFw/1bXaqye1XfPUB8ns/VxMlsfJ7P1cTJbKSNlpIyUkTJSRskoGSWjZJSMklEySkbJKBkto2W0jJbRMlpGy2gZfreX73N+uMXDLR5u8XCLh1s83JqXuualLh5u+eGWH2754ZYfbvFwi4dbPNzywy0/3PLDbem5eamLh1t+uOWHW3645YdbfrjFwy0ebvFwyw+3/HDLD7el5+alLh5u+eGWH2754ZYfbvnhFg+3eLjFwy0/3PLDLT/ctp6bl7p4uOWHW3645Ydbfrjlh1s83JqXuualLh5u+eEWD7d4uMXDLR5u8XCLh1s83PLDLT/c8sOtealrXurywy0/3PLDbae9cp7zwy0/3PLDLT/c8sMtP9zyw615qWte6vLDLT/c8sNtl71ynvPDLT/c8sMtP9zywy0/3PLDrXmpa17q8sMtP9zi4RYPt3i4xcMtHm7xcIuHWzzc8sMtP9yal7p4uOWHW3645Yfb1nPzUhcPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfblvPzUtdPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645Ydbfri9em5e6uLhlh9u+eGWH2754ZYfbvFwi4dbPNzywy0/3PLD7dVzfrjFw+11nvPD7dVz81LXvNTFwy0ebvFwe93DXfftV8+vnpuXuni4vb7Pr55fPTcvdc1LXTzc4uEWD7fXPdx13371/Oq5eamLh9vr+/zq+dVz81LXvNTFwy0ebvFwe53n13l+9fzquXmpi4fb6zy/en713LzUNS918XCLh1s83F73cNd9Oz/c8sMtP9zi4ZYfbvnhlh9u+eGWH27xcIuHWzzc8sMtP9zyw+3Vc/NSFw+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uR8/NS1083PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uB09Ny918XDLD7f8cMsPt/xwyw+3eLjFwy0ebvnhlh9u+eF29Hz0HA+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9uR89Hz/Fwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnhdvR89BwPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfbkfPR8/xcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754Xb03LzUxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfbp+fmpS4ebvnhlh9u+eGWH2754RYPt3i4xcMtP9zywy0/3D49Ny918XDLD7f8cMsPt/xwyw+3eLjFwy0ebvnhlh9u+eH26bl5qYuHW3645Ydbfrjlh1t+uMXDLR5u8XDLD7f8cMsPt0/PzUtdPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645Ydbfrh9em5e6uLhFg+3eLjFwy0/3OLh9rmH44dbPNzi4RYPt3i4/ePh9r/Vd8/wx8P9W5VVW12rsXpW313G+ziZfR8ns+/JeDKejCfjyXgynownY2WsjJWxMlbGylgZK2Nl4GQWJ7M4mcXJLE5mcTKLk8HD7fo+54dbPNzi4RYPt3i4xcOtealrXuri4ZYfbvnhlh9u+eEWD7d4uMXDLT/c8sMtP9yunpuXuni45Ydbfrjlh1t+uOWHWzzc4uEWD7f8cMsPt/xwu3puXuri4ZYfbvnhlh9u+eGWH27xcIuHWzzc8sMtP9zyw+3quXmpi4dbfrjlh1t+uOWHW364xcOtealrXuri4ZYfbvFwi4dbPNzi4RYPt3i4xcMtP9zywy0/3JqXuualLj/c8sMtP9yuv6uZl7r8cMsPt/xwyw+3/HDLD7f8cGte6pqXuvxwyw+3/HC7/q5mXup+frj/37b/+z7/XR2rsEqrsmqrazVW/2X8rvZb/btv/10dq7CScWQcGUfGkfGv578rzxGeIzxHyPj3d7XfVVm11bWSETJCRspIGWmv0nOk50jPkTL+/V3td2Wv0l6VvSoZJaNklIySUfaqPEd5jvIcLaO9j7ZXba/aXrWMltEyWkbLuPbqeo7rOa7nuDKu93Ht1bVX115dGSNjZIyMkTH2ajzHeI7xHCNjvI9nr569evbqyXgynown48l49up5jvUc6zlWxnofa6/WXq29WhkrQ8+Pnh89P3p+9Pzo+dHz8/NlnJ+xelbfXh09/3i435UMPT96fvT86PnR86PnR89PyIhjFVZpVVYyQoaeHz0/en70/Oj50fOj558f7nfVVvZKz4+efzzc/1clQ8+Pnh89P3p+9Pzo+dHzzw/3u/I+9Pzo+dHzj4f7XcnQ86PnR8+Pnh89P3p+9Pzzw/2uvA89P3p+9Pzj4X5XMvT86PnR86PnR8+Pnh89//xwvyvvQ8+Pnh89/3i435UMPT96fvT86PnR86PnR88/P9zvyvvQ86PnR88/Hu53JUPPj54fPQ89Dz0PPQ89//xwv6u2ulZj9axkHBl6Hnoeeh56Hnoeeh56/vnhflff+wg9Dz0PPf94uN+VDD0PPQ89Dz0PPQ89Dz3//HC/q7SyV3oeev7xcL8rGXoeeh56Hnoeeh56Hnr++eF+V96Hnoeeh55/PNzvSoaeh56Hnoeeh56Hnoeef36435X3oeeh56HnHw/3u5Kh56Hnoeeh56Hnoeeh558f7nflfeh56Hno+cfD/X/1ZOh56Hnoeeh56Hnoeej554f7XXkfeh56Hnr+8XC/Kxl6Hnoeeh56Hnqeep56/vnhfldpVVZtda3Gv33+2/cc6TxPPU+/2/PIODL0PPU89Tyd53883P6t4r97ht/VsQqrtCqrtrpWY/Ws9luljJSRMlJGykgZKSNlpIyUUTJKRskoGSWjZJSMklEySkbLaBkto2X43Z7tnbd3ruep56nn6TxP53nqeep56nnqeep56nnqeep56nnq+eeH+13J0PPU89Tz9Lv988P9rmToeep56nnqeep56vnnh/tdjZV+6Hnqefrd/vnhflcy9Dz1PPU89Tz1PPX888P9ro5VWKVVWbV/e63G6lnJcJ6XnpfzvJznpeefH+53da3G6lnJ8H1evs8/Hu53JcN5Xs7zcp6X8/zzw/2uvvfx+eF+V/bKeV5+t5fv8/J9/vnhflcynOflPC/neTnPPz/c78r7KHtV9sp5Xn63l+/z8n3++eF+VzKc5+U8L+d5Oc9Lzz8/3O/KXrW9cp6Xnpfv8/J9/vFwvysZel56Xnpeev754X5X3oeel56Xnpff7eX7vPS89Lz0vPS89Lz0vPT888P9rrwPPS89Lz0vv9vL93npeel56Xnpeel56Xnp+eeH+11976P1vPW89bz9bm/f563nreet563nreet563n7Txv53nreet563k7z9t53nreet563nreet563nre7uE6xupZ2Ss9b7/b2/d563nreet563nreet563m7h+vyPvS89bz1vP1ub9/nreet563nreet563nreftPG/neet563nreTvP23neet563nreet563nreet7u4fp6H3reet563n63t+/z1vPW89bz1vPW89bz1vN2D/f54X5X9krPW8/b7/b2fd563nreet563nreet563u7hPj/c78pe6fnV8+t3+/V9fvX86vnV86vnV8+vnl89v363X/ftV8+vnl89v363X7/br55fPb96fvX86vnV86vn1z3cdd9+9fzq+dXz6/v8+j6/en71/Or51fOr51fPr55f93DXffvV86vnV8+v7/Pr+/zq+dXzq+dXz6+eXz2/en7dw1337VfPr55fPb9+t1+/26+eXz2/en71/Or51fOr59c93HXffvX86vnV8+t3+/V9fvX86vnV86vnV8+vnl89v+7hrvv2q+dXz6+eX7/br+/zq+dXz6+eXz2/en71/Or5dQ933bdfPb96fvX8+t0+vs9Hz0fPR89Hz0fPR89Hz8f3+fg+Hz0fPR89H7/bxz3c6Pno+ej56Pno+ej56Pm4hxv37aPno+ej5+N3+7iHGz0fPR89Hz0fPR89Hz0f93Djvn30fPR89Hz8bh/3cKPno+ej56Pno+ej56Pn4x5u3LePno+ej56P3+2j5+M8H+f56Pn43T7u4cb3+ej56Pno+TjP/3i4/W/13TP88XD/rebH6liFVVqVVVtdq7GSMTKejCfjyXgynown48l4Mp6MJ2NlrIyVsTJWxspYGStjZeyX8X5+rI7V9z6e7/Pn+/zp+dPzp+fPef6c50/Pn54/PX96/vT86fnT86fnT8+fnj/37c99+9Pzp+dPz5/f7c/3+dPzp+dPz5+ePz1/ev70/Llvf+7bn54/PX96/vxuf77Pn54/PX96/vT86fnT86fnz337c9/+9Pzp+dPz53f7833+9Py5b3/O8+c8f3r+nOfPef70/LmHe+7hnr+rPef587v9+T5/vs+fe7jnPH/O8+c8f87z5zx/7uGe+/bnvv35u9pznj+/25/v8+f7/LmHe87z5zx/zvPnPH/O8+ce7rlvf+7bn7+rPef587v9+T5/vs+fe7jnPF/n+TrP13m+zvPV83Xfvu7b19/V1nm+er6+z9f3+bqHWz1fPV89Xz1fPV/3cOvvaqvnq+er5+t3+/o+Xz1fPV89Xz1fPV89Xz1f93Dr72qr56vnq+frd/v6Pl89Xz1fPV89Xz1fPV89X/dw6+9qq+er56vn63f7+j5fPV89Xz1fPV89Xz1fPV/n+TrPV89Xz1fP13m+zvPV89Xz1fPV89Xz1fPV83UPt+7bV89Xz1fP1+/29X2+er56vnq+er56vnq+er7u4dZ9++r56vnq+frdvr7PV89Xz1fPV8/xcAcPd/Bw5+c7z8/Pd56fn6/n5+fr+fnmpf6uxr99VjKOjCPj6/nBwx083MHDnZ8j47tvP58f7ne13+rr+cHDnc8P97uSETJCxtfzg4c7eLiDhzufH+53dazsVdqrtFcpI2WkjJSRMspelecoz1Geo2SU91H2quxV2auS0TJaRstoGW2v2nO052jP0TLa+7j26tqra6+ujCvjyrgyroxrr67nGM8xnmNkjPcx9mrs1dirkTEyRsaT8WQ8e/U8x/Mcz3M8Gc/7ePbq2au1VytjZayMlbEy1l6t51jPoeefH+53dazCKq3Kqv3bazVWz0qGnuPhDh7u4OHO54f7XbXVtRqrZyUjZOj50fOj50fP8XAHD3fwcOfzw/2uvvdx9Pzo+dFzPNz5/HC/Kxl6fvT86Dke7uDhDh7ufH6435X3oedHz4+e4+HO54f7XcnQ86PnR8/xcAcPd/Bw5/PD/a68Dz0/en70HA93Pj/c70qGnh89P3qOhzt4uIOHO58f7nflfej50fOj53i48/nhflcy9Pzo+dFzPNzBwx083Pn8cL8r70PPj54fPcfDnc8P97uSoedHz4+e4+EOHu7g4c7nh/tdfe8j9Dz0PPQcD3fwcAcPd/BwJ/QcD3fiR8aRoed4uIOHO3i488fD7X+rf/cM54+H+7d6VvutPk7mxMfJnPg4mRMfJ3Pi42ROfJzMiZARMkJGyEgZKSNlpIyUkTJSRspIGSmjZJSMklEySkbJKBklo2SUjPY+2jtv71zP8XAHD3fwcAcPd0LPQ8/xcCf0PPQ89Dz0HA938HAHD3c+P9zvSoaeh56HnuPhzueH+13J0PPQ89BzPNzBwx083Pn8cL+rtNIPPQ89x8Odzw/3u5Kh56Hnoed4uIOHO3i48/nhfldjZa/0PPUcD3c+P9zvKq3Kqq2u1Vg9q+858HDn88P9rsIqrcpKxpFxZBwZzvN0nqfzPJ3n6Tz//HC/q7a6VmP1rGSkjJSRMpzn6TxP53k6z9N5/vnhflfeR9mrslfO8/S7/fPD/a5klAzneTrP03mezvN0nqeef36435W9anvlPMfDHTzcwcMdPNzBw53U89Tz1HM83Pn8cL8r70PPU89Tz/Fw5/PD/a5k6Hnqeeo5Hu7g4Q4e7nx+uN+V96Hnqeep53i48/nhflcy9Dz1PPUcD3fwcAcPdz4/3O/K+9Dz1PPUczzcKd/npeel56Xnped4uIOHO3i4U87zcp6Xnpeel57j4U45z0vPS89Lz0vP8XAHD3fwcKdCxnfffkrPS89Lz/Fwp3yfl56Xnpeel57j4Q4e7uDhTqWM7779lJ6Xnpee4+FO+T4vPS89Lz0vPcfDHTzcwcOdcp6X87z0vPS89BwPd8p5Xnpeel56XnqOhzt4uIOHO3VlXO9Dz0vPS8/xcKd8n5eel56Xnpee4+EOHu7g4c7nh/tdeR96Xnpeeo6HO+X7vPS89Lz0vPQcD3fwcAcPdz4/3O/K+9Dz0vPSczzcKd/npeet563nred4uIOHO3i40363f36439Wz+vaq9RwPd9rv9tbz1vPW89ZzPNzBwx083Gn3cJ8f7ncVVmlVVjJ8n7eet563nree4+EOHu7g4U67h/v8cL8re6Xnred4uNO+z1vPW89bz1vP8XAHD3fwcKfdw31+uP+v9Lz1vPUcD3fa7/bW89bz1vPWczzcwcMdPNxp93CfH+53Za/0vPUcD3fa93nreet563nrOR7u4OEOHu60e7jPD/e7sld63nqOhzvt+7z1vPW89bz1HA938HAHD3faPdznh/td2Ss9bz3Hw532fd563nreen71HA938HAHD3eu7/Pr+/zq+dXzq+d4uHPdw109v3p+9fzqOR7u4OEOHu5c93DXffvV86vnV8/xcOe6h7t6fvX86vnVczzcwcMdPNy57uGu+/ar51fPr57j4c51D3f1/Or51fOr53i4g4c7eLhz3cNd9+1Xz6+eXz3Hwx083MHDHTzcuXqOhzvXPdz1fY6HO3i4g4c7eLjzx8Ptf6vvnuGPh/u3ulZj9ay+e4b7cTLnfpzMuR8nc+7HyZw7MkbGyBgZI2NkPBlPxpPxZDwZT8aT8WQ8GU/GylgZK2NlrIyVsTJWht/t1/f5+D7Hwx083MHDHTzcwcOd0fPRczzcGT0fPR89Hz3Hwx083MHDnXHfPu7bR89Hz0fP8XBnfJ+Pno+ej56PnuPhDh7u4OHOuG8f9+2j56Pno+d4uDO+z0fPR89Hz0fP8XAHD3fwcGfct4/79tHz0fPRczzcGd/no+fjvn2c5+M8x8OdcZ6P8xwPd8Y9HB7u4OEOHu7g4Q4e7uDhDh7ujPN8nOfjPB/n+TjPxz3cuG8f9+3j72rjPB+/28f3+fg+H/dw4zwf5/k4z8d5Ps7zcQ837tvHffv4u9o4z8fv9vF9Pr7Pxz3cOM/HeT7O83Gej/P86flz346HO3i4g4c7eLiDhzt4uIOHO3i48/T86fnTczzcee7hnr+rPT1/ev70HA93nu/zp+dPz5+ePz3Hwx083MHDnece7vm72tPzp+dPz/Fw5/k+f3r+9Pzp+dNzPNzBwx083Hnu4Z6/qz09f3r+9BwPd57v86fnT8+fnj89x8MdPNzBw53nPH/O86fnT8+fnuPhznOePz1/ev70/Ok5Hu7g4Q4e7jz3cM99+9Pzp+dPz/Fw5/k+f3r+9Pzp+dNzPNzBwx083Hnu4Z779qfnT8+fnuPhzvN9/vT86fnT86fneLiDhzt4uPOc5895vnq+er56joc76zxfPV89Xz1fPcfDHTzcwcOddQ+37ttXz1fPV8/xcGd9n6+er56vnq+e4+EOHu7g4c66h1v37avnq+er53i4s77PV89Xz1fPV8/xcAcPd/BwZ93Drfv21fPV89VzPNxZ3+er56vnq+er53i4g4c7eLizfrev+/bV89Xz1XM83Fm/21fPV89Xz1fP8XAHD3fwcGfdw6379tXz1fPVczzcWd/nq+er56vnq+d4uIOHO3i4s+7h1n376vnq+eo5Hu6s7/PV89Xz1fPVczzcwcMdPNxZ93Drvn31fL+ex8/X88DDBT9c8MMFP1zwwwU/XODhAg8XeLjghwt+uOCHi5+v5/Hz9TzwcMEPF/xwwQ8X/HDBDxd4uMDDBR4u+OGCHy744eLn63l881J/VzJSRspIGSkj7VV6jvQc6TlSRnofZa/KXpW9Khklo2SUjJJR9qo8R3uO9hwto72Ptldtr9petYyW0TKujCvj2qvrOa7nuJ7jyrjex7VX116NvRoZI2NkjIyRMfZqPMd4jvEcT8bzPp69evbq2asn48l4Mp6MJ2Pt1XqO9RzrOVbGeh9rr9Zerb36frcHHi7wcIGHC364wMPF+e7hgh8u8HCBhws8XODh4o+H2/9W/+4Z4o+H+7cqq7a6VmP1rPZbfZxMnI+TiRMyQkbICBkhI2SEjJCRMlJGykgZKSNlpIyUkTJSRskoGSWjZJSMklHex/d9HvxwgYcLPFzg4QIPF3i4OHp+9BwPF/xwwQ8X/HDBDxd4uMDDBR4u+OGCHy744eLo+dFzPFzwwwU/XPDDBT9c8MMFHi7wcIGHC3644IcLfrg4en70HA8X/HDBDxf8cMEPF/xwgYcLPFzg4YIfLvjhgh8ujp4fPcfDBT9c8MMFP1zwwwU/XODhIpzn4TzHwwU/XODhAg8XeLjAwwUeLvBwgYcLfrjghwt+uAjneTjP+eGCHy744SK+v6tFOM/54YIfLvjhgh8u+OGCHy744SKc5+E854cLfrjgh4tIe+U854cLfrjghwt+uOCHC3644IeLcJ6H85wfLvjhAg8XeLjAwwUeLvBwgYcLPFzg4YIfLvjhIvQcDxf8cMEPF/xwEXoeeo6HC3644IcLfrjghwt+uMDDBR4u8HDBDxf8cMEPF6Hnoed4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cBF6HnqOhwt+uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxep5/xwgYeLdJ7zw0Xqeep56jkeLvBwgYeLPDK++/ZIPU89Tz3Hw0WGDD1PPU89Tz3HwwUeLvBwkSnju2+P1PPU89RzPFxkytDz1PPU89RzPFzg4QIPF+k8T+d56nnqeeo5Hi7SeZ56nnqeep56jocLPFzg4SKvjOt96Dk/XPDDBR4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9cpJ6nnuPhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDRep56jkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XJSel57j4YIfLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww0Xpeek5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1yUnpee4+GCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MNF6XnpOR4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9clJ6XnuPhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDRel56TkeLvjhgh8u+OGCHy744QIPF3i4wMMFP1zwwwU/XJSel57j4YIfLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww0Xrees5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1y0nree4+GCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MNF63nrOR4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9ctJ63nuPhAg8XeLjAwwU/XODhot3D8cMFHi7wcIGHCzxc/PFwf/cvfzxc/bc6VmGVVmXVVtdqrJ7Vd5fRI2NkjIyRMTJGxsgYGSNjZDwZT8aT8WQ8GU/Gk/FkPBlPxspYGStjZfjd3r7P+eECDxd4uMDDBR4u8HBx9fzqOR4u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDxdXzq+d4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cHH1/Oo5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1xcPb96jocLfrjghwt+uOCHC364wMPFdZ5f5zkeLvjhAg8XeLjAwwUeLvBwgYcLPFzwwwU/XPDDxXWeX+c5P1zwwwU/XNyxV85zfrjghwt+uOCHC3644IcLfri4zvPrPOeHC3644IeL++yV85wfLvjhgh8u+OGCHy744YIfLq7z/DrP+eGCHy7wcIGHCzxc4OECDxd4uMDDBR4u+OGCHy5Gz/FwwQ8X/HDBDxej56PneLjghwt+uOCHC3644IcLPFzg4QIPF/xwwQ8X/HAxej56jocLfrjghwt+uOCHC364wMMFHi7wcMEPF/xwwQ8Xo+ej53i44IcLfrjghwt+uOCHCzxc4OECDxf8cMEPF/xwMXrODxd4uBjnOT9cjJ6Pno+e4+ECDxd4uBj3cOO+ffR89Hz0HA8X4/t89Hz0fPR89BwPF3i4wMPFuIcb9+2j56Pno+d4uBjf56Pno+ej56PneLjAwwUeLsZ5Ps7z0fPR89FzPFw85/nT86fnT8+fnuPhAg8XeLh47uGe+3Z+uOCHC364wMMFP1zwwwU/XPDDBT9c4OECDxd4uOCHC3644IeLp+dPz/FwwQ8X/HDBDxf8cMEPF3i4wMMFHi744YIfLvjh4un503M8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uHh6/vQcDxf8cMEPF/xwwQ8X/HCBhws8XODhgh8u+OGCHy6enj89x8MFP1zwwwU/XPDDBT9c4OECDxd4uOCHC3644IeLp+dPz/FwwQ8X/HDBDxf8cMEPF3i4wMMFHi744YIfLvjh4un503M8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uFg9Xz3HwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4vV89VzPFzwwwU/XPDDBT9c8MMFHi7wcIGHC3644IcLfrhYPV89x8MFP1zwwwU/XPDDBT9c4OECDxd4uOCHC3644IeL1fPVczxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364WD1fPcfDBT9c8MMFP1zwwwU/XODhAg8XeLjghwt+uOCHi9Xz1XM8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uFg9Xz3HwwUeLvBwgYcLfrjEw+XPdw+X/HCJh0s8XOLhEg+Xfzzc/rf6d8+Qfzzcf6vzY3WswiqtyqqtrtVYyTgyQkbICBkhI2SEjJARMkJGyEgZKSNlpIyUkTJSRspIGSmjZJSM8j6+7/Pkh0s8XOLhEg+XeLjEw6V5qWleauLhkh8u+eGSHy754RIPl3i4xMMlP1zywyU/XP5cz3E9x5VxZVwZV8aV8fU88XCJh0s8XPLDJT9c8sPlz9fzNC818XDJD5f8cMkPl/xwyQ+XeLjEwyUeLvnhkh8u+eHyZ+3V2quVsTJWxspYGWuv9Ny81DQvNfFwyQ+XeLjEwyUeLvFwiYdLPFzi4ZIfLvnhkh8uzUtN81KTHy754ZIfLs/3d7U0LzX54ZIfLvnhkh8u+eGSHy754dK81DQvNfnhkh8u+eHypL1Ke5UyUkbKSBkpo+xVeY7yHOU59JwfLvFwiYdLPFzi4RIPl3i4xMMlHi754ZIfLs1LTTxc8sMlP1zyw+XRc/NSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uj56bl5p4uOSHS3645IdLfrjkh0s8XOLhEg+X/HDJD5f8cHn03LzUxMMlP1zywyU/XPLDJT9c4uESD5d4uOSHS3645IfL0HN+uMTDZTjP+eEy9Ny81DQvNfFwiYdLPFzGkfHdt2foeei5eamJh8sIGXoeem5eapqXmni4xMMlHi4jZHz37Rl6HnpuXmri4TJShp6HnpuXmualJh4u8XCJh8twnofzPPQ89Ny81MTDZTjPQ89Dz81LTfNSEw+XeLjEw2W0jPY+9JwfLvnhEg+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uQ8/NS008XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uAw9Ny818XDJD5f8cMkPl/xwyQ+XeLjEwyUeLvnhkh8u+eEy9dy81MTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Tz1HM8XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uEw9Tz3HwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vU89RzPFzywyU/XPLDJT9c8sMlHi7xcImHS3645IdLfrhMPU89x8MlP1zywyU/XPLDJT9c4uESD5d4uOSHS3645IfL1HPzUhMPl/xwyQ+X/HDJD5f8cImHSzxc4uGSHy754ZIfLlPPzUtNPFzywyU/XPLDJT9c8sMlHi7xcImHS3645IdLfrhMPTcvNfFwyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnhsvTcvNTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vSc/NSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uS8/NS008XOLhEg+XeLjkh0s8XFbJ8H2Oh0s8XOLhEg+Xfzzc/rf67hn+eLh/q2f13TPUx8lkfZxM1sfJZH2cTNbHyWR9nEzWlXFlXBlXxsgYGSNjZIyMkTEyRsbIGBlPxpPxZDwZT8aT8WQ8GU/Gk+F3e/k+54dLPFzi4RIPl3i4xMOlealpXmri4ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1y2npuXmni45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xw2XpuXmri4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw2XruXmpiYdLfrjkh0t+uOSHS364xMOlealpXmri4ZIfLvFwiYdLPFzi4RIPl3i4xMMlP1zywyU/XJqXmualJj9c8sMlP1z2tVfOc3645IdLfrjkh0t+uOSHS364NC81zUtNfrjkh0t+uOxnr5zn/HDJD5f8cMkPl/xwyQ+X/HBpXmqal5r8cMkPl3i4xMMlHi7xcImHSzxc4uESD5f8cMkPl+alJh4u+eGSHy754fLquXmpiYdLfrjkh0t+uOSHS364xMMlHi7xcMkPl/xwyQ+XV8/NS008XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uLx6bl5q4uGSHy754ZIfLvnhkh8u8XCJh0s8XPLDJT9c8sPl1XN+uMTD5XWe88Pl1XPzUtO81MTDJR4u8XB53cNd9+1Xz6+em5eaeLi8vs+vnl89Ny81zUtNPFzi4RIPl9c93HXffvX86rl5qYmHy+v7/Or51XPzUtO81MTDJR4u8XB5nefXeX71/Oq5eamJh8vrPL96fvXcvNQ0LzXxcImHSzxcjnu4cd/OD5f8cMkPl3i45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xwOXpuXmri4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw+XouXmpiYdLfrjkh0t+uOSHS364xMMlHi7xcMkPl/xwyQ+Xo+fmpSYeLvnhkh8u+eGSHy754RIPl3i4xMMlP1zywyU/XI6ej57j4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw+Xo+eg5Hi754ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1yOno+e4+GSHy754ZIfLvnhkh8u8XCJh0s8XPLDJT9c8sPl0/On53i45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xw+fTcvNTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8un5+alJh4u+eGSHy754ZIfLvnhEg+XeLjEwyU/XPLDJT9cPj03LzXxcMkPl/xwyQ+X/HDJD5d4uMTDJR4u+eGSHy754fLpuXmpiYdLfrjkh0t+uOSHS364xMMlHi7xcMkPl/xwyQ+XT8/NS008XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uHx6bl5q4uESD5d4uMTDJT9c4uHyuYfjh0s8XOLhEg+XeLj84+H2v9V3z/DHw/1bXauxelbfPcPiZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcng4XJ9n/PDJR4u8XCJh0s8XOLh0rzUNC818XDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uV8/NS008XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uFw9Ny818XDJD5f8cMkPl/xwyQ+XeLjEwyUeLvnhkh8u+eFy9dy81MTDJT9c8sMlP1zywyU/XOLh0rzUNC818XDJD1d4uMLDFR6u8HCFhys8XOHhih+u+OGKH67MSy3zUosfrvjhih+ufr6/q5V5qcUPV/xwxQ9X/HDFD1f8cMUPV+allnmpxQ9X/HDFD1c/Ya/SXqWMlJEyUkbKSHuVniM9R3qOklHeR9mrsldlr0pGySgZJaNktL1qz9Geoz1Hy2jvo+1V26u2Vy3jyrgyrowr49qr6zmu57ie48q43sfYq7FXY69GxsgYGSNjZIy9Gs/xPMfzHE/G8z6evXr26tmrJ+PJeDJWxspYe7WeYz3Heo6Vsd7H2is954crPFyd7zwvfrg6em5eapmXWni4wsMVHq7OkfHdt9fR86Pn5qUWHq7OkaHnR8/NSy3zUgsPV3i4wsPVCRnffXsdPT96bl5q4eHqpAw9P3puXmqZl1p4uMLDFR6uTspI70PPj56bl1p4uDolQ8+PnpuXWualFh6u8HCFh6vTMtr70HN+uOKHKzxc8cMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364OnpuXmrh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw9XRc/NSCw9X/HDFD1f8cMUPV/xwhYcrPFzh4Yofrvjhih+ujp6bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cBV6HnqOhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1eh56HneLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HAVeh56jocrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9Xoeeh53i44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xwFXpuXmrh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw1XouXmphYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9XoefmpRYervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XKWem5daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HCVem5eauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHDVeq5eamFhys8XOHhCg9X/HCFh6ssGSVDz/FwhYcrPFz98XD73+rfPUP98XD/VmXVVtdqrJ7VfquPk6n8OJnKK+PKuDKujCvjyrgyroyRMTJGxsgYGSNjZIyMkTEynown48l4Mp6MJ8Pv9nze+fPO9RwPV3i4wsMVHq7MSy3zUgsPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744ar03LzUwsMVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oer0nPzUgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744YofrkrPzUstPFzxwxU/XPHDFT9c8cMVHq7MSy3zUgsPV/xwhYcrPFzh4QoPV3i4wsMVHq744YofrvjhyrzUMi+1+OGKH6744aquvXKe88MVP1zxwxU/XPHDFT9c8cOVeallXmrxwxU/XPHDVY29cp7zwxU/XPHDFT9c8cMVP1zxw5V5qWVeavHDFT9c4eEKD1d4uMLDFR6u8HCFhys8XPHDFT9cmZdaeLjihyt+uOKHq9Zz81ILD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH65az81LLTxc8cMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364aj03L7XwcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744ar1nB+u8HDVznN+uGo9Ny+1zEstPFzh4QoPV+0ertv70PPWc/NSCw9X7fu89bz13LzUMi+18HCFhys8XLV7uB7vQ89bz81LLTxcte/z1vPWc/NSy7zUwsMVHq7wcNXO83aet563npuXWni4aud563nruXmpZV5q4eEKD1d4uLru4a77dn644ocrfrjCwxU/XPHDFT9c8cMVP1zh4QoPV3i44ocrfrjih6ur5+alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9cXT03L7XwcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744erquXmphYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9XV8+vnuPhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1dXzq+d4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cHX1/Oo5Hq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cMVP1yNno+e4+GKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV6Ll5qYWHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV6Pn5qUWHq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cMVP1yNnpuXWni44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xwNXpuXmrh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw9XouXmphYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9Xo+fmpRYervBwhYcrPFzxwxUersY9HD9c4eEKD1d4uMLD1R8P93f/8sfD1X+rYxVWaVVWbXWtxupZfXcZ78g4Mo6MI+PIODKOjCPjyDgyQkbICBkhI2SEjJARMkJGyEgZKSNlpAy/25/vc364wsMVHq7wcIWHKzxcmZda5qUWHq744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV03PzUgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744Yofrp6em5daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HD19Ny81MLDFT9c8cMVP1zxwxU/XOHhyrzUMi+18HDFD1d4uMLDFR6u8HCFhys8XOHhih+u+OGKH67MSy3zUosfrvjhih+u1t/VzEstfrjihyt+uOKHK3644ocrfrgyL7XMSy1+uOKHK364Wn9XMy+1+OGKH6744Yofrvjhih+u+OHKvNQyL7X44YofrvBwhYcrPFzh4QoPV3i4wsMVHq744YofrsxLLTxc8cMVP1zxw9XquXmphYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9Xq+fmpRYervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XK2em5daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HC1es4PV3i4Wuc5P1z/fD1v81LbvNTGwzUervFw/fPdw/XPd9/eP1/P++freZuX2ni4/jkyjowj48j4et54uMbDNR6uf0LGd9/eP1/P++freZuX2ni4/gkZISNkhIy0V+k50nOk50gZ33neP2mv0l6lvUoZJaNklIySUfaqPEd5jvIcJaO8j7ZXba/aXrWMltEyWkbLaHvVnuN6jus5rozrfVx7de3VtVdXxpVxZYyMkTH2ajzHeI7xHCNjvI+xV2Ovnr16Mp6MJ+PJeDKevXqe43mO5zlWxnofa6/WXq29WhkrY2WsDD3nh2s8XOPhGg/X/HDND9f8cH30/Og5Hq754Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1wfPT96jodrfrjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/XR8+PnuPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPD9dHzo+d4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cH303LzUxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofro+fmpTYervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XB89Ny+18XDND9f8cM0P1/xwzQ/XeLjGwzUervnhmh+u+eE69Ny81MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Bz81IbD9f8cM0P1/xwzQ/X/HCNh2s8XOPhmh+u+eGaH65Dz81LbTxc4+EaD9d4uOaHazxcR8koGXqOh2s8XOPh+o+H2/9W/+4Z+o+H+2/VP1bHKqzSqqza6lqNlYyWcWVcGVfGlXFlXBlXxpVxZVwZI2NkjIyRMTJGxsgYGSNjZDwZT8bzPp53/rxzPcfDNR6u8XCNh2vzUtu81MbDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uE49Ny+18XDND9f8cM0P1/xwzQ/XeLjGwzUervnhmh+u+eE69dy81MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Rz81IbD9f8cM0P1/xwzQ/X/HCNh2vzUtu81MbDNT9c4+EaD9d4uMbDNR6u8XCNh2t+uOaHa364Ni+1zUttfrjmh2t+uM62V85zfrjmh2t+uOaHa3645odrfrg2L7XNS21+uOaHa364zrFXznN+uOaHa3645odrfrjmh2t+uDYvtc1LbX645odrPFzj4RoP13i4xsM1Hq7xcI2Ha3645odr81IbD9f8cM0P1/xwXXpuXmrj4Zofrvnhmh+u+eGaH67xcI2Hazxc88M1P1zzw3XpuXmpjYdrfrjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/XpefmpTYervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XJee88M1Hq7Lec4P16Xn5qW2eamNh2s8XOPhulpGex96XnpuXmrj4bp8n5eel56bl9rmpTYervFwjYfrujKu96HnpefmpTYersv3eel56bl5qW1eauPhGg/XeLgu53k5z0vPS8/NS208XJfzvPS89Ny81DYvtfFwjYdrPFzXyljvQ8/54ZofrvFwzQ/X/HDND9f8cM0P13i4xsM1Hq754ZofrvnhuvXcvNTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vWc/NSGw/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+uW8/NS208XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uG49bz3HwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vW89ZzPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrhuPW89x8M1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr1vPWczxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364vnpuXmrj4Zofrvnhmh+u+eGaH67xcI2Hazxc88M1P1zzw/XVc/NSGw/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+ur56bl9p4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cH313LzUxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofrq+fmpTYervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XF89Ny+18XCNh2s8XOPhmh+u8XB93cPxwzUervFwjYdrPFz/8XD73+q7Z/jj4f6tntV3zzAfJ9PzcTI9HyfT83EyPR8n0/NxMj0fJ9PzcTI9HyfT8yPjyDgyjowj48g4Mo6MI+PIODJCRsgIGSEjZISMkBEyQkbI8Lt9fJ/zwzUervFwjYdrPFzj4dq81DYvtfFwzQ/X/HDND9f8cI2Hazxc4+GaH6754ZofrkfPzUttPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrgePTcvtfFwzQ/X/HDND9f8cM0P13i4xsM1Hq754ZofrvnhevTcvNTGwzU/XPPDNT9c88M1P1zj4dq81DYvtfFwzQ/XeLjGwzUervFwjYdrPFzj4Zofrvnhmh+uzUtt81KbH6754Zofrp+/q5mX2vxwzQ/X/HDND9f8cM0P1/xwbV5qm5fa/HDND9f8cP38Xc281OaHa3645odrfrjmh2t+uOaHa/NS27zU5odrfrjGwzUervFwjYdrPFzj4RoP13i45odrfrg2L7XxcM0P1/xwzQ/XT8/NS208XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uH56bl5q4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88P103PzUhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754Zofrp+e88M1Hq6f85wfrp+em5fa5qU2Hq7xcI2H63UPt+7bV89Xz81LbTxcr+/z1fPVc/NS27zUxsM1Hq7xcL3u4dZ9++r56rl5qY2H6/V9vnq+em5eapuX2ni4xsM1Hq7Xeb7O89Xz1XPzUhsP1+s8Xz1fPTcvtc1LbTxc4+EaD9frHm7dt/PDNT9c88M1Hq754Zofrvnhmh+u+eEaD9d4uMbD/Y+ne8uVHDmCILqlzsx47n9jUvU0z19AwMBBsl0s5jVYJD9c8sMlP1yuntuXmni45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xwuXpuX2ri4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw+XquX2piYdLfrjkh0t+uOSHS364xMMlHi7xcMUPV/xwxQ9Xf76e15+v54WHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV3++ntefr+eFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1d/nnv13Ksn48l4Mp6MJ+O5V891hOsI1xEywvMI9yrcq3CvQkbICBkpI2Wke5WuI11Huo6UkZ5HulfpXpV7VTJKRskoGSWj3KtyHeU6ynW0jPY82r1q96rdq5bRMlpGy2gZ416N6xjXMa5jZIznMe7VuFfjXo2MlbEyVsbKWPdqXce6jnUdK+M7by9+uDp6bl9q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV0XP7UgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744Yofro6e25daeLjCwxUervBwxQ9XeLg6T8aToed4uMLDFR6u/vJw+9/075yh/vJw/6YytWlM+00fJ1Pn42TqfJxMnY+TqZMyUkbKSBkpI2WUjJJRMkpGySgZJaNklIyS0TJaRstoGS2jZbSMltGeR3vm45nrOR6u8HCFhys8XNmXWvalFh6u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1dFz+1ILD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH66untuXWni44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xwdfXcvtTCwxU/XPHDFT9c8cMVP1zh4cq+1LIvtfBwxQ9XeLjCwxUervBwhYcrPFzh4Yofrvjhih+u7Est+1KLH6744Yofrm66V97n/HDFD1f8cMUPV/xwxQ9X/HBlX2rZl1r8cMUPV/xwdcu98j7nhyt+uOKHK3644ocrfrjihyv7Usu+1OKHK364wsMVHq7wcIWHKzxc4eEKD1d4uOKHK364si+18HDFD1f8cMUPV1fP7UstPFzxwxU/XPHDFT9c8cMVHq7wcIWHK3644ocrfrh6em5fauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1dNz+1ILD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH66envPDFR6unvc5P1w9PbcvtexLLTxc4eEKD1cvZaTnoedPz+1LLTxcvZSh50/P7Ust+1ILD1d4uMLD1SsZ5Xno+dNz+1ILD1evZej503P7Usu+1MLDFR6u8HD1vM+f9/nT86fn9qUWHq6e9/nT86fn9qWWfamFhys8XOHh6q2M9Tz0nB+u+OEKD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH65Cz+1LLTxc8cMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364Cj23L7XwcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744Sr03L7UwsMVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oer0PPQczxc8cMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364Cj0PPcfDFT9c8cMVP1zxwxU/XOHhCg9XeLjihyt+uOKHq9Dz0HM8XPHDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uAo9Dz3HwxU/XPHDFT9c8cMVP1zh4QoPV3i44ocrfrjih6vUc/tSCw9X/HDFD1f8cMUPV/xwhYcrPFzh4Yofrvjhih+uUs/tSy08XPHDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uEo9ty+18HDFD1f8cMUPV/xwxQ9XeLjCwxUervjhih+u+OEq9dy+1MLDFT9c8cMVP1zxwxU/XOHhCg9XeLjihyt+uOKHq9Rz+1ILD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH65Sz+1LLTxc4eEKD1d4uOKHKzxcpXM4frjCwxUervBwhYervzzc/jd95wx/ebh/U5jSVKY2jek7y6iPk6n6OJmqj5Op+jiZqo+Tqfo4maqPk6n6OJmqj5Op+iPjyDgyjowj48g4Mo6MI+PIODKujCvjyrgyrowrw+/28n3OD1d4uMLDFR6u8HCFhyv7Usu+1MLDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uCo9ty+18HDFD1f8cMUPV/xwxQ9XeLjCwxUervjhih+u+OGq9Ny+1MLDFT9c8cMVP1zxwxU/XOHhCg9XeLjihyt+uOKHq9Jz+1ILD1f8cMUPV/xwxQ9X/HCFhyv7Usu+1MLDFT9c4eEKD1d4uMLDFR6u8HCFhyt+uOKHK364si+17Estfrjihyt+uGp/V7Mvtfjhih+u+OGKH6744Yofrvjhyr7Usi+1+OGKH6744ar9Xc2+1OKHK3644ocrfrjihyt+uOKHK/tSy77U4ocrfrjCwxUervBwhYcrPFzh4QoPV3i44ocrfriyL7XwcMUPV/xwxQ9Xref2pRYervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XLWe25daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HDVem5fauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHDVes5P1zh4aq9z/nhqvXcvtSyL7XwcIWHKzxctXO4dt4+ej56bl9q4eFqfJ+Pno+e25da9qUWHq7wcIWHq3EON87bR89Hz+1LLTxcje/z0fPRc/tSy77UwsMVHq7wcDXe5+N9Pno+em5fauHharzPR89Hz+1LLftSCw9XeLjCw9U4hxvn7fxwxQ9X/HCFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1ej5/alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9cjZ7bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cDV6bl9q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV6PnqOR6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9crZ6vnuPhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1er56jkervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XK2er57j4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw9XquX2phYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9Xq+f2pRYervjhih+u+OGKH6744QoPV3i4wsMVP1zxwxU/XK2e25daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HC1em5fauHhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPD9Z+v521fauPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPD9Z+v521fauPhGg/XeLjGwzU/XOPh+s+T8WQ81/Fcx5PxXMev5/t3in/nDP2Xh/s3XdMzhSlNZWrTmPabUkbKSBkpI2WkjJSRMlJGyigZJaNklIySUTJKRskoGSWjZbSMltEy2vNoz7w98/Y82vNo/67Gv6vxzMczH898ZIxnPp75yBgZI2NlrIyVsTJWxrqOdR0rY2XoOT9c88M1P1zj4RoP13i45odrfrjmh+uj5/alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cHz23L7XxcM0P1/xwzQ/X/HDND9d4uLYvte1LbTxc88M1Hq7xcI2Hazxc4+EaD9d4uOaHa3645odr+1LbvtTmh2t+uOaH65PuVbpXKSNlpIyUkTLSvUrXUa6jXEfJKM+j3Ktyr8q9Khklo2S0jJbR7lW7jnYd7Tr0nB+u8XCNh2s8XOPhGg/XeLjGwzUervnhmh+u7UttPFzzwzU/XPPD9dFz+1IbD9f8cM0P1/xwzQ/X/HCNh2s8XOPhmh+u+eGaH66vntuX2ni45odrfrjmh2t+uOaHazxc4+EaD9f8cM0P1/xwffXcvtTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+ur5/xwjYfr633OD9dXz+1LbftSGw/XeLjGw/UNGeF56PnVc/tSGw/XN2Xo+dVz+1LbvtTGwzUervFwfUtGeR56fvXcvtTGw/UtGXp+9dy+1LYvtfFwjYdrPFxf7/PrfX71/Oq5famNh+vrfX71/Oq5faltX2rj4RoP13i4viNjPA8954drfrjGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+un5/alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cPz23L7XxcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754frpuX2pjYdrfrjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/XT8+fnuPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPD9dPzp+d4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cP30/Ok5Hq754Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1w/PX96jodrfrjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/Xoef2pTYervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XIee25faeLjmh2t+uOaHa3645odrPFzj4RoP1/xwzQ/X/HAdem5fauPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPDdei5famNh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9eh5/alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9ch57bl9p4uMbDNR6u8XDND9d4uI6R4fscD9d4uMbDNR6u//Jw+9/0nTP85eH+m/aP6Ziu6ZnClKYytUnGx8l0fpxM58fJdH6cTOfHyXR+nEznx8l0fpxM58fJdH6cTOcfGUfGkXFkHBlHxpFxZBwZR8aRcWVcGX63p+9zfrjGwzUervFwjYdrPFzbl9r2pTYervnhmh+u+eGaH67xcI2Hazxc88M1P1zzw3XquX2pjYdrfrjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/Xqef2pTYervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XKee25faeLjmh2t+uOaHa3645odrPFzbl9r2pTYervnhGg/XeLjGwzUervFwjYdrPFzzwzU/XPPDtX2pbV9q88M1P1zzw3V+f1dr+1KbH6754Zofrvnhmh+u+eGaH67tS237Upsfrvnhmh+u6/u7WtuX2vxwzQ/X/HDND9f8cM0P1/xwbV9q25fa/HDND9d4uMbDNR6u8XCNh2s8XOPhGg/X/HDND9f2pTYervnhmh+u+eG69Ny+1MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Jz+1IbD9f8cM0P1/xwzQ/X/HCNh2s8XOPhmh+u+eGaH65Lz+1LbTxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364Lj3nh2s8XJf3OT9cl57bl9r2pTYervFwjYfrcg5XzttLz0vP7UttPFy37/PW89Zz+1LbvtTGwzUervFw3c7h2nl763nruX2pjYfr9n3eet56bl9q25faeLjGwzUertv7vL3PW89bz+1LbTxct/d563nruX2pbV9q4+EaD9d4uG7ncO28nR+u+eGaH67xcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754br13L7UxsM1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr1nP7UhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754ZofrlvP7UttPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrhuPW89x8M1P1zzwzU/XPPDNT9c4+EaD9d4uOaHa3645ofr0fPRczxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364Hj0fPcfDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Hz0XM8XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uB49ty+18XDND9f8cM0P1/xwzQ/XeLjGwzUervnhmh+u+eF69Ny+1MbDNT9c88M1P1zzwzU/XOPhGg/XeLjmh2t+uOaH69Fz+1IbD9f8cM0P1/xwzQ/X/HCNh2s8XOPhmh+u+eGaH65Hz+1LbTxc88M1P1zzwzU/XPPDNR6u8XCNh2t+uOaHa364Xj23L7XxcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754Xr13L7UxsM1Hq7xcI2Ha364xsP1Oofjh2s8XOPhGg/XeLj+y8Ptf9N3zvCXh/s3jek7Z1iczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOBg/X6/ucH67xcI2Hazxc4+EaD9f2pbZ9qY2Ha3645odrfrjmh2s8XOPhGg/X/HDND9f8cL16bl9q4+GaH6754Zofrvnhmh+u8XCDhxs83PDDDT/c8MPNn6/nY1/q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MPNn6/nY1/q4OGGH2744YYfbvjhhh9u8HBjX+rYlzp4uOGHGzzc4OEGDzd4uMHDDR5u8HDDDzf8cMMPN/aljn2pww83/HDDDzd/wr0K9ypkpIyUkTJSRrpX6TrSdaTrSBnpeZR7Ve5VuVclo2SUjJJRMsq9KtfRrqNdR8toz6Pdq3av2r1qGS2jZYyMkTHu1biOcR3jOkbGeB7jXo17te7VylgZK2NlrIx1r9Z1rOvQc3644Ycbfrg5em5f6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDzdFz+1IHDzf8cMMPN/xwww83/HCDhxs83ODhhh9u+OGGH26OnvPDDR5uzpOh50fP7Usd+1IHDzd4uMHDzQkZ4Xno+dFz+1IHDzcnZOj50XP7Use+1MHDDR5u8HBzUkZ6Hnp+9Ny+1MHDzSkZen703L7UsS918HCDhxs83JyW0Z6Hnh89ty918HBzWoaeHz23L3XsSx083ODhBg83Z2SM56Hn/HDDDzd4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cHP13L7UwcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yebq+f2pQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3Fw9ty918HDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OHm6vnVczzc8MMNP9zwww0/3PDDDR5u8HCDhxt+uOGHG364uXp+9RwPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbq6eXz3Hww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5ur51fP8XDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OHm6rl9qYOHG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPN0/P7UsdPNzwww0/3PDDDT/c8MMNHm7wcIOHG3644Ycbfrh5em5f6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDzdNz+1IHDzf8cMMPN/xwww83/HCDhxs83ODhhh9u+OGGH26entuXOni44Ycbfrjhhxt+uOGHGzzc4OEGDzf8cMMPN/xw8/TcvtTBww0ebvBwg4cbfrjBw81rGS1Dz/Fwg4cbPNz85eH2v+nfOcP85eH+TWVq05j2mz5OZt7Hycz7OJl5Hyczb2WsjJWxMlbGx8lMfJzMxMfJTHyczMTHyUx8nMzEx8lMfJzMxMfJTHyczMQfGUfGkXFkHBlHxpFxZBwZfreH73N+uMHDDR5u8HCDhxs83NiXOvalDh5u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDTei5famDhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzeh5/alDh5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/chJ7blzp4uOGHG3644Ycbfrjhhxs83NiXOvalDh5u+OEGDzd4uMHDDR5u8HCDhxs83PDDDT/c8MONfaljX+rwww0/3PDDTax75X3ODzf8cMMPN/xwww83/HDDDzf2pY59qcMPN/xwww83+f1dbexLHX644Ycbfrjhhxt+uOGHG364sS917Esdfrjhhxs83ODhBg83eLjBww0ebvBwg4cbfrjhhxv7UgcPN/xwww83/HCTem5f6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDTeq5famDhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzep5/alDh5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/cpJ7zww0ebtL7nB9uUs/tSx37UgcPN3i4wcNNOofL9Tz0PPXcvtTBw036Pk89Tz23L3XsSx083ODhBg835RyunLeXnpee25c6eLgp3+el56Xn9qWOfamDhxs83ODhprzPy/u89Lz03L7UwcNNeZ+Xnpee25c69qUOHm7wcIOHm3IOV87b+eGGH2744QYPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbkrP7UsdPNzwww0/3PDDDT/c8MMNHm7wcIOHG3644YcbfrgpPbcvdfBwww83/HDDDzf8cMMPN3i4wcMNHm744YYfbvjhpvTcvtTBww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5vS89JzPNzwww0/3PDDDT/c8MMNHm7wcIOHG3644YcbfrhpPW89x8MNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yeb1vPWczzc8MMNP9zwww0/3PDDDR5u8HCDhxt+uOGHG364aT1vPcfDDT/c8MMNP9zwww0/3ODhBg83eLjhhxt+uOGHm9Zz+1IHDzf8cMMPN/xwww83/HCDhxs83ODhhh9u+OGGH25az+1LHTzc8MMNP9zwww0/3PDDDR5u8HCDhxt+uOGHG364aT23L3XwcMMPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744ab13L7UwcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yeb0XP7UgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbkbP7UsdPNzg4QYPN3i44YcbPNyMczh+uMHDDR5u8HCDh5u/PNz+N33nDH95uH9TmNJUpjaN6TvLmI+Tmfk4mZmQETJCRsgIGSEjZISMlJEyUkbKSBkpI2WkjJSRMkpGySgZJaNklAy/28f3OT/c4OEGDzd4uMHDDR5u7Esd+1IHDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OFm9Ny+1MHDDT/c8MMNP9zwww0/3ODhBg83eLjhhxt+uOGHm9Vz+1IHDzf8cMMPN/xwww83/HCDhxs83ODhhh9u+OGGH25Wz+1LHTzc8MMNP9zwww0/3PDDDR5u7Esd+1IHDzf8cIOHGzzc4OEGDzd4uMHDDR5u+OGGH2744ca+1LEvdfjhhh9u+OFm/V3NvtThhxt+uOGHG3644Ycbfrjhhxv7Use+1OGHG3644Yeb9Xc1+1KHH2744YYfbvjhhh9u+OGGH27sSx37UocfbvjhBg83eLjBww0ebvBwg4cbPNzg4YYfbvjhxr7UwcMNP9zwww0/3Kye25c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HCzX8/XvtTFwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9s/X8/XvtTFwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9s/X8+XH27xcPvnyXgynown47lXz3U81/Fcx5PxPI9wr8K9CvcqZISMkBEyQka4V+E60nWk60gZ6Xmke5XuVbpXKSNlpIySUTLKvSrXUa6jXEfJKM+j3Ktyr9q9ahkto2W0jJbR7lW7jnYd7TpGxnge416NezXu1cgYGSNjZIyMda/WdazrWNexMtbzWPdq3at1r77f7csPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754fbouX2pi4dbfrjlh1t+uOWHW364xcMtHm7xcMsPt/xwyw+3R8/tS1083PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uD16fvQcD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH26Pnh89x8MtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfbo+dHz/Fwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnh9uj50XM83PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uD16bl/q4uGWH2754ZYfbvnhlh9u8XCLh1s83PLDLT/c8sPt1XP7UhcPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfbq+e25e6eLjlh1t+uOWHW3645YdbPNzi4RYPt/xwyw+3/HB79dy+1MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH26vn9qUuHm754ZYfbvnhlh9u+eEWD7d4uMXDLT/c8sMtP9xePbcvdfFwi4dbPNzi4ZYfbvFwe1tGy9BzPNzi4RYPt395uP07zb9zhv3Lw/2brumZwpSmMrVpTPtNK2NlrIyVsTJWxspYGSvj42T2fZzMvo+T2fdxMvs+Tmbfx8ns+ziZfR8ns+/jZPZ9nMy+PzKOjCPjyDgy/G5/3/f58sMtHm7xcIuHWzzc4uHWvtS1L3XxcMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH26fntuXuni45Ydbfrjlh1t+uOWHWzzc4uEWD7f8cMsPt/xw+/TcvtTFwy0/3PLDLT/c8sMtP9zi4RYPt3i45Ydbfrjlh9un5/alLh5u+eGWH2754ZYfbvnhFg+39qWufamLh1t+uMXDLR5u8XCLh1s83OLhFg+3/HDLD7f8cGtf6tqXuvxwyw+3/HD71r3yPueHW3645Ydbfrjlh1t+uOWHW/tS177U5Ydbfrjlh9v4/q629qUuP9zywy0/3PLDLT/c8sMtP9zal7r2pS4/3PLDLR5u8XCLh1s83OLhFg+3eLjFwy0/3PLDrX2pi4dbfrjlh1t+uA09ty918XDLD7f8cMsPt/xwyw+3eLjFwy0ebvnhlh9u+eE29Ny+1MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH29Bz+1IXD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25Dz/nhFg+34X3OD7eh5/alrn2pi4dbPNzi4TZGxngeeh56bl/q4uE2fJ+Hnoee25e69qUuHm7xcIuH23QOl995+6aep57bl7p4uE3f56nnqef2pa59qYuHWzzc4uE2vc/T+zz1PPXcvtTFw216n6eep57bl7r2pS4ebvFwi4fbdA6X33n78sMtP9zywy0ebvnhlh9u+eGWH2754RYPt3i4xcMtP9zywy0/3Kae25e6eLjlh1t+uOWHW3645YdbPNzi4RYPt/xwyw+3/HCbem5f6uLhlh9u+eGWH2754ZYfbvFwi4dbPNzywy0/3PLDbeq5famLh1t+uOWHW3645YdbfrjFwy0ebvFwyw+3/HDLD7ep56nneLjlh1t+uOWHW3645YdbPNzi4RYPt/xwyw+3/HBbel56jodbfrjlh1t+uOWHW364xcMtHm7xcMsPt/xwyw+3peel53i45Ydbfrjlh1t+uOWHWzzc4uEWD7f8cMsPt/xwW3peeo6HW3645Ydbfrjlh1t+uMXDLR5u8XDLD7f8cMsPt6Xn9qUuHm754ZYfbvnhlh9u+eEWD7d4uMXDLT/c8sMtP9yWntuXuni45Ydbfrjlh1t+uOWHWzzc4uEWD7f8cMsPt/xwW3puX+ri4ZYfbvnhlh9u+eGWH27xcIuHWzzc8sMtP9zyw23puX2pi4dbfrjlh1t+uOWHW364xcMtHm7xcMsPt/xwyw+3pef2pS4ebvnhlh9u+eGWH2754RYPt3i4xcMtP9zywy0/3Lae25e6eLjFwy0ebvFwyw+3eLht53D8cIuHWzzc4uEWD7d/ebj9b/rOGf7ycP9N74/pmK7pmcKUpjK1ScaTETJCRsgIGSEjZISMkBEyQkbKSBkpI2WkjJSRMlJGykgZJaNk+N3evs/54RYPt3i4xcMtHm7xcGtf6tqXuni45Ydbfrjlh1t+uMXDLR5u8XDLD7f8cMsPt63n9qUuHm754ZYfbvnhlh9u+eEWD7d4uMXDLT/c8sMtP9y2ntuXuni45Ydbfrjlh1t+uOWHWzzc4uEWD7f8cMsPt/xwO3puX+ri4ZYfbvnhlh9u+eGWH27xcGtf6tqXuni45YdbPNzi4RYPt3i4xcMtHm7xcMsPt/xwyw+39qWufanLD7f8cMsPt+PvavalLj/c8sMtP9zywy0/3PLDLT/c2pe69qUuP9zywy0/3I6/q9mXuvxwyw+3/HDLD7f8cMsPt/xwa1/q2pe6/HDLD7d4uMXDLR5u8XCLh1s83OLhFg+3/HDLD7f2pS4ebvnhlh9u+eF29Ny+1MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH29Fz+1IXD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25Xz+1LXTzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364XT3nh1s83K73OT/crp7bl7r2pS4ebvFwi4fbdQ63zttXz1fP7UtdPNyu7/PV89Vz+1LXvtTFwy0ebvFwu87h1nn76vnquX2pi4fb9X2+er56bl/q2pe6eLjFwy0ebtf7fL3PV89Xz+1LXTzcrvf56vnquX2pa1/q4uEWD7d4uF3ncOu8nR9u+eGWH27xcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754Xb13L7UxcMtP9zywy0/3H5+uP+fwv3r+W86pmt6pv8yflOaytSmMck4Mo6MI+PI+Nfz35SmMrVJxr/z9v9P/3r+m47pmmRcGVfGlXFl/Ov5b3Idz3U81/Fk/Dtv/03u1XOvnnv1ZDwZT0bICBnhXoXrCNcRriNkhOcR7lW4V+lepYyUkTJSRspI9ypdR7qOdB0lozyPcq/KvSr3qmSUjJJRMkpGu1ftOtp1tOtoGe15tHvV7lW7Vy1jZIyMkTEyxr0a1zGuY1zHyBjPY92rda/WvVoZK2NlrIyVse6Vnh89P3r++eF+0zOFKU1lav/tmGTo+dHzo+dHz4+eHz3//HC/qU1j+u7V0fOPh/tNMvT86PnR86PnR8+Pnh89//xwv+mY3Cs9P3r+8XC/SYaeHz0/en70/Oj50fOj558f7jd5Hnp+9Pzo+cfD/X9KGXp+9Pzo+dHzo+dHz4+ef3643+R56PnR86PnHw/3m1xHuY5yHXr+8XC/SUbL0POj50fPPx7uN+Xf85ff9N85w29q05j2m/5xMr/pmK7pmcKUJhkjY2SMjJWxMlbGylgZK2NlrIyVsV/G/fPHdEzX9ExhSlOZ2jQmGed7Hvcc0zV9z+Pq+dXz631+vc+vnl89v3p+9fzq+dXzq+dXz6+eXz3//HC/SYaeXz2/ev7xcL9Jhp5fPb96fvX86vnV86vnnx/uNz1TmNJUJhkhQ8+vnl89v3p+9fzq+dXzzw/3m9rkXun51fOPh/tNMvT888P9Jhne51fPr/f59T6/ev754X6Te9Xulff5x8P9Jhkto2V4n1/v8+t9fr3Pr/f554f7TZ7HuFfjXnmff364/08rY2WsDO/z631+vc+v9/n1Pv/8cL/pex6fH+43HdM1fRmfH+43palMbRrTdx3P+/x5nz89//xwvylMaSqTjCPjyLgy9Pzp+dPzp+dPzz8/3G9q05jcKz1/frd/frjfJEPPn54/PX96/vT86fnnh/tNnoeePz1/ev78bv/8cL9Jhp4/PX96/vT86fnT888P95s8Dz1/ev70/Pnd/vnhfpMMPX96/vT86fnT86fnz/v8eZ8/PX96/vT8eZ8/7/On50/Pn54/PX96/vT86fkbGeN56PnT86fnz+/2NzL0/On50/On50/Pn54/PX8rYz0PPX96HnoefreH7/PQ89Dz0PPQ89Dz0PPQ8/A+D+/z0PPQ89Dz8D4P7/PQ89Dz0PPQ89Dz0PPQ87gybprK1KYxyfB9Hnoeeh56Hnoeeh56Hnr++eF+k+eh56Hnoefhd3v4Pg89Dz0PPQ89Dz0PPQ89//xwv8nz0PPQ89Dz8Ls9fJ+Hnoeeh56Hnoeeh56Hnoff7Z8f7je5V3oeeh5+t4ff7aHnoeeh56Hnoeeh56Hnnx/uN3keeh56Hnoevs/D93noeeh56Hnoeeh56Hno+eeH+02eh56Hnoeeh+/z9H2eep56nnqeep56nnqeep7O4T4/3P8nPU89Tz1Pv9vT7/bU89Tz1PPU89Tz1PPU83QO9/nhflOY0lQmGb7PU89Tz1PPU89Tz1PPU8/TOdznh/tN7pWep56n3+3p+zz1PPU89Tz1PPU89Tz1PJ3DfX643+Re6Xnqefrdnr7PU89Tz1PPU89Tz1PPU8/T93n6Pk89Tz1PPU+/29M5XOp56nnqeep56nnqeep5Oof7/HD/n/Q89Tz1PP1uT+dwqeep56nnqeep56nnqefpHO7zw/0m90rPU8/T7/Z0Dpd6Xnpeel56Xnpeel56Xs7hynl76Xnpeel5+d1eel7e5+V9XnpefreXc7jyfV56Xnpeel7e5395uP1v+s4Z/vJw/6YytWlM3zlDvT+mY7qmZ5LxZDwZT8aT8WSEjJARMkJGyAgZISNkhIyQkTJSRspIGSkjZaSMlOF3e/k+L9/npeel56Xn5X1e3uel56Xnpeel56Xnpeel56Xnpeel5+W8vZy3l56Xnpeel9/t5fu89Lz0vPS89Lz0vPS89Lyct5fz9tLz0vPS8/K7vXyfl56Xnpeet563nreet5638/Z23t563nreet5+t7fv89bzdt7e3uftfd563t7n7X3eet7O4do5XPu7Wnuft9/t7fu8fZ+3c7j2Pm/v8/Y+b+/z9j5v53DtvL2dt7e/q7X3efvd3r7P2/d5O4dr7/P2Pm/v8/Y+b+/zdg7XztvbeXv7u1p7n7ff7e37vH2ft3O49j5v7/P2Pm/v8/Y+bz1v5+3tvL39Xa29z1vP2/d5+z5v53Ct563nreet563n7Ryu/V2t9bz1vPW8/W5v3+et563nreet563nreet5+0crv1drfW89bz1vP1ub9/nreet563nreet56Pno+fjHG78XW30fPR89Hz8bh/f56Pno+ej56Pno+ej56Pn430+3uej56Pno+fjfT7e56Pno+ej56Pno+ej56Pn4xxunLePno+ej56P3+3j+3z0fPR89Hz0fPR89Hz0fJzDjfP20fPR89Hz8bt9fJ+Pno+ej56Pno+ej56Pno/3+Xifj56Pno+ej/f5eJ+Pno+ej56Pno+ej56Pno9zuHHePno+ej56Pn63j+/z0fPR89Hz0fPR89Hz0fNxDjfO20fPR89Hz8fv9vF9Pno+ej56Pno+ej56Pnq+zuHWefvq+er56vn63b6+z1fPV89Xz1fPV89Xz1fP1+/2dd6+er56vnq+frev3+2r56vnq+er56vnq+er5+scbp23r56vnq+er+/z9X2+er56vnq+er56vnq+er7O4dZ5++r56vnq+fo+X9/nq+er56vnq+er56vnq+frHG6dt6+er56vnq/f7et3++r56vnq+er56vnq+er5Oodb5+2r56vnq+frd/v6Pl89Xz1fPV89Xz1fPV89X+dw67x99Xz1fPV8/W5f3+er56vnq+er56vnq+er5+sc7vPD/f+E7Ov5+fP1/Hz7Un/Tv4zz+eF+U5rK1KYx7Td9PT94uPP54X7TM4UpTWWScWQcGVfGlfH1/ODhDh7u4OHO54f7TW0ak3v13Ksn48l4Mp6MJ+O5V891PNfxXEfICM8j3Ktwr8K9ChkhI2SEjJCR7lW6jnQd6TpSRnoe6V6le5XuVcoo11Guo1xHySgZJaNk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noff7dEyfJ+Hnoeeh56H9/lfHu7v+ctfHi7+m47pmp4pTGkqU5vG9J1lxMpYGStjZayMlbEyVsbK2C8j//wxHdM1PVOY0lSmNo1JxpFxZBwZR4bf7en7PH2fp56nnqeep/d5ep+nnqeep56nnqeep56nnqeep56nnn9+uN8kQ89Tz1PP0+/29H2eep56nnqeep56nnqeev754X5Tm8b09SP1PP1uT9/nqeep56nnqeep56nnqeefH+43HZN7peep5+l3e/o+Tz3//HC/SYb3eep5ep+n93nqeTqHS+dwHw/3m9wrv9vT93n6Pk/ncOl9nt7n6X2e3ufpfZ7O4T4/3P+nda/WvfI+T7/b0/d5+j5P53DpfZ7e5+l9Xt7n5X1ezuHKeXs5b68/aSpT+2/HJMM5XHmfl/d5eZ+X93l5n5eel/P2ct7+8XD/n7zPS8/L93n5Pi/ncKXnpeel56XnpeflHO7zw/0m90rPS8/L7/byfV56Xnpeel56Xnpeel56Xs7hPj/cb3Kv9Lz0vPxuL9/npeel56Xnpeel56XnpeflHO7zw/1/0vPS89Lz8ru9fJ+Xnpeel56Xnpeel56Xnpf3eXmfl56Xnpeel/d5eZ+Xnpeel56Xnpeel56XnpdzuHLeXnpeel56Xn63l+/z0vPS89Lz0vPS89Lz0vN2DtfO21vPW89bz9vv9vZ93nreet563nreet563nre3uftfd563nreet7e5+193nreet563nreet563nrezuHaeXvreet563n73d6+z1vPW89bz1vPW89bz1vP2zlcO29vPW89bz1vv9vb93nreet563nreet563nreTuHa+ftreet563n7Xd7+z5vPW89bz1vPW89bz1vPW+/29t5e+t563nrefvd3n63t563nreet563nreet563c7h23t563nreet6+z9v3eet563nreet563nreet5O4dr5+2j56Pno+fj+3x8n4+ej56Pno+ej56Pno+ej3O4cd4+ej56Pno+freP3+2j56Pno+ej56Pno+ej5+Mcbpy3j56Pno+ej9/t4/t89Hz0fPR89Hz0fPR89Hycw43z9tHz0fPR8/G7fXyfj56Pno+ej56Pno+ej56Pc7hx3j56Pno+ej5+t4/v89Hz0fPR89Hz0fPR89Hz8X0+vs9Hz0fPR8/H7/ZxDjd6Pno+ej56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+03ulZ6nnqff7en7PPU89Tz1PPU89Tz1PPU8ncN9frjf5F7peep5+t2evs9Tz1PPU89Tz1PPU89Tz9P3efo+Tz1PPU89T7/b0zlc6nnqeep56nnqeep56nk6h/v8cL/JvdLz1PP0u72cw5Wel56Xnpeel56Xnpeel3O4ct5eel56XnpefreXc7jS89Lz0vPS89Lz0vPS83IOV87bS89Lz0vPy+/20vPyPi/v89Lz8ru9nMOV7/PS89Lz0vPyPv/Lw/09f/nLw8V/0zFd0zOFKU1latOYvrOMShkpI2WkjJSRMlJGykgZKaNklIySUTJKRskoGSWjZJSMltEyWkbL8Lu9fJ+X7/PS89Lz0vPyPi/v89Lz0vPS89Lz0vPS89Lz0vPS89Lzct5ezttLz0vPS8/L7/byfV563nreet563nreet563s7b23l763nreet5+93evs9bz1vPW89bz1vPW89bz9t5eztvbz1vPW89b7/b2/d563k7b2/v8/Y+bz1v7/P2Pm89b+dw7Ryu/V2tvc/b7/b2fd6+z9s5XHuft/d5e5+393l7n7dzuHbe3s7b29/V2vu8/W5v3+ft+7ydw7X3eXuft/d5e5+393k7h2vn7e28vf1drb3P2+/29n3evs/bOVx7n7f3eXuft/d5e5+3nrfz9nbe3v6u1t7nreft+7x9n7dzuNbz1vPW89bz1vN2Dtf+rtZ63nreet5+t7fv89bz1vPW89Hz0fPR89HzcQ43/q42ej56Pno+freP7/PR89Hz0fPR89Hz0fPR83EON/6uNno+ej56Pn63j+/z0fPR89Hz0fPR89Hz0fPxPh/v89Hz0fPR8/E+H+/z0fPR89Hz0fPR89Hz0fNxDjfO20fPR89Hz8fv9vF9Pno+ej56Pno+ej56Pno+zuHGefvo+ej56Pn43T6+z0fPR89Hz0fPR89Hz0fPx/t8vM9Hz0fPR8/H+3y8z0fPR89Hz0fPR89Hz0fPxzncOG8fPR89Hz0fv9vH9/no+ej56Pno+ej56vnq+TqHW+ftq+er56vn63f7+j5fPV89Xz1fPV89Xz1fPV/ncOu8ffV89Xz1fP1uX9/nq+er56vnq+er56vnq+frd/s6b189Xz1fPV+/29fv9tXz1fPV89Xz1fPV89XzdQ63zttXz1fPV8/X9/n6Pl89Xz1fPV89Xz1fPV89X+dw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ep56nnqOhzt4uIOHO+kcLp23l56Xnpee4+FO+T4vPS89Lz0vPcfDHTzcwcOdcg5XzttLz0vPS8/xcKd8n5eel56Xnpee4+EOHu7g4U55n5f3eel56XnpOR7ulPd56Xnpeel56Tke7uDhDh7ulHO4ct5eel56XnqOhzvl+7z0vPS89Lz0HA938HAHD3fKOVw5by89Lz0vPcfDnfJ9Xnpeel56XnqOhzt4uIOHO+Ucrpy3l56Xnpee4+FO+T4vPS89Lz0vPcfDHTzcwcOd8ru9nLeXnpeel57j4U753V56Xnpeel56joc7eLiDhzvlHK6ct5eel563nuPhTvs+bz1vPW89bz3Hwx083MHDnXYO187bW89bz1vP8XCnfZ+3nreet563nuPhDh7u4OFOO4dr5+2t563nred4uNN+t7eet563nree4+EOHu7g4U47h2vn7a3nreet53i4077PW89bz1vPW8/xcAcPd/Bwp53DtfP21vPW89ZzPNxp3+et563nreet53i4g4c7eLjTzuHaeXvreet56zke7rTv89bz1vPW89ZzPNzBwx083Gnf5+37vPW89bz1HA932jlc63nreet56zke7uDhDh7utHO4dt7eet563nqOhzvjHG70fPR89Hz0HA938HAHD3fGOdw4bx89Hz0fPcfDnXEON3o+ej56PnqOhzt4uIOHO+Mcbpy3j56Pno+e4+EOHu7g4Q4e7oye4+HOOIcb3+d4uIOHO3i4g4c7f3m4v+cvf3m4+G86pmt6pjClqUxtGtN3ljEpI2WkjJSRMlJGykgZKSNllIySUTJKRskoGSWjZJSMktEyWkbLaBl+t4/v8/F9joc7eLiDhzt4uIOHO6Pno+d4uDN6Pno+ej56joc7eLiDhzvjvH2ct4+ej56PnuPhzvg+Hz1fPV89Xz3Hwx083MHDnXXevs7bV89Xz1fP8XBnfZ+vnq+er56vnuPhDh7u4OHOOm9f5+2r56vnq+d4uLO+z1fP13n7ep+v9zke7qz3+Xqf4+HOOofDwx083MHD/Y+oc0lyZFeW5JYq/Avf/8a6X95D1RlGZRJguTESVFF88HAfPNwHD/fBw33H9/nxfX58nx/f58f3+XEOd5y3H+ftx+9qx/f58d5+/H1+/H1+nMMd3+fH9/nxfX58nx/f58c53HHefpy3H7+rHd/nx3v78ff58ff5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85LyvOSHNf4tTfO9pHwvKd9LyveSn+zvb+nnNu7kuJO+l5R/45TnJeV5yU/697c0zfeS8r2kfC8p30t+6r+/pZ/bupPrTvpeUv6NU56XlOclPwXg39I030vK95LyvaR8Lym75GcC/L/luZPnTvpeUnZJeV5Snpf8AMi/pWl2SdklbZe0XdKevf68gH/Lctkux+X6LzyXptklbZe0XdJ2SdslbZe0Z68/S+Df8rlkJ9suaf/Gac9L2i5pu6TtkrZL2i5pu6Ttkvbs9ecM/Fu6k3ZJ2yXt3zjteUnbJW2XtF3SdknbJW2XtF3Svpe07yVtl7Rd0nZJ+17Svpe0XdJ2SdslbZe0XdJ2Sdsl7dlrt5+bXdJ2Sdsl7d847XlJ2yVtl7Rd0nZJ2yVtl7Rd0p699vq52SVtl7Rd0v6N056XtF3SdknbJW2XtF3SdknbJe17Sfte0nZJ2yVtl7TvJe17SdslbZe0XdJ2SdslbZe0XTKevY6/44xdMnbJ2CXj3zjjecnYJWOXjF0ydsnYJWOXjF0ynr2Ov+OMXTJ2ydgl498443nJ2CVjl4xdMnbJ2CVjl4xdMp69jr/jjF0ydsnYJePfOON5ydglY5eMXTJ2ydglY5eMXTL+jTP+jjN2ydglY5eMf+OMf+OMXTJ2ydglY5eMXTJ2ydgl49nr+DvO2CVjl4xdMp6XjOclY5eMXTJ2ydglY5eMXTJ2yXj2Ov6OM3bJ2CVjl4znJeN5ydglY5eMXTJ2ydglY5eMXTKevY6/44xdMnbJ2CXj3zjj3zhjl4xdMnbJ2CVjl4xdMnbJePY6/o6zdsnaJWuXrH/jrOcla5esXbJ2ydola5esXbJ2yXr2uv6Os3bJ2iVrl6x/46znJWuXrF2ydsnaJWuXrF2ydsl69rr+jrN2ydola5esf+Os5yVrl6xdsnbJ2iVrl6xdsnbJel6ynpesXbJ2ydol698469nr2iVrl6xdsnbJ2iVrl6xdsp69rr/jrF2ydsnaJevfOOvZ69ola5esXbJ2ydola5esXbKeva6/46xdsnbJ2iXr3zjr2evaJWuXrF2ydsnaJWuXrF2ynr2uv+OsXbJ2ydol6984a5es7yXre8naJevfOOvZ63pesnbJ2iVrl6zvJX+86P/Oz/6A0fpv+bkMl+myXLbLcbkun0tOnt5n2mfaZ9pn2mfaZ9pn2mfaZ9pnWpgWpoVpYVqYFqaFaWFamBampWlpWpqWpvk3zvO85Hle8uySZ5c8u+T5XvJ8L3l2ybNLnl3y7JJnlzy75Nklzy55dsmzS56/4zx/x3l2ybNLnl3y/BvneV7y7JJnlzy75Nklzy55dsmzS56/4zx/x3l2ybNLnl3y/BvneV7y7JJnlzy75Nklzy55dsmzS56/4zx/x3l2ybNLnl3y/BvneV7y7JLn7zjP95Lne8mzS57vJc/3kmeXPM9en2evz9+En+8lz79xzvOS87zkPHs930vO95LzveR8LznfS86z1/N3nPN3nPM34fO95Pwb5zwvOc9LzrPX873kfC8530vO95LzveQ8ez1/xzl/xzl/Ez7fS86/cc7zkvO85Dx7Pd9LzveS873kfC8530vOLjl/xzl/xzl/Ez7fS84uOc9LzvOS8+z17JKzS84uObvk7JLz7PX8TfjskrNLzi45/8Y5z0vOLjm75OySs0vOLjm75OyS8+z1/E347JKzS84uOf/GOc9Lzi45u+TskrNLzi45u+TskvPs9fxN+OySs0vOLjn/xjnPS84uObvk7JKzS84uObvk7JLzveR8Lzm75OySs0vO95LzveToku8fXfL9o0u+f3TJJ/f6yb1+cq/fP85ev3/8jvP9o0u+f3TJ948u+eRev3+faZ9pn2mfaXTJJ/f6yb1+cq/fvzCN33G+f3TJ948u+f7RJZ/c6/cvTAvTwrQwLd3J9NnSZ0ufLU3jveT7l+5kupPpTqZpZVqZVqaVaeVOls9WPlv5bGVa+bm1O9nuZLuTbVqb1qa1aW1au5Pts43PNj7bmDZ+buNOjjs57uSYNqaNaWvamrbu5Pps67Otz7amrZ/bupPrTj538pn2THumPdOeac+dfD7b89mez3amnZ/buZPnTp47eaadaWfamWaXfHaJ3Osn9/rJvX4fZ6/fx+8432eXfHbJZ5fIvX7fZ5pd8tkln13y2SVyr5/c6yf3+n2fafyO8312yWeXfHaJ3Ov3hWl2yWeXfHbJZ5fIvX5yr5/c6/elafyO8312yWeXfHaJ3Ov3pWl2yWeXfHbJZ5fIvX5yr5/c6/eVaeXnZpd8dslnl8i9fl+bZpd8dslnl3x2idzrJ/f6yb1+35g2fm52yWeXfHaJ3Ov3jWl2yWeXfHbJZ5fIvX5yr5/c6/etaevnZpd8dslnl8i9ft8zzS757JLPLvnsErnXT+71k3v9vmfa83OzSz675LNL5F6/70yzSz675LNLPrtE7vWTe/3kXr/g7PULfsf5wi4JuyTsErnXLzh7/cIuCbsk7JKwS+ReP7nXT+71i880fsf5wi4JuyTsErnXL8I0uyTskrBLwi6Re/3kXj+51y/SNH7H+cIuCbsk7BK510/u9ZN7/eRev7BL5F6/KNPKNLtE7vWTe/3kXr8/7vX+W/7Ogr4/7vW/Zf9z+bkMl+myXLbLcbkuTWvTxrQxbUwb08a0MW1MG9PGtDFtTVvT1rQ1bU1b09a0NW1NW9Oeac+05+f2/F/y/F9il8i9fnKvn9zrJ/f6hV0Sdonc6xd2SdglYZeEXSL3+sm9fnKvX/I7zpf8jvOlXZJ2Sdolcq9fcl7ypV2SdknaJWmXyL1+cq+f3OuXn2n8jvOlXZJ2Sdolcq9fhml2SdolaZekXSL3+sm9fnKvX4Zp/I7zpV2SdknaJXKvX6Zpdkmmab6XpO8lcq9f+l6SvpfIvX5Zfm7lTpY76XuJ3Osn9/rJvX5yr1/6XpK+l6TvJel7Sfpekm1a+7m1O9nupO8l6d84OaaNaWOa7yXpe0n6XpK+l6TvJbmmrZ/bupPrTvpekv6Nk2vamram+V6Svpek7yXpe0n6XpJ2ST4/t+dOPnfS9xK510/u9ZN7/eReP7nXL+2StEvSLpF7/fJM4zfhr+ySskvKLpF7/crzkrJLyi4pu6TsErnXT+71k3v96jON34S/skvKLim7RO71K89Lyi4pu6TskrJL5F4/uddP7vWrMI3fhL+yS8ouKbtE7vUrz0vKLim7pOySskvkXj+510/u9SvfS8r3krJLyi4pu0Tu9SvfS8ouKbuk7JKyS+ReP7nXT+71qzat/dzskrJLyi6Re/3K85KyS8ouKbuk7BK510/u9ZN7/WpMGz83u6TskrJL5F6/8ryk7JKyS8ouKbtE7vWTe/3kXr/yvaR8Lym7pOySskvkXr/yvaTskrJLyi4pu0Tu9ZN7/eRevzrTzs/NLim7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+51689e21+x/naLmm7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+51689e21+x/naLmm7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+516/9G6fTz80uabuk7RK516/9G6ftkrZL2i5pu0Tu9ZN7/eRev/bstdvPzS5pu6TtErnXrz0vabuk7ZK2S9oukXv95F4/udevPXvt8XOzS9ouabtE7vVrz0vaLmm7pO2StkvkXj+510/u9WvPXvv5udklbZe0XSL3+rV/47Rd0nZJ2yVtl8i9fnKvn9zr15699vm52SVtl7RdIvf6jeclY5eMXTJ2ydglcq+f3Osn9/qNZ6/j7zhjl4xdMnaJ3Os3npeMXTJ2ydglY5fIvX5yr5/c6zeevY6/44xdMnbJ2CVyr994XjJ2ydglY5eMXSL3+sm9fnKv33heMp6XjF0ydsnYJXKv33j2OnbJ2CVjl4xdIvf6yb1+cq/fePY6/o4zdsnYJWOXyL1+49nr2CVjl4xdMnaJ3Osn9/rJvX7j2ev4O87YJWOXjF0i9/qNZ69jl4xdMnbJ2CVyr5/c6yf3+o1nr+PvOGOXjF0ydonc6yf3+sm9fnKv39glcq/fePY6npfIvX5yr5/c6yf3+v1xr/ffkrOgP+71t3wuOQtaWLVvYdW+hVX7FlbtW1i1b2HVvoVV+xZW7VtYtW//mfaZ9pn2mfaZ9pn2mfaZ9pn2mfaZFqaFaWFamBamhWlhWpgWpoVp/o2znpes5yVyr5/c6yf3+sm9fnKv39ola5fIvX5rl6xdsnbJ2iVyr5/c6yf3+q2/46y/46xdsnbJ2iVyr996XrJ2ydola5esXSL3+sm9fnKv3/o7zvo7ztola5esXSL3+q3nJWuXrF2ydsnaJXKvn9zrJ/f6rb/jrL/jrF2ydsnaJXKv33pesnbJ+jvO+l6yvpfIvX7re8n6XiL3+q1nr3Kvn9zrJ/f6yb1+cq+f3Osn9/qt7yXP95Lne8nzveT5XvI8e33+jvP8Hef5m/DzveT5N87zvOR5XvI8e32+lzzfS57vJc/3kud7yfPs9fk7zvN3nOdvws/3kuffOM/zkud5yfPs9fle8nwveb6XPN9Lnu8lzy55/o4j9/rJvX5yr5/c6yf3+sm9fnKvn9zr9+ySZ5c8u0Tu9XuevT5/E352ybNLnl0i9/o9z0ueXfLskmeXPLtE7vWTe/3kXr/n2evzN+Fnlzy75Nklcq/f87zk2SXPLnl2ybNL5F4/uddP7vV7nr0+fxN+dsmzS55dIvf6Pc9Lnl3y7JJnlzy7RO71k3v95F6/53vJ873k2SXPLnl2idzr93wveXbJs0ueXfLsErnXT+71k3v9zrPX83ecs0vOLjm7RO71O89Lzi45u+TskrNL5F4/uddP7vU7z17P33HOLjm75OwSudfvPC85u+TskrNLzi6Re/3kXj+51+98LznfS84uObvk7BK51+98Lzm75OySs0vOLpF7/eReP7nX7zx7PX/HObvk7JKzS+Rev/O85OySs0vOLjm7RO71k3v95F6/8+z1/B3n7JKzS84ukXv9zvOSs0vOLjm75OwSuddP7vWTe/3Os9fzd5yzS84uObtE7vU7z0vOLjm75OySs0vkXj+510/u9Tv/xjl/xzm75OySs0vkXr/zb5yzS84uObvk7BK510/u9ZN7DX2voe819L3GP7ok/tElIfca+l5D32voew19r6HvNeReQ+415F5D32voew19r/GPLol/dEnIvYa+19D3GvpeQ99r6HsNudeQew2519D3GvpeQ99r/Et3Mt3JNC1NS9PStDQt3cn02cpnK5+tTCs/t3Iny50sd7JMK9PKtDatTWt3sn229tnaZ2vT2s+t3cl2J8edHNPGtDFtTBvTxp0cn218tvHZ1rT1c1t3ct3JdSfXtDVtTVvT1rTnTj6f7flsz2d7pj0/t+dOPnfyuZPPtDPtTDvTzrRzJ89nO5/tfLYzjd9x4rNLPrvks0vkXkPfa+h7DX2voe819L2G3GvIvYbca+h7DX2voe81Prvks0vkXkPfa+h7DX2voe819L2G3GvIvYbca+h7DX2voe81Prvks0vkXkPuNeReQ+419L2G3Gt8aVqaZpfIvYbca8i9xh/3ev8tf2dB8ce9/pbjcl0+l8cSVi0+WLX4YNXig1WLr01r09q0Nq1Na9PGtDFtTBvTxrQxbUwb08a0MW1NW9PWtDVtTVvT1rQ1bf3c1v8lz/8ldonca8i9htxryL3GZ5d8donca+h7DX2voe819L2G3GvIvYbca+h7DX2voe81Prsk7BK519D3GvpeQ99r6HsNfa8h9xpyryH3GvpeQ99r6HuNsEvCLpF7DX2voe819L2GvtfQ9xpyryH3GnKvoe819L2GvtcIuyTsErnX0Pca+l5D32voew19ryH3GuF7SfheIvca+l5D7jXkXkPuNeReQ+415F5D7jX0vYa+19D3GuF7Sfheou819L2GvteIdid9L9H3GvpeQ99r6HsNfa+h7zX0vUb4XhK+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r6nvNfW9ptxryr2m3Gvqe019r6nvNdMuSbtE7jX1vaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpeM+2StEvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe810y5Ju0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7JKyS+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXLLim7RO419b2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XrPskrJL5F5T32vqe019r6nvNfW9ptxryr2m3Gvqe019r6nvNcsuKbtE7jX1vaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpes+ySskvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe81yy4pu0TuNeVeU+415V5T32vKvWY90zwvkXtNudeUe0251/zjXu+/JWdBf9zrf8v75/JzGS7TZblsl+NyXZoGq5YNq5YNq5YNq5YNq5YNq5YNq5YNq5YNq5YNq5b9z7TPtM+0z7TPtM+0z7TPtM+0z7TPtDAtTPNvnPa8RN9ryr2m3GvKvabca8q9ZtslbZfIvaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpes+2StkvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe812y5pu0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7ZK2S+ReU99r6ntNfa+p7zX1vabca7bvJe17idxr6ntNudeUe02515R7TbnXlHtNudfU95r6XlPfa7bvJe17ib7X1Pea+l6z+U04x/cSfa+p7zX1vaa+19T3mvpeU99rju8l43uJvtfU95r6XnP4TTjH9xJ9r6nvNfW9pr7X1Pea+l5T32uO7yXje4m+19T3mnKvKfeacq8p95pyryn3mnKvKfea+l5T32uOXSL3mvpeU99r6nvNsUvGLpF7TX2vqe819b2mvtfU95pyryn3mnKvqe819b2mvtccu2TsErnX1Pea+l5T32vqe019ryn3mnKvKfea+l5T32vqe82xS8YukXtNfa+p7zX1vaa+19T3mnKvKfeacq+p7zX1vaa+1xy7RN9ryr3m+F6i7zXHLhm7ZOwSudeUe0251xzPXsffccYuGbtk7BK511zPS9YuWbtk7ZK1S+ReU+415V5zPXtdf8dZu2TtkrVL5F5zPS9Zu2TtkrVL1i6Re02515R7zfW9ZH0vWbtk7ZK1S+Rec30vWbtk7ZK1S9YukXtNudeUe8317HX9HUffa+p7TX2vKfea+l5T32vqe019r6nvNeVeU+415V5T32vqe019r7l2ydolcq+p7zX1vaa+19T3mvpeU+415V5T7jX1vaa+19T3mmuXrF0i95r6XlPfa+p7TX2vqe815V5T7jXlXlPfa+p7TX2vuXbJ2iVyr6nvNfW9pr7X1Pea+l5T7jXlXlPuNfW9pr7X1Peaa5esXSL3mvpeU99r6ntNfa+p7zXlXlPuNeVeU99r6ntNfa/57JJnl8i9pr7X1Pea+l5T32vqe02515R7TbnX1Pea+l5T32s+u+TZJXKvqe819b2mvtfU95r6XlPuNeVeU+419b2mvtfU95rPLnl2idxr6ntNfa+p7zX1vaa+15R7TbnXlHtNfa+p7zX1veazS55dIvea+l5T32vqe019r6nvNeVeU+415V5T32vqe019r/nskmeXyL2mvtfU95r6XlPfa+p7TbnXlHtNudfU95r6XlPfaz675Nklcq+p7zX1vaa+19T3mvpeU+415V5T7jX1vaa+19T3ms8ueXaJ3Gvqe019r6nvNfW9pr7XlHtNudeUe019r6nvNfW95tklZ5fIvaa+19T3mvpeU99r6ntNudeUe02519T3mvpeU99rnl1ydonca8q9ptxryr2mvteUe83z7FXfa8q9ptxryr2m3Gv+ca/335KzoD/u9bd8LjkLOlm1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVk3vN87xE32vKvabca8q9ptxryr3m2SVnl8i9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l7z7JKzS+ReU99r6ntNfa+p7zX1vabca8m9ltxr6Xstfa+l77X+0SX1jy4pudfS91r6Xkvfa+l7LX2vJfdacq8l91r6Xkvfa+l7rX90Sf2jS0rutfS9lr7X0vda+l5L32vJvda/8NnCZ0vTOHstudeSey2515J7LbnXknstudfS91r6Xkvfa/0rn618tjKt/NzKnSx3stzJMq1Na9PatDat3cn22dpna5+tTWs/t3Enx50cd3JMG9PGtDFtTBt3cny29dnWZ1vT1s9t3cl1J9edXNPWtDXtmfZMe+7k89mez/Z8tmfa83N77uRzJ8+dPNPOtDPtTDvTzp08n+18NrtE32vpe63PLvnsks8ukXstfa+l77X0vZa+19L3WnKvJfdacq+l77X0vZa+1/rsks8ukXstfa+l77X0vZa+19L3WnKvJfdacq+l77X0vZa+1/rsEn2vJfdaX5pml3x2yWeXfHaJ3GvJvZbca31lWvm52SWfXfLZJXKv9ZVpdslnl3x2yWeXyL2W3GvJvdbXprWfm13y2SWfXSL3Wt+YZpd8dslnl3x2idxryb2W3Gt9a9r6udkln13y2SVyr/WtaXbJZ5d8dslnl8i9ltxryb3W90x7fm52ib7X0vdacq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmGXhF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vFXZJ2CVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaYZeEXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa8VdknYJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91phl4RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19rxV2Sdglcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmGXhF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vFXZJ2iVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaaZekXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa+VdknaJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91ppl6RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19r5V2Sdolcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmmXpF0i91pyryX3WnKvpe+15F4r17Q1zS6Rey2515J7rT/u9f5b/s6C6o97/S3H5bp8Lo8lrFolrFolrFolrFrlmXamnWln2pkGq1YFq1YFq1YFq1YFq1YFq1YFq1YFq1YFq1YFq1b1z7TPtM+0z7TPtM+0z7TPtM80/8Ypz0v0vZbca8m9ltxryb2W3GuVXVJ2idxr6Xstfa+l77X0vZbca8m9ltxr6Xstfa+l77XKLim7RO619L2WvtfS91r6Xkvfa8m9ltxryb2WvtfS91r6XqvskrJL5F5L32vpey19r6XvtfS9ltxryb2W3Gvpey19r6XvtcouKbtE7rX0vZa+19L3WvpeS99ryb1W+V5SvpfIvZa+15J7LbnXknstudeSey2515J7LX2vpe+19L1W+V5Svpfoey19r6XvtercSd9L9L2WvtfS91r6Xkvfa+l7LX2v1b6XtO8l+l5L32vpe63mN+Fq30v0vZa+19L3WvpeS99r6Xstfa/Vvpe07yX6Xkvfa8m9ltxryb2W3GvJvZbca8m9ltxr6Xstfa/Vdonca+l7LX2vpe+12i5pu0TutfS9lr7X0vda+l5L32vJvZbca8m9lr7X0vda+l6r7ZK2S+ReS99r6Xstfa+l77X0vZbca8m9ltxr6Xstfa+l77XaLmm7RO619L2WvtfS91r6Xkvfa8m9ltxryb2WvtfS91r6XqvtEn2vJfda7XuJvtdqu6TtkrZL5F5L7rXkXqs9e+3zc7NL2i5pu0TutdrzkrZL2i5pu2TsErnXknstudcaz17H33HGLhm7ZOwSudcaz0vGLhm7ZOySsUvkXkvuteRea3wvGd9Lxi4Zu2TsErnXGt9Lxi4Zu2TskrFL5F5L7rXkXms8ex1/x9H3WvpeS99ryb2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa41dMnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91tglY5fIvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rjV0ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2CVjl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32utXbJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbaJWuXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa61dsnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91tola5fIvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rrV2ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2iVrl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32utXbJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdazS55dIvda+l5L32vpey19r6XvteReS+615F5L32vpey19r/XskmeXyL2W3GvJvZbca+l7LbnXep696nstudeSey2515J7rT/u9f5bchb0x73+luWyXY7LdflccvL0YNXqwarVK9PKtDKtTCvTyrQyrUxr09q0Nq1Na9PatDatTWvT2rQxbUwb08a0MW1M82+c53mJvteSey2515J7LbnXknutZ5c8u0TutfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdazy55donca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2SVnl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32udXXJ2idxr6Xstfa+l77X0vZa+15J7rfO95HwvkXstfa8l91pyryX3WnKvJfdacq8l91r6Xkvfa+l7rfO95Hwv0fda+l5L32udvwmf7yX6Xkvfa+l7LX2vpe+19L2Wvtc630vO9xJ9r6XvtfS91vmb8Pleou+19L2WvtfS91r6Xkvfa+l7rfO95Hwv0fda+l5L7rXkXkvuteReS+615F5L7rXkXkvfa+l7rbNL5F5L32vpey19r3V2ydklcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WkeX9D+6pOVeW99r63ttfa+t77X1vbbca8u9ttxr63ttfa+t77X/0SX9jy5pudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77X90Set7bbnX/pempWlpWpqW7mT6bOmzpc+WpqWfW7mT5U6WO1mmlWllWplWppU7WT5b+2zts7Vp7efW7mS7k+1OtmltWps2po1p406OzzY+2/hsY9r4uY07Oe7kupNr2pq2pq1pa9q6k+uzrc+2Ptsz7fm5PXfyuZPPnXymPdOeac+0Z9q5k+eznc92PtuZdn5u506eO3nuJH/jtL7X1vfa+l77s0s+u0TuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99phl4RdIvfa+l5b32vre219r63vteVeW+615V5b32vre219rx12Sdglcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32mGXhF0i99r6Xlvfa+t7bX2vre+15V5b7rXlXlvfa+t7bX2vHXZJ2CVyr63vtfW9tr7X1vfa+l5b7rXlXlvutfW9tr7X1vfaYZeEXSL32nKvLffacq+t77XlXjvWtDXNLpF7bbnXlnvtP+71/rd8v7Og/uNef8twmS7LZbscl+vyuTyWZ9qZdqadaWfamXamnWlnGqxaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xa5z/TPtM+0z7TPtP8Gyc5L2l9ry332nKvLffacq8t99ppl6RdIvfa+l5b32vre219ry332nKvLffa+l5b32vre+20S9IukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1067JO0SudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bRL0i6Re219r63vtfW9tr7X1vfacq+dvpek7yVyr63vteVeW+615V5b7rXlXlvuteVeW99r63ttfa+dvpek7yX6Xlvfa+t77Tx30vcSfa+t77X1vba+19b32vpeW99rl+8l5XuJvtfW99r6Xrv4TbjL9xJ9r63vtfW9tr7X1vfa+l5b32uX7yXle4m+19b32nKvLffacq8t99pyry332nKvLffa+l5b32uXXSL32vpeW99r63vtskvKLpF7bX2vre+19b22vtfW99pyry332nKvre+19b22vtcuu6TsErnX1vfa+l5b32vre219ry332nKvLffa+l5b32vre+2yS8oukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1y67RN9ry712+V6i77XLLim7pOwSudeWe225165n2vNzs0vKLim7RO61y/OSskvKLim7pOwSudeWe225127PXpvfcbrtkrZL2i6Re+32vKTtkrZL2i5pu0TuteVeW+612/eS9r2k7ZK2S9oukXvt9r2k7ZK2S9ouabtE7rXlXlvutduz1+Z3nNb32vpeW99ry722vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa7dd0naJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW9dtslbZfIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rt13Sdonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b122yVtl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32uPXTJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfbYJWOXyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa49dMnaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99tglY5fIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rj10ydonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b322CVjl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32uPXTJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfbYJWuXyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa69dsnaJ3GvLvbbca8u9tr7Xlnvt9exV32vLvbbca8u9ttxr/3Gv99+Ss6A/7vW/Zf5z+bkMl+myXLbLcbkuTUvTyrQyrUwr08q0Mq1MK9PKtDKtTWvT2rQ2rU1r09q0Nq1Na9PGtDHNv3HW8xJ9ry332nKvLffacq8t99prl6xdIvfa+l5b32vre219ry332nKvLffa+l5b32vre+21S9YukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1167ZO0SudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77WeXPLtE7rX1vba+19b32vpeW99ry732873k+V4i99r6XlvuteVeW+615V5b7rXlXlvutfW9tr7X1vfaz/eS53uJvtfW99r6Xvv5m/DzvUTfa+t7bX2vre+19b22vtfW99rP95Lne4m+19b32vpe+/mb8PO9RN9r63ttfa+t77X1vba+19b32s/3kud7ib7X1vfacq8t99pyry332nKvLffacq8t99r6Xlvfaz+7RO619b22vtfW99rPLnl2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfazS55dIvfa+l5b32vre219r63vteVeW+615V5b32vre219r312ydklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32meX6Httudc+30v0vfbZJWeXnF0i99pyry332ufZ6/k7ztklZ5ecXSL32ud5ydklZ5ecXXJ2idxry7223GufZ6/n7zhnl5xdcnaJ3Guf5yVnl5xdcnbJ2SVyry332nKvfb6XnO8lZ5ecXXJ2idxrn+8lZ5ecXXJ2ydklcq8t99pyr32evZ6/4+h7bX2vre+15V5b32vre219r63vtfW9ttxry7223Gvre219r63vtc8uObtE7rX1vba+19b32vpeR9/ryL2O3OvIvY6+19H3Ovpe5x9dMv/okpF7HX2vo+919L2OvtfR9zpyryP3OnKvo+919L2Ovtf5R5fMP7pk5F5H3+voex19r6PvdfS9jtzryL2O3Ovoex19r6Pvdf6lO5nuZJqWpqVpZVqZVu5k+Wzls5XPVqaVn1u5k+VOtjvZprVpbVqb1qa1O9k+W/ts7bONaePnNu7kuJPjTo5pY9qYNqaNaetOrs+2Ptv6bGva+rmtO7nu5LqTa9oz7Zn2THumPXfy+WzPZ3s+2zPt+bmdO3nu5LmTZ9qZdqadaWfauZN2idzryL2OvtfR9zqfXfLZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6cq8j9zpyr6PvdeRe5xvT1jS7RO515F5H7nX+uNf7b/k7C5o/7vW3fC6PJazafLBq88GqzQerNh+s2nywavM9055pz7Rn2pl2pp1pZ9qZdqadaWfamQarNgGrNgGrNgGrNgGrNgGrNgGrNgGrNgGrNgGrNvHPNP7GmeC8ZPS9jtzryL2O3OvIvY7c64RdEnaJ3Ovoex19r6PvdfS9jtzryL2O3Ovoex19r6PvdcIuCbtE7nX0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o+919L2OvtfR9zpyryP3OnKvo+919L2Ovtc5u+TsErnX0fc6+l5H3+voex19ryP3OnKvI/c6+l5H3+voe52zS84ukXsdfa+j73X0vY6+19H3OnKvI/c6cq+j73X0vY6+1zm75OwSudfR9zr6Xkff6+h7HX2vI/c6cq8j9zr6Xkff6+p73X90yf6jS1budfW9rr7X1fe6+l5X3+vKva7c68q9rr7X1fe6+l73H12y/+iSlXtdfa+r73X1va6+19X3unKvK/e6cq+r73X1va6+1/0X7mS6k2lampampWlpWrqT6bOlz5Y+W5lWfm7lTpY7We5kmVamlWllWpnW7mT7bO2ztc/WprWfW7uT7U62O9mmjc82Ptv4bGPamDamjWnjs43PNqatz/Z/XXL/LX9nQfvHvf6W5bJdjst1+VweS1i1/Qertv+eac+0Z9oz7Zn2THumPdPOtDPtTDvTzrQz7Uw70840WLX9YNX2g1XbD1ZtP1i1/WDV9oNV+/9LPreP85LV97pyryv3unKvK/e6cq/72SWfXSL3uvpeV9/r6ntdfa8r97pyryv3uvpeV9/r6nvdzy757BK519X3uvpeV9/r6ntdfa8r97pyryv3uvpeV9/r6nvdzy757BK519X3uvpeV9/r6ntdfa8r97pyryv3uvpeV9/r6nvdzy757BK519X3uvpeV9/r6ntdfa8r97rf+Gzjs9kl+l5X7nXlXlfudeVeV+515V5X7nX1va6+19X3ut/6bOuzPdOen9tzJ587+dzJZ9oz7Zn2THumnTt5Ptv5bOeznWnn53bu5LmT507yN87qe119r6vvdfW9rr7X1fe64XtJ+F6i73X1va7c68q9rtzryr2u3OvKva7c68q9rr7X1fe6YZfIva6+19X3uvpeN+ySsEvkXlff6+p7XX2vq+919b2u3OvKva7c6+p7XX2vq+91wy4Ju0TudfW9rr7X/X9F3NGqd0mSWPd30bUvTkZEZkT4XYyQZNkMDBoxlgzGzLurzzdV+3cXTTcV7P2vXuTJvVh6r6332nqvzXtt3mvzXlvvtfVeW++1A0sCS3ivrffaeq+t99p6r6332rzX5r0277X1XlvvtfVeO7BE77V5rx3OJXqvHVgSWBJYwntt3mvzXjvatva7YUlgSWAJ77VjbMOSwJLAksAS3mvzXpv32rG2rd8NSwJLAkt4rx1rG5YkliSWJJbwXpv32rzXTueSdC5JLEksSSzhvXY6lySWJJYkliSW8F6b99q8186w7fuO03qvrffaeq/Ne22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qJJYklvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq+dWJJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffaiSWJJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvnViSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332okliSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r11YUljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qFJYUlvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq9dWFJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffahSWFJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvXVhSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332oUlhSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r11YUljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99oXSy6W8F6b99q81+a9tt5r8177unvVe23ea/Nem/favNf+473++/3ZH++1/hqPMYxpLOM1PmMbx/jdPN20LW1L29K2tC1tS9vStrQtbSvbyrayrWwr28q2sq1sK9vKtmvbte3adm3zN851X6L32rzX5r0277V5r8177YslF0t4r6332nqvrffaeq/Ne23ea/NeW++19V5b77Uvllws4b223mvrvbbea+u9tt5r816b99q819Z7bb3X1nvtiyUXS3ivrffaeq+t99p6r6332rzX5r0277X1XlvvtfVe+2HJwxLea+u9tt5r67223mvrvTbvtZ9zyXMu4b223mvzXpv32rzX5r0277V5r817bb3X1nttvdd+ziXPuUTvtfVeW++1X3qTziV6r6332nqvrffaeq+t99p6r/2cS55zid5r67223mu/8iadS/ReW++19V5b77X1XlvvtfVe+zmXPOcSvdfWe23ea/Nem/favNfmvTbvtXmvzXttvdfWe+2HJbzX1nttvdfWe+2HJQ9LeK+t99p6r6332nqvrffavNfmvTbvtfVeW++19V77YcnDEt5r67223mvrvbbea+u9Nu+1ea/Ne22919Z7bb3XbixpLOG9tt5r67223mvrvbbea/Nem/favNfWe22919Z77cYSvdfmvXY7l+i9dmNJY0ljCe+1ea/Ne+1299q+4zSWNJY0lvBeu92XNJY0ljSWNJbwXpv32rzXbnev7TtOY0ljSWMJ77XbfUljSWNJY0ljCe+1ea/Ne+12LmnnksaSxpLGEt5rt3NJY0ljSWNJYwnvtXmvzXvtdvfavuPovbbea+u9Nu+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rN5Y0lvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u9dmPJYAnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeaw+WDJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZgyWAJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msPlgyW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6732YMlgCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rD5YMlvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u99mDJYAnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeaw+WDJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZiyWIJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msvliyW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6732YsliCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rL5YslvBem/favNfmvbbea/Nee9296r0277V5r817bd5r//Fe96/xuwv6473+NfaP8RjDmMYyXuMzttE2rtpy1Zartly15aotV225astVW67actWWq7ZcteWqLVdtuWrLVVuu2nLVlqu2XLX9XLX5+Vy1+flcteG9zs93XzJ6r8N7Hd7r8F6H9zq81/n5WDI/H0uG9zp6r6P3Onqvo/c6vNfhvQ7vdfReR+919F7nJzxbeLawLWwL28K2sO1jyfBeh/c6vNfRex2919F7nZ+PJfPzsWR4r6P3Onqvo/c6eq+j9zq81+G9Du919F5H73X0XufnepPXm7y2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q/e6F0sulvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q97sWSiyW819V7Xb3X1XtdvdfVe13e6/Jel/e6eq+r97p6r/uw5GEJ73X1XlfvdfVeV+919V6X97q81+W9rt7r6r2u3us+LHlYwntdvdfVe12919V7Xb3X5b0u73V5r6v3unqvq/e6D0selvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q97sOShyW819V7Xb3X1XtdvdfVe13e6/Jel/e6eq+r97p6r/uw5GEJ73X1XlfvdfVeV+919V6X97q81+W9rt7r6r2u3us+LHlYwntdvdfVe12919V7Xb3X5b0u73V5r6v3unqvq/e6D0selvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q9bmNJYwnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6zaWNJbwXlfvdfVeV+919V5X73V5r8t7Xd7r6r2u3uvqvW5jSWMJ73X1XlfvdfVeV+919V6X97q81+W9rt7r6r2u3us2ljSW8F6X97q81+W9rt7r8l633b3qvS7vdXmvy3td3uv+8V7//f7sj/daf43HGMY0lvEan7GNY/xunrpta9vatratbWvb2ra2rW1r28a2sW1sG9vGtrFtbBvbxraxbW1b29a2tc3fOO2+RO91ea/Le13e6/Jel/e6gyWDJbzX1XtdvdfVe1291+W9Lu91ea+r97p6r6v3uoMlgyW819V7Xb3X1XtdvdfVe13e6/Jel/e6eq+r97p6rztYMljCe12919V7Xb3X1XtdvdflvS7vdXmvq/e6eq+r97qDJYMlvNfVe12919V7Xb3X1Xtd3uuOc8k4l/BeV+91ea/Le13e6/Jel/e6vNflva7e6+q9rt7rjnPJOJfova7e6+q97vgmPM4leq+r97p6r6v3unqvq/e6eq87ziXjXKL3unqvq/e645vwOJfova7e6+q9rt7r6r2u3uvqve44l4xzid7r6r0u73V5r8t7Xd7r8l6X97q81+W9rt7r6r3uYgnvdfVeV+919V53sWSxhPe6eq+r97p6r6v3unqvy3td3uvyXlfvdfVeV+91F0sWS3ivq/e6eq+r97p6r6v3urzX5b0u73X1XlfvdfVed7FksYT3unqvq/e6eq+r97p6r8t7Xd7r8l5X73X1XlfvdRdL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e43GksYS3mvovYbea+i9ht5r6L0G7zV4r8F7Db3X0HsNvddoLGks4b2G3mvovYbea+i9ht5r8F6D9xq819B7Db3X0HuNxpLGEt5r6L2G3mvovYbea+i9Bu81eK/Bew2919B7Db3XaCxpLOG9ht5r6L2G3mvovYbea/Beg/cavNfQew2919B7jcaSxhLea+i9ht5r6L2G3mvovQbvNXivwXsNvdfQew2912gsaSzhvYbea+i9ht5r6L2G3mvwXoP3GrzX0HsNvdfQe43GksYS3mvovYbea+i9ht5r6L0G7zV4r8F7Db3X0HsNvdcYLBks4b2G3mvovYbea+i9ht5r8F6D9xq819B7Db3X0HuNwZLBEt5r6L2G3mvovYbea+i9Bu81eK/Bew2919B7Db3XGCwZLOG9ht5r6L2G3mvovYbea/Beg/cavNfQew2919B7jcGSwRLea+i9ht5r6L2G3mvovQbvNXivwXsNvdfQew291xgsGSzhvYbea+i9ht5r6L2G3mvwXoP3GrzX0HsNvdfQe43BksES3mvwXoP3GrzX0HsN3muMu1e91+C9Bu81eK/Be40/3uv+NX53QX+817/HMX53QctVW67actWWq7ZcteWqLVdtuWrLVVuu2nLVlqu2XLXlqi1Xbblqy1Vbrtpy1Zartly15aotV225astVW67actWWq7ZcteWq8V5j3ZfovQbvNXivwXsN3mvwXmOxZLGE9xp6r6H3GnqvofcavNfgvQbvNfReQ+819F5jsWSxhPcaeq+h9xp6r6H3GnqvwXsN3mvwXkPvNfReQ+81FksWS3ivofcaeq+h9xp6r6H3GrzX4L0G7zX0XkPvNfReY7FksYT3Gnqvofcaeq+h9xp6r8F7jXUuWecS3mvovQbvNXivwXsN3mvwXoP3GrzX0HtNvdfUe82f71ySP9+5JPVeU+819V7z5/smnD/fuST1XlPvNfVeU+819V5T7zX1XvPnO5fkz3cuSb3X1HtNvdf8+b4J5893Lkm919R7Tb3X1HtNvdfUe0291/xJz5aeLW37vuMk7zV5r8l7Td5r8l6T95q81+S9pt5r6r3mT3m28mxlW/ndypssb/J6k9e2a9u17dp2bbve5PVs17Ndz/Zse363500+b/J5k8+2Z9uz7dn2bGtvsj1be7b2bG1b+93am2xvsr3Jtm1sG9vGtrFtvMnxbOPZxrONbeN3W29yvcn1Jte2tW1tW9vWtvUmsYT3mrzXPN/da57vO04eLDlYcrCE95rnuy/JgyUHSw6WHCzhvSbvNXmveY5t33ecPFhysORgCe81T9iGJQdLDpYcLOG9Ju81ea950rbvXJIHSw6WHCzhveZJ27DkYMnBkoMlvNfkvSbvNU/ZVn43LNF7Tb3X5L2m3mvqvabea+q9pt5r8l6T95q819R7Tb3X1HvNgyUHS3ivqfeaeq+p95p6r6n3mrzX5L0m7zX1XlPvNfVe82DJwRLea+q9pt5r6r2m3mvqvSbvNXmvyXtNvdfUe0291zxYcrCE95p6r6n3mnqvqfeaeq/Je03ea/JeU+819V5T7zUDSwJLeK+p95p6r6n3mnqvqfeavNfkvSbvNfVeU+819V4zsCSwhPeaeq+p95p6r6n3mnqvyXtN3mvyXlPvNfVeU+81A0sCS3ivqfeaeq+p95p6r6n3mrzX5L0m7zX1XlPvNfVeM7AksIT3mnqvqfeaeq+p95p6r8l7Td5r8l5T7zX1XlPvNQNLAkt4r6n3mnqvqfeaeq+p95q81+S9Ju819V5T7zX1XjOwJLCE95p6r6n3mnqvqfeaeq/Je03ea/JeU+819V5T7zUDSwJLeK+p95p6r6n3mnqvqfeavNfkvSbvNfVeU+819V4zsSSxhPeaeq+p95p6r6n3mnqvyXtN3mvyXlPvNfVeU+81E0sSS3ivqfeaeq+p95p6r6n3mrzX5L0m7zX1XlPvNfVeM7EksYT3mrzX5L0m7zX1XpP3mpm2pW1YwntN3mvyXvOP97p/jX/fBeUf7/Xv8RnbOMb9xs9Vy/xctczPVcv8XLXMa9u17dp2bbu2Xduebc+2Z9uz7dn2bHu2Pduebc+2tq1ta9vatratbWvb2jZ/42T7t2T8W4IlvNfkvSbvNXmvmViSWMJ7Tb3X1HtNvdfUe03ea/Jek/eaeq+p95p6r5lYUljCe02919R7Tb3X1HtNvdfkvSbvNXmvqfeaeq+p95qFJYUlvNfUe02919R7Tb3X1HtN3mvyXpP3mnqvqfeaeq9ZWFJYwntNvdfUe02919R7Tb3X5L1mOZeUcwnvNfVek/eavNfkvSbvNXmvyXtN3mvqvabea+q9ZjmXlHOJ3mvqvabea9b1Jp1L9F5T7zX1XlPvNfVeU+819V6znEvKuUTvNfVeU+8163mTziV6r6n3mnqvqfeaeq+p95p6r1nOJeVcoveaeq/Je03ea/Jek/eavNfkvSbvNXmvqfeaeq9ZWMJ7Tb3X1HtNvdcsLCks4b2m3mvqvabea+q9pt5r8l6T95q819R7Tb3X1HvNiyUXS3ivqfeaeq+p95p6r6n3mrzX5L0m7zX1XlPvNfVe82LJxRLea+q9pt5r6r2m3mvqvSbvNXmvyXtNvdfUe02917xYoveavNe8ziV6r3mx5GLJxRLea/Jek/ea193rvX43LLlYcrGE95rXfcnFkoslF0sulvBek/eavNe87l7v87thycWSiyW817zuSy6WXCy5WHKxhPeavNfkveZ1LrnOJRdLLpZcLOG95nUuuVhyseRiycUS3mvyXpP3mtfd612/G5bovabea/JeU+819V5T7zX1XlPvNXmvyXtN3mvqvabea+q95sOShyW819R7Tb3X1HtNvdfUe03ea/Jek/eaeq+p95p6r/mw5GEJ7zX1XlPvNfVeU+819V6T95q81+S9pt5r6r2m3ms+LHlYwntNvdfUe02919R7Tb3X5L0m7zV5r6n3mnqvqfeaD0selvBeU+819V5T7zX1XlPvNXmvyXtN3mvqvabea+q95sOShyW819R7Tb3X1HtNvdfUe03ea/Jek/eaeq+p95p6r/mw5GEJ7zX1XlPvNfVeU+819V6T95q81+S9pt5r6r2m3ms+LHlYwntNvdfUe02919R7Tb3X5L0m7zV5r6n3mnqvqfeajSWNJbzX1HtNvdfUe02919R7Td5r8l6T95p6r6n3mnqv2VjSWMJ7Tb3X1HtNvdfUe0291+S9Ju81ea+p95p6r6n3mo0ljSW819R7Tb3X1HtNvdfUe03ea/Jek/eaeq+p95p6r9lY0ljCe02919R7Tb3X1HtNvdfkvSbvNXmvqfeaeq+p95qNJY0lvNfUe02919R7Tb3X1HtN3mvyXpP3mnqvqfeaeq/ZWNJYwntN3mvyXpP3mnqvyXvNdveq95q81+S9Ju81ea/5x3vdv8bvLuiP9/r3WMZrfMY2jvG7eZrPVcv5XLWcz1XL+Vy1nM9Vy/lctZzPVcv5XLWcz1XL+bHt2HZsO7Yd245tx7Zj27Ht2HZsC9vCtrAtbAvbwjZ/44z7Er3X5L0m7zV5r8l7Td5rDpYMlvBeU+819V5T7zX1XpP3mrzX5L2m3mvqvabeaw6WDJbwXlPvNfVeU+819V5T7zV5r8l7Td5r6r2m3mvqveZgyWAJ7zX1XlPvNfVeU+819V6T95q81+S9pt5r6r2m3msOlgyW8F5T7zX1XlPvNfVeU+81ea85ziXjXMJ7Tb3X5L0m7zV5r8l7Td5r8l6T95p6r6n3mnqvOc4l41yi95p6r6n3muub8DqX6L2m3mvqvabea+q9pt5r6r3mOpesc4nea+q9pt5rrm/C61yi95p6r6n3mnqvqfeaeq+p95rrXLLOJXqvqfeavNfkvSbvNXmvyXtN3mvyXpP3mnqvqfeaiyW819R7Tb3X1HvNxZLFEt5r6r2m3mvqvabea+q9Ju81ea/Je02919R7Tb3XXCxZLOG9pt5r6r2m3mvqvabea/Jek/eavNfUe02919R7zcWSxRLea+q9pt5r6r2m3mvqvSbvNXmvyXtNvdfUe02911ws0XtN3muuc4neay6WLJYslvBek/eavNdcd6/7fcepn48l9fOxpH4+lhTvtX6++5L6+VhSPx9L6udjSf18LCnea/Fei/daP8e27ztO/XwsqZ+PJfXzsaR4r/VzbDu2hW1h28eS4r0W77V4r/UTtn3nkvr5WFI/4U2mN5m2pW1pW9qWtqU3mZ4tPVt6trKt/G7lTZY3Wd5k2Va2lW1lW9l2vcnr2a5nu57t2nb9btebvN7k9Savbc+2Z9uz7dn2vMnn2Z5ne57t2fb8bu1NtjfZ3mTb1ra1bW1b29beZHu28Wzj2ca28buNNzne5HiTY9vYNratbWvbepPr2dazrWdb29bvtt4klhws4b2W3mvpvZbea+m9lt5r8V6L91q819J7Lb3XOlhysORgCe+19F5L77X0XkvvtfRei/davNfivZbea+m9lt5rHSw5WMJ7Lb3X0nstvdfSey291+K9Fu+1eK+l91p6r6X3WgdLDpbwXkvvtfReS++19F5L77V4r8V7Ld5r6b2W3mvpvdbBkoMlvNfSey2919J7Lb3X0nst3mvxXov3Wnqvpfdaeq91sORgCe+19F5L77X0XkvvtfRei/davNfivZbea+m9lt5rHSw5WMJ7Lb3X0nstvdfSey291+K9Fu+1eK+l91p6r6X3WgdLDpbwXkvvtfReS++19F5L77V4r8V7Ld5r6b2W3mvpvVZgSWAJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3msFlgSW8F6L91q81+K9lt5r8V4r0ra0DUt4r8V7Ld5r/fFe99/H+vsuqP54r3+PYUxjGa/xGds4xv3Ga9u17dp2bbu2Xduubde2a9u17dn2bHu2Pduebc+2Z9uz7dn2bGvb2ra2rW1rv1v7t6T9W4IlvNfivRbvtXivFVgSWMJ7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6rxVYEljCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91qJJYklvNfSey2919J7Lb3X0nst3mvxXov3Wnqvpfdaeq+VWJJYwnstvdfSey2919J7Lb3X4r1WOpekcwnvtfRei/davNfivRbvtXivxXst3mvpvZbea+m9VjqXpHOJ3mvpvZbea+X1Jp1L9F5L77X0XkvvtfReS++19F4rnUvSuUTvtfReS++18nmTziV6r6X3Wnqvpfdaeq+l91p6r5XOJelcovdaeq/Fey3ea/Fei/davNfivRbvtXivpfdaeq+VWMJ7Lb3X0nstvddKLEks4b2W3mvpvZbea+m9lt5r8V6L91q819J7Lb3X0nutwpLCEt5r6b2W3mvpvZbea+m9Fu+1eK/Fey2919J7Lb3XKiwpLOG9lt5r6b2W3mvpvZbea/Fei/davNfSey2919J7rcISvdfivVY5l+i9VmFJYUlhCe+1eK/Fe60q28rvhiWFJYUlvNcq9yWFJYUlhSWFJbzX4r0W77Xq2fb8blhSWFJYwnutcl9SWFJYUlhSWMJ7Ld5r8V6rnEvKuaSwpLCksIT3WuVcUlhSWFJYUljCey3ea/Feq8a28bthid5r6b0W77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3mtdLLlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaF0sulvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sWSiyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r3Wx5GIJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3mtdLLlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaF0sulvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sWSiyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r/Ww5GEJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3ms9LHlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaD0selvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sOShyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r/Ww5GEJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3ms9LHlYwnst3mvxXov3WnqvxXut5+5V77V4r8V7Ld5r8V7rj/e6f43/2Hbi3/63//D//qd//af/9J//+b/+P//hf/////Ef/6//+d/+y//4p3/5b3/9x//x//33v/+b//yv//TP//xP//d//O//+i//5b/+n//zX//rf/znf/kvf/67f/s//u1/AQ==", + "debug_symbols": "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PMfDnXQPh4c7eLiDhzt4uIOHO3i4g4c75Twv53k5z8t5Xs7zcg9X7tvLfXt9f1c75Twvv9vL93n5Pi/3cOU8L+d5Oc/LeV7O83IPV+7by317XXvlPC+/28v3efk+L/dw5Twv53k5z8t5Xs7z0vNy346HO3i4g4c7eLiDhzt4uIOHO3i4U3peel56joc75R7u88P9ruyVnpee4+FO+T4vPS89Lz0vPcfDHTzcwcOdcg/3+eH+v9Lz0vPSczzcKd/npeel56Xnped4uIOHO3i4U+7hPj/c78pe6XnpOR7ulO/z0vPS89Lz0nM83MHDHTzcKed5Oc9Lz0vPW8/xcKed563nreet563neLiDhzt4uNPu4dp9e+t563nrOR7utO/z1vPW89bz1nM83MHDHTzcafdw7b699bz1vPUcD3fa93nreet563nrOR7u4OEOHu6087yd563nreet53i4087z1vPW89bz1nM83MHDHTzcafdw7b699bz1vPUcD3fa93nreet563nrOR7u4OEOHu60e7h239563nreeo6HO+37vPW89bz1vPUcD3fwcAcPd9o9XLtvbz1vPW89x8Od9n3eet563nreeo6HO3i4g4c77Xd7u29vPW89bz3Hw53xu330fPR89Hz0HA938HAHD3fGPdy4bx89Hz0fPcfDnfF9Pno+ej56PnqOhzt4uIOHO+Mebty3j56Pno+e4+HO+D4fPR89Hz0fPcfDHTzcwcOdcQ837ttHz0fPR8/xcGf8bh89Hz0fPR89x8MdPNzBw51xDzfu20fPR89Hz/FwZ3yfj56Pno+ej57j4Q4e7uDhzriHG/fto+ej56PneLgzvs9Hz0fPR89Hz/FwBw938HBn3MON+/bR89Hz0XM83Bnf56Pno+ej56PneLiDhzt4uDO+z8f3+ej56PnoOR7ujHu40fPV89Xz1XM83MHDHTzcWfdw67599Xz1fPUcD3fWPdzq+er56vnqOR7u4OEOHu6se7h13756vnq+eo6HO+sebvV89Xz1fPUcD3fwcAcPd9Y93LpvXz1fPV89x8MdPNzBwx083Fk9x8OddQ+3vs/xcAcPd/BwBw93/ni4/W/13TP88XD/VmGVVmXVVmP13WUsTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZ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54f7XcnQ89Tz1PP0u/3zw/2uZOh56nnqeep56nnq+eeH+12NlX7oeep5+t3++eF+VzL0PPU89Tz1PPU89fzzw/2ujlVYpVVZtX97rcbqWclwnpeel/O8nOel558f7nd1rcbqWcnwfV6+zz8e7nclw3lezvNynpfz/PPD/a6+9/H54X5X9sp5Xn63l+/z8n3++eF+VzKc5+U8L+d5Oc8/P9zvyvsoe1X2ynlefreX7/Pyff754X5XMpzn5Twv53k5z0vPPz/c78petb1ynpeel+/z8n3+8XC/Kxl6Xnpeel56/vnhflfeh56Xnpeel9/t5fu89Lz0vPS89Lz0vPS89Pzzw/2uvA89Lz0vPS+/28v3eel56Xnpeel56Xnpeen554f7XX3vo/W89bz1vP1ub9/nreet563nreet563nreftPG/neet563nreTvP23neet563nreet563nreet7u4TrG6lnZKz1vv9vb93nreet563nreet563nrebuH6/I+9Lz1vPW8/W5v3+et563nreet563nreet5+08b+d563nreet5O8/bed563nreet563nreet563u7h+nofet563nrefre37/PW89bz1vPW89bz1vPW83YP9/nhflf2Ss9bz9vv9vZ93nreet563nreet563nre7uE+P9zvyl7p+dXz63f79X1+9fzq+dXzq+dXz6+eXz2/frdf9+1Xz6+eXz2/frdfv9uvnl89v3p+9fzq+dXzq+fXPdx13371/Or51fPr+/z6Pr96fvX86vnV86vnV8+vnl/3cNd9+9Xzq+dXz6/v8+v7/Or51fOr51fPr55fPb96ft3DXfftV8+vnl89v363X7/br55fPb96fvX86vnV86vn1z3cdd9+9fzq+dXz63f79X1+9fzq+dXzq+dXz6+eXz2/7uGu+/ar51fPr55fv9uv7/Or51fPr55fPb96fvX86vl1D3fdt189v3p+9fz63T6+z0fPR89Hz0fPR89Hz0fPx/f5+D4fPR89Hz0fv9vHPdzo+ej56Pno+ej56Pno+biHG/fto+ej56Pn43f7uIcbPR89Hz0fPR89Hz0fPR/3cOO+ffR89Hz0fPxuH/dwo+ej56Pno+ej56Pno+fjHm7ct4+ej56Pno/f7aPn4zwf5/no+fjdPu7hxvf56Pno+ej5OM//eLj9b/XdM/zx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56XnpeflfV7e56Xnpeel56Xnpeel56Xnpeel56Xn5by9nLeXnpeel56X3+3l+7z0vPS89Lz0vPS89Lz0vJy3l/P20vPS89Lz8ru9fJ+Xnpeel563nreet563nrfz9nbe3nreet563n63t+/z1vN23t7e5+193nre3uftfd563s7h2jlc+7tae5+33+3t+7x9n7dzuPY+b+/z9j5v7/P2Pm/ncO28vZ23t7+rtfd5+93evs/b93k7h2vv8/Y+b+/z9j5v7/N2DtfO29t5e/u7Wnuft9/t7fu8fZ+3c7j2Pm/v8/Y+b+/z9j5vPW/n7e28vf1drb3PW8/b93n7Pm/ncK3nreet563nreftHK79Xa31vPW89bz9bm/f563nreet563nreet563n7Ryu/V2t9bz1vPW8/W5v3+et563nreet563no+ej5+McbvxdbfR89Hz0fPxuH9/no+ej56Pno+ej56Pno+fjfT7e56Pno+ej5+N9Pt7no+ej56Pno+ej56Pno+fjHG6ct4+ej56Pno/f7eP7fPR89Hz0fPR89Hz0fPR8nMON8/bR89Hz0fPxu318n4+ej56Pno+ej56Pno+ej/f5eJ+Pno+ej56P9/l4n4+ej56Pno+ej56Pno+ej3O4cd4+ej56Pno+freP7/PR89Hz0fPR89Hz0fPR83EON87bR89Hz0fPx+/28X0+ej56Pno+ej56Pno+er7O4dZ5++r56vnq+frdvr7PV89Xz1fPV89Xz1fPV8/X7/Z13r56vnq+er5+t6/f7avnq+er56vnq+er56vn6xxunbevnq+er56v7/P1fb56vnq+er56vnq+er56vs7h1nn76vnq+er5+j5f3+er56vnq+er56vnq+er5+scbp23r56vnq+er9/t63f76vnq+er56vnq+er56vk6h1vn7avnq+er5+t3+/o+Xz1fPV89Xz1fPV89Xz1f53DrvH31fPV89Xz9bl/f56vnq+er56vnq+er56vn6xzu88P9/4Ts6/n58/X8fPtSf9O/jPP54X5TmsrUpjHtN309P3i48/nhftMzhSlNZZJxZBwZV8aV8fX84OEOHu7g4c7nh/tNbRqTe/XcqyfjyXgynown47lXz3U81/FcR8gIzyPcq3Cvwr0KGSEjZISMkJHuVbqOdB3pOlJGeh7pXqV7le5VyijXUa6jXEfJ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93l4n4eeh9/t0TJ8n4eeh56Hnof3+V8e7u/5y18eLv6bjumanilMaSpTm8b0nWXEylgZK2NlrIyVsTJWxsrYLyP//DEd0zU9U5jSVKY2jUnGkXFkHBlHht/t6fs8fZ+nnqeep56n93l6n6eep56nnqeep56nnqeep56nnqeef3643yRDz1PPU8/T7/b0fZ56nnqeep56nnqeep56/vnhflObxvT1I/U8/W5P3+ep56nnqeep56nnqeep558f7jcdk3ul56nn6Xd7+j5PPf/8cL9Jhvd56nl6n6f3eep5OodL53AfD/eb3Cu/29P3efo+T+dw6X2e3ufpfZ7e5+l9ns7hPj/c/6d1r9a98j5Pv9vT93n6Pk/ncOl9nt7n6X1e3uflfV7O4cp5ezlvrz9pKlP7b8ckwzlceZ+X93l5n5f3eXmfl56X8/Zy3v7xcP+fvM9Lz8v3efk+L+dwpeel56Xnpeel5+Uc7vPD/Sb3Ss9Lz8vv9vJ9Xnpeel56Xnpeel56XnpezuE+P9xvcq/0vPS8/G4v3+el56Xnpeel56Xnpeel5+Uc7vPD/X/S89Lz0vPyu718n5eel56Xnpeel56Xnpeel/d5eZ+Xnpeel56X93l5n5eel56Xnpeel56Xnpeel3O4ct5eel56XnpefreX7/PS89Lz0vPS89Lz0vPS83YO187bW89bz1vP2+/29n3eet563nreet563nreet7e5+193nreet563t7n7X3eet563nreet563nreet7O4dp5e+t563nrefvd3r7PW89bz1vPW89bz1vPW8/bOVw7b289bz1vPW+/29v3eet563nreet563nreet5O4dr5+2t563nreftd3v7Pm89bz1vPW89bz1vPW89b7/b23l763nreet5+93efre3nreet563nreet563nrdzuHbe3nreet563r7P2/d563nreet563nreet563k7h2vn7aPno+ej5+P7fHyfj56Pno+ej56Pno+ej56Pc7hx3j56Pno+ej5+t4/f7aPno+ej56Pno+ej56Pn4xxunLePno+ej56P3+3j+3z0fPR89Hz0fPR89Hz0fJzDjfP20fPR89Hz8bt9fJ+Pno+ej56Pno+ej56Pno9zuHHePno+ej56Pn63j+/z0fPR89Hz0fPR89Hz0fPxfT6+z0fPR89Hz8fv9nEON3o+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Pz/c78r70PPQ89Dzj4f7XcnQ89Dz0PPQ89Dz0PPQ888P97vyPvQ89Dz0/OPhflcy9Dz0PPQ89Dz0PPQ89Pzzw/2uvA89Dz0PPf94uN+VDD0PPQ89Dz0PPQ89Dz3//HC/K+9Dz0PPQ88/Hu53JUPPQ89Dz1PPU89Tz1PPPz/c76qtxupaPSsZR4aep56nnqeep56nnqeef36439X3PlLPU89Tz9Pv9tTzdJ6n8zz1PP1uz5CRMvQ89Tz1PJ3nfzzc/rf6757hd3WtntV+q3+czO/qWIVVWpVVW8koGSWjZLSMltEyWkbLaBkto2W0jJYxMkbGyBgZI2NkjIyRMTJGht/teb3z653reep56nk6z9N5nnqeep56nnqeep56nnqeep56nnr++eF+VzL0PPU89Tz9bv/8cL8rGXqeep56nnpeel56/vnhfldpVVZtNVbXv31WMvS89Lz0vPS89Lz0/PPD/a6u1bP69qr0vPxuL9/npeefH+53JcN5XnpezvNynpeef36435W9SnvlPC+/28v3efk+/3i435UM53k5z8t5Xs7zzw/3u/I+yl6VvXKel9/t5fu8fJ9/frjflQzneTnPy3lezvPPD/e78j7GXo29cp6X3+3l+7x8n39+uN+VDOd5Oc/LeV7O89Lzzw/3u7JX1145z0vPy/d5+T7/eLjflQw9Lz0vPS89//xwvyvvQ89Lz0vPy+/28n1eel56Xnpeel56Xnpeet7u4T4/3O8qrNKqrNq/Hatr9axk6Hnreet563m7h/v8cL+rsbpWz0qG7/PW89bz1vPW89bz1vPW83aet/O89bz1vPW8neftPG89bz1vPW89bz1vPW89b/dwXd6Hnreet5633+3t+7z1vPW89bz1vPW89bz1vN3DdXsfet563nrefre37/PW89bz1vPW89bz1vPW83aet/O89bz1vPW8neftPG89bz1vPW89bz1vPW89b/dw/bwPPW89bz1vv9vb93nreet563nreet563nrebuHa/fto+ej56Pn43f7+D4fPR89Hz0fPR89Hz0fPR/3cOO+ffR89Hz0fPxuH9/no+ej56Pno+ej56Pno+fjd/u4bx89Hz0fPR+/28fv9tHz0fPR89Hz0fPR89HzcQ837ttHz0fPR8/H9/n4Ph89Hz0fPR89Hz0fPR89H/dw47599Hz0fPR8fJ+P7/PR89Hz0fPR89Hz0fPR83EPN+7bR89Hz0fPx+/28bt99Hz0fPR89Hz0fPR89Hzcw4379tHz0fPR8/G7fXyfj56Pno+ej56Pno+ej56Pe7hx3z56Pnp+9fz63X59n189v3p+9fzq+dXzq+dXz697uOu+/er51fOr59fv9uv7/Or51fOr51fPr55fPb96fn2fX9/nV8+vnl89v363X/dwV8+vnl89v3p+9fzq+dXz6x7uum+/en71/Or59bv9uoe7en71/Or51fOr51fPr55f93DXffvV86vnV8+v3+3XPdzV86vnV8+vnl89v3p+9fy6h7vu26+eXz2/en79br96fp3n13l+9fz63X7dw13f51fPr55fPb/O8z8ebv9bffcMfzzcv9VYXatn9d0z3P2xOlZhlVYyVsbKWBkrY7+M9/NjdazCKq3Kqq3G6lo9KxlHxpFxZBwZR8aRcWQcGX63P9/nz/f50/On50/Pn/P8Oc+fnj89f3r+9Pzp+dPzp+dPz5+ePz1/7tuf+/an50/Pn54/v9uf7/On50/Pn54/PX96/vT86flz3/7ctz89f3r+9Pz53f58nz89f3r+9Pzp+dPzp+dPz5/79ue+/en50/On58/v9uf7/On5c9/+nOfPef70/DnPn/P86flzD/fcwz1/V3vO8+d3+/N9/nyfP/dwz3n+nOfPef6c5895/tzDPfftz33783e15zx/frc/3+fP9/m6h1vn+TrP13m+zvN1nq97uHXfvu7b19/V1nm+frev7/P1fb7u4dZ5vs7zdZ6v83yd56vn67593bevv6ut83z1fH2fr+/zdQ+3er56vnq+er56vu7h1t/VVs9Xz1fP1+/29X2+er56vnq+er56vnq+er7u4dbf1VbPV89Xz9fv9vV9vnq+er56vnq+er56vnq+7uHW39VWz1fPV8/X7/b1fb56vnq+er56vnq+er56vs7zdZ6vnq+er56v83yd56vnq+er56vnq+er56vn6x5u3bevnq+er56v3+3r+3z1fPX8m5f6/1/UX88PHu7g4Q4e7vx893Dn57tvPz9fz8/P1/PzzUv9Xck4Mo6MI+PI+Hp+8HAHD3fwcOfnyPjO8/Pz9fz8fD0/37zU35WMkBEyQkbI+Hp+8HAHD3fwcOcnZXz37efzw/2u7FXaq5SRMlJGySgZZa/Kc5TnKM9RMsr7KHtV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0znc54f7Te6Vnqeep9/t6fs89Tz1PPU89Tz1PPU89Tydw31+uN/kXul56nn63Z6+z1PPU89Tz1PPU89Tz1PP0/d5+j5PPU89Tz1Pv9vTOVzqeep56nnqeep56nnqeTqH+/xwv8m90vPU8/S7vZzDlZ6Xnpeel56Xnpeel56Xc7hy3l56Xnpeel5+t5dzuNLz0vPS89Lz0vPS89Lzcg5XzttLz0vPS8/L7/bS8/I+L+/z0vPyu72cw5Xv89Lz0vPS8/I+/8vD/T1/+cvDxX/TMV3TM4UpTWVq05i+s4xKGSkjZaSMlJEyUkbKSBkpo2SUjJJRMkpGySgZJaNklIyW0TJaRsvwu718n5fv89Lz0vPS8/I+L+/z0vPS89Lz0vPS89Lz0vPS89Lz0vNy3l7O20vPS89Lz8vv9vJ9Xnreet563nreet563nreztvbeXvreet563n73d6+z1vPW89bz1vPW89bz1vP23l7O29vPW89bz1vv9vb93nreTtvb+/z9j5vPW/v8/Y+bz1v53DtHK79Xa29z9vv9vZ93r7P2zlce5+393l7n7f3eXuft3O4dt7eztvb39Xa+7z9bm/f5+37vJ3Dtfd5e5+393l7n7f3eTuHa+ft7by9/V2tvc/b7/b2fd6+z9s5XHuft/d5e5+393l7n7eet/P2dt7e/q7W3uet5+37vH2ft3O41vPW89bz1vPW83YO1/6u1nreet563n63t+/z1vPW89bz0fPR89Hz0fNxDjf+rjZ6Pno+ej5+t4/v89Hz0fPR89Hz0fPR89HzcQ43/q42ej56Pno+freP7/PR89Hz0fPR89Hz0fPR8/E+H+/z0fPR89Hz8T4f7/PR89Hz0fPR89Hz0fPR83EON87bR89Hz0fPx+/28X0+ej56Pno+ej56Pno+ej7O4cZ5++j56Pno+fjdPr7PR89Hz0fPR89Hz0fPR8/H+3y8z0fPR89Hz8f7fLzPR89Hz0fPR89Hz0fPR8/HOdw4bx89Hz0fPR+/28f3+ej56Pno+ej56Pnq+er5Oodb5+2r56vnq+frd/v6Pl89Xz1fPV89Xz1fPV89X+dw67x99Xz1fPV8/W5f3+er56vnq+er56vnq+er5+t3+zpvXz1fPV89X7/b1+/21fPV89Xz1fPV89Xz1fN1DrfO21fPV89Xz9f3+fo+Xz1fPV89Xz1fPV89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3nreet5+t7ff7a3nreet563nreet563n4xxunLePno+ej56P7/PxfT56Pno+ej56Pno+ej56Ps7hxnn76Pno+ej5+D4f3+ej56Pno+ej56Pno+ej5+Mcbpy3j56Pno+ej9/t43f76Pno+ej56Pno+ej56Pk4hxvn7aPno+ej5+N3+/g+Hz0fPR89Hz0fPR89Hz0f53DjvH30fPR89Hz8bh/f56Pno+ej56Pno+ej56Pn4xxunLePno+ej56P3+3j+3z0fPR89Hz0fPR89Hz0fHyfj+/z0fPR89Hz8bt9nMONno+ej56Pno+ej56Pno9zuHHevnq+er56vn63r3O41fPV89Xz1fPV89Xz1fN1DrfO21fPV89Xz9fv9nUOt3q+er56vnq+er56vnq+zuHWefvq+er56vn63b56vt7n632+er5+t69zuPV9vnq+er56vt7nf3m4/W/6zhn+8nD/pjK1aUzfOcPiZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcms3+3r+3x9n6+er56vnq/3+Xqfr56vnq+er56vnq+er56vnq+er56v8/Z13r56vl/Pz7cv9Tf9yzifH+43PVOY0lSmNo1pv+nI+M7bz+eH+03PFCYZR8aRcWQcGV/PDx7u4OEOHu58frjflKYytWlMMp6MJ+PJeDKee/Vcx3Mdz3U8Gc/zCPcq3Ktwr0JGyAgZISNkhHsVriNdR7qOlJGeR7pX6V6le5UyUkbKKBklo9yrch3lOsp1lIzyPMq9Kveq3auW0TJaRstoGe1eteto19GuY2SM5zHu1bhX416NjJExMkbGyFj3al3Huo51HStjPY91r9a9Wvfq+91+Pj/cbzqma3qmMKWpTG36Mj4/3E8K98d0TNck48jQ86PnR8+PnuPhDh7u4OHO54f7Tc8UpjSVScaVoedHz4+eHz3Hwx083MHDnc8P95va5F7p+dFzPNw5IUPPj54fPT96joc7eLiDhzsnZaTnoedHz4+e4+HOSRl6fvT86PnRczzcwcMdPNw5JaM8Dz0/en70HA93TsvQ86PnR8+PnuPhDh7u4OHOaRnteej50fOj53i4c0aGnh89P3p+9BwPd/BwBw93zspYz0PPj54fPcfDnc8P95u+jKvnV8+vnuPhDh7u4OHO54f7TW0a03evrp7j4c7nh/tNMvT86vnVczzcwcMdPNz5/HC/6Ziu6ZnCJOPK0POr51fPr57j4Q4e7uDhzueH+01pcq/0/Oo5Hu58frjfJEPPr55fPcfDHTzcwcOdzw/3mzwPPb96fvUcD3c+P9xvkqHnV8+vnuPhDh7u4OHO54f7TZ6Hnl89v3qOhzufH+43ydDzq+dXz/FwBw938HDn88P9Js9Dz6+eXz3Hw53PD/ebZOj51fOr53i4g4c7eLjz+eF+k+eh51fPr57j4c7nh/tNMvT86vnTczzcwcMdPNz5/HC/KU1latOYZBwZev70/On503M83MHDHTzc+fxwv+l7Hk/Pn54/PcfDnc8P95tk6PnT86fneLiDhzt4uPP54X7TM7lXev70HA93Pj/cb5Kh50/Pn57j4Q4e7uDhzueH+02eh54/PX96joc7nx/uN8nQ86fnT8/xcAcPd/Bw5/PD/SbPQ8+fnj89x8Odzw/3m2To+dPzp+d4uIOHO3i48/nhfpPnoedPz5+e4+EOHu7g4Q4e7jw9x8OdNzJGhp7j4Q4e7uDhzl8ebv+b/p0znL883L8pTGkqU5vG9O8s48THyZz4OJkTHydz4uNkTnyczImPkznxcTInPk7mxMfJnPgj48g4Mo6MI+PIODKOjCPjyDgyrowr48q4Mq6MK8Pv9vB9Hr7P8XAHD3fwcAcPd/BwJ/Q89BwPd0LPQ89Dz0PP8XAHD3fwcOfzw/0mGXoeeh56joc74fs89Dz0PPQ89BwPd/BwBw93Pj/cb/r+WxJ6Hnoeeo6HO+H7PPQ89Dz0PPQcD3fwcAcPdz4/3G96JvdKz0PP8XAnfJ+Hnn9+uN8kw/scD3fC+zy8z/Fw5/PD/Sb3atwr73M83MHDHTzcwcOd8D4P7/PwPg/v8/A+T+dwnx/uN13TM4Up/bNlatOYZHifp/d5ep+n93k6h/v8cL+pTG0akwzf5+n7PJ3Dpfd5ep+n93l6n6f3eer554f7ic3dq+deeZ/j4Q4e7uDhDh7u4OFO6nnqeeo5Hu6kc7jPD/eb3Cs9Tz3Hw530fZ56nnqeep56joc7eLiDhzvpHO7zw/0m90rPU8/xcCd9n6eep56nnqee4+EOHu7g4U46h/v8cL/JvdLz1HM83Enf56nnqeep56nneLiDhzt4uJPe5+l9nnqeep56joc76X2eep56nnqeeo6HO3i4g4c76RwunbeXnpeel57j4U75Pi89Lz0vPS89x8MdPNzBw51yDlfO20vPS89Lz/Fwp3yfl56Xnpeel57j4Q4e7uDhTnmfl/d56Xnpeek5Hu6U93npeel56XnpOR7u4OEOHu6Uc7hy3l56Xnpeeo6HO+X7vPS89Lz0vPQcD3fwcAcPd8o5XDlvLz0vPS89x8Od8n1eel56Xnpeeo6HO3i4g4c75RyunLeXnpeel57j4U75Pi89Lz0vPS89x8MdPNzBw53yu72ct5eel56XnuPhTvndXnpeel56XnqOhzt4uIOHO+Ucrpy3l56Xnree4+FO+z5vPW89bz1vPcfDHTzcwcOddg7Xzttbz1vPW8/xcKd9n7eet563nree4+EOHu7g4U47h2vn7a3nreet53i40363t563nreet57j4Q4e7uDhTjuHa+ftreet563neLjTvs9bz1vPW89bz/FwBw938HCnncO18/bW89bz1nM83Gnf563nreet563neLiDhzt4uNPO4dp5e+t563nrOR7utO/z1vPW89bz1nM83MHDHTzcad/n7fu89bz1vPUcD3faOVzreet563nrOR7u4OEOHu60c7h23t563nreeo6HO+McbvR89Hz0fPQcD3fwcAcPd8Y53DhvHz0fPR89x8OdcQ43ej56Pno+eo6HO3i4g4c74xxunLePno+ej57j4Q4e7uDhDh7ujJ7j4c44hxvf53i4g4c7eLiDhzt/ebi/5y9/ebj4bzqma3qmMKWpTG0a03eWMSkjZaSMlJEyUkbKSBkpI2WUjJJRMkpGySgZJaNklIyS0TJaRstoGX63j+/z8X2Ohzt4uIOHO3i4g4c7o+ej53i4M3o+ej56PnqOhzt4uIOHO+O8fZy3j56Pno+e4+HO+D4fPV89Xz1fPcfDHTzcwcOddd6+zttXz1fPV8/xcGd9n6+er56vnq+e4+EOHu7g4c46b1/n7avnq+er53i4s77PV8/Xeft6n6/3OR7urPf5ep/j4c46h8PDHTzcwcP9j6hzSXJkV5bklir8C9//xrpf3kPVGUZlEmC5MRJUUXzwcB883AcP98HDfcf3+fF9fnyfH9/nx/f5cQ53nLcf5+3H72rH9/nx3n78fX78fX6cwx3f58f3+fF9fnyfH9/nxznccd5+nLcfv6sd3+fHe/vx9/nx9/lxDnd8nx/f58f3+fF9fnyfH3N+nLfDw33wcB883AcP98HDffBwHzzcBw/3HXN+zPkx5/Bw33EOd/yudsz5MefHnMPDfcff58ecH3OOHy7wwwU8XMDDBTxc4IcL/HCBHy7+/eY8fvel/t+KjI+Mj4yPjI+M35wHPFzAwwU8XOCHC/xwgR8u/v3mPH73pf7fiowgI8gIMoKM35wHPFzAwwU8XOCHC/xwgR8u/iV7lexVkpFkJBlFRpFR7FXxHMVzFM9RZBSfR7FXxV41e9VkNBlNRpPRZDR71TxH8xzNcwwZw+cx7NWwV8NeDRlDxpAxZAwZy14tz7E8x/IcS8byeSx7tezVsldLxiPjkfHIeGQ89urxHI/neDzHI+PxeRx7dezVsVdHxpFxZBwZR8axV8w5PFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jhIpjzYM7h4QI/XOCHC/xwgR8u8MMFPFzAwwU8XOCHC/xwgR8ugjkP5hweLvDDBX64wA8X+OECP1zAwwU8XMDDBX64wA8X+OEimPNgzuHhAj9c4IcL/HCBHy7wwwU8XMDDBTxc4IcL/HCBHy6COQ/mHB4u8MMFfrjADxf44QI/XMDDBTxcwMMFfrjADxf44SKY82DO4eECP1zghwv8cIEfLvDDBTxcwMMFPFzghwv8cIEfLoI5D+YcHi7g4QIeLuDhAj9cwMNFPDIeGcw5PFzAwwU8XPzxcPe/1X/nDPHHw/1vdf9YfayCVbIqVs1qWC0rMn6cTOSPk4n8cTKRP04m8sfJRP44mcgfJxP542Qif5xM5I+TifxHxkfGR8ZHxkfGR8ZHxkfGR8ZHxkdGkBFk8N6ev7/PAz9cwMMFPFzAwwU8XMDDRTLnyZzDwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jhIpnzZM7h4QI/XOCHC/xwgR8u8MMFPFzAwwU8XOCHC/xwgR8ukjlP5hweLvDDBX64wA8X+OECP1zAwwU8XMDDBX64wA8X+OEimfNkzuHhAj9c4IcL/HCBHy7wwwU8XCTf58n3OTxc4IcLeLiAhwt4uICHC3i4gIcLeLjADxf44QI/XCTf58n3OX64wA8X+OEif7+rRfF9jh8u8MMFfrjADxf44QI/XOCHi+L7vPg+xw8X+OECP1zU73e1KL7P8cMFfrjADxf44QI/XOCHC/xwUXyfF9/n+OECP1zAwwU8XMDDBTxcwMMFPFzAwwU8XOCHC/xwUcw5PFzghwv8cIEfLoo5L+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jhopjzYs7h4QI/XOCHC/xwgR8u8MMFPFzAwwU8XOCHC/xwgR8uijkv5hweLvDDBX64wA8X+OECP1zAwwU8XMDDBX64wA8X+OGimHP8cAEPF8X3OX64KOa8mPNizuHhAh4u4OGijozj82DOizkv5hweLpq/z5s5b+a8mfNmzuHhAh4u4OGiOYfr33l7NHPezHkz5/Bw0fx93sx5M+fNnDdzDg8X8HABDxfN93nzfd7MeTPnzZzDw0Xzfd7MeTPnzZw3cw4PF/BwAQ8XzTlc/87bAz9c4IcL/HABDxf44QI/XOCHC/xwgR8u4OECHi7g4QI/XOCHC/xw0cx5M+fwcIEfLvDDBX64wA8X+OECHi7g4QIeLvDDBX64wA8XzZw3cw4PF/jhAj9c4IcL/HCBHy7g4QIeLuDhAj9c4IcL/HDRzHkz5/BwgR8u8MMFfrjADxf44QIeLuDhAh4u8MMFfrjADxfNnDdzDg8X+OECP1zghwv8cIEfLuDhAh4u4OECP1zghwv8cDHM+TDn8HCBHy7wwwV+uMAPF/jhAh4u4OECHi7wwwV+uMAPF8OcD3MODxf44QI/XOCHC/xwgR8u4OECHi7g4QI/XOCHC/xwMcz5MOfwcIEfLvDDBX64wA8X+OECHi7g4QIeLvDDBX64wA8Xw5wPcw4PF/jhAj9c4IcL/HCBHy7g4QIeLuDhAj9c4IcL/HAxzPkw5/BwgR8u8MMFfrjADxf44QIeLuDhAh4u8MMFfrjADxfDnA9zDg8X+OECP1zghwv8cIEfLuDhAh4u4OECP1zghwv8cDHM+TDn8HCBHy7wwwV+uMAPF/jhAh4u4OECHi7wwwV+uMAPF8ucL3MODxf44QI/XOCHC/xwgR8u4OECHi7g4QI/XOCHC/xwscz5MufwcAEPF/BwAQ8X+OECHi6Wczj8cAEPF/BwAQ8X8HDxx8Pd/1a/c4Y/Hu6/1WP1O2fYHycT++NkYn+cTOyPk4n9cTKxP04mtsgoMoqMIqPJaDKajCajyWgymowmo8loMoaMIWPIGDKGjCFjyBgyhowhg/f25e9z/HABDxfwcAEPF/BwAQ8Xy5wvcw4PF/jhAj9c4IcL/HABDxfwcAEPF/jhAj9c4IeLZc6XOYeHC/xwgR8u8MMFfrjADxfwcAEPF/BwgR8u8MMFfrh4zPljzuHhAj9c4IcL/HCBHy7wwwU8XMDDBTxc4IcL/HCBHy4ec/6Yc3i4wA8X+OECP1zghwv8cAEPF4/v88f3OTxc4IcLeLiAhwt4uICHC3i4gIcLeLjADxf44QI/XDy+zx/f5/jhAj9c4IeLx+9qj+9z/HCBHy7wwwV+uMAPF/jhAj9cPL7PH9/n+OECP1zgh4vH72qP73P8cIEfLvDDBX64wA8X+OECP1w8vs8f3+f44QI/XMDDBTxcwMMFPFzAwwU8XMDDBTxc4IcL/HDxmHN4uMAPF/jhAj9cPOb8MefwcIEfLvDDBX64wA8X+OECHi7g4QIeLvDDBX64wA8Xx5wfcw4PF/jhAj9c4IcL/HCBHy7g4QIeLuDhAj9c4IcL/HBxzPkx5/BwgR8u8MMFfrjADxf44QIeLuDhAh4u8MMFfrjADxfHnOOHC3i4OL7P8cPFMefHnB9zDg8X8HABDxfHOdxx3n7M+THnx5zDw8Xx9/kx58ecH3N+zDk8XMDDBTxcHOdwx3n7MefHnB9zDg8Xx9/nx5wfc37M+THn8HABDxfwcHF8nx/f58ecH3N+zDk8XBzf58ecH3N+zPkx5/BwAQ8X8HBxnMMd5+344QI/XOCHC3i4wA8X+OECP1zghwv8cAEPF/BwAQ8X+OECP1zih8t/vzlP7ktNeLjED5f44RI/XOKHS/xwCQ+X8HAJD5f44RI/XOKHy3+/OU/uS014uMQPl/jhEj9c4odL/HAJD5fwcAkPl/jhEj9c4ofLf8FeJXuVZCQZSUaSkWQke5U8R/IcyXMUGcXnUexVsVfFXhUZRUaRUWQUGc1eNc/RPEfzHE1G83k0e9XsVbNXTcaQMWQMGUPGsFfDcwzPMTzHkDF8HsteLXu17NWSsWQsGUvGkrHs1fIcj+d4PMcj4/F5PPbqsVePvXpkPDIeGUfGkXHs1fEcx3Mcz3FkHJ/HsVfMOfelJjxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw+XHnHNfasLDJX64xA+X+OESP1zih0t4uISHS3i4xA+X+OESP1x+zDn3pSY8XOKHS/xwiR8u8cMlfriEh0t4uISHS/xwiR8u8cPlx5xzX2rCwyV+uMQPl/jhEj9c4odLeLiEh0t4uMQPl/jhEj9cfsw596UmPFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHD5cecc19qwsMlPFzCwyU8XOKHS3i4/JaMJYM5h4dLeLiEh8s/Hu7+t/rvnCH/eLj/VsNqWT1W91v9OJn8fpxMfj9OJr8fJ5PfkXFkHBlHxpHx42QyfpxMxo+TyfhxMhk/Tibjx8lk/DiZjB8nk/HjZDJ+nEzGPzI+Mj4yPjI+Mj4yPjI+Mj4yfu/tGb+/zxM/XMLDJTxcwsMlPFzCwyX3pSb3pSY8XOKHS/xwiR8u8cMlPFzCwyU8XOKHS/xwiR8ugznnvtSEh0v8cIkfLvHDJX64xA+X8HAJD5fwcIkfLvHDJX64DOac+1ITHi7xwyV+uMQPl/jhEj9cwsMlPFzCwyV+uMQPl/jhMphz7ktNeLjED5f44RI/XOKHS/xwCQ+X3Jea3Jea8HCJHy7h4RIeLuHhEh4u4eESHi7h4RI/XOKHS/xwyX2pyX2piR8u8cMlfriMY6/4PscPl/jhEj9c4odL/HCJHy7xwyX3pSb3pSZ+uMQPl/jhMn+/qyX3pSZ+uMQPl/jhEj9c4odL/HCJHy65LzW5LzXxwyV+uISHS3i4hIdLeLiEh0t4uISHS3i4xA+X+OGS+1ITHi7xwyV+uMQPl8mcc19qwsMlfrjED5f44RI/XOKHS3i4hIdLeLjED5f44RI/XCZzzn2pCQ+X+OESP1zih0v8cIkfLuHhEh4u4eESP1zih0v8cJnMOfelJjxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw2Uy5/jhEh4uk+9z/HCZzDn3pSb3pSY8XMLDJTxc5pFxfB7MeTLn3Jea8HCZRwZznsw596Um96UmPFzCwyU8XNbvHC7rd96exZwXc859qQkPl8Xf58WcF3POfanJfakJD5fwcAkPl8X3efF9Xsx5Mefcl5rwcFl8nxdzXsw596Um96UmPFzCwyU8XFaS8TtvT/xwiR8u8cMlPFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHDZTHn3Jea8HCJHy7xwyV+uMQPl/jhEh4u4eESHi7xwyV+uMQPl8Wcc19qwsMlfrjED5f44RI/XOKHS3i4hIdLeLjED5f44RI/XBZzzn2pCQ+X+OESP1zih0v8cIkfLuHhEh4u4eESP1zih0v8cFnMeTHn8HCJHy7xwyV+uMQPl/jhEh4u4eESHi7xwyV+uMQPl82cN3MOD5f44RI/XOKHS/xwiR8u4eESHi7h4RI/XOKHS/xw2cx5M+fwcIkfLvHDJX64xA+X+OESHi7h4RIeLvHDJX64xA+XzZw3cw4Pl/jhEj9c4odL/HCJHy7h4RIeLuHhEj9c4odL/HDZzDn3pSY8XOKHS/xwiR8u8cMlfriEh0t4uISHS/xwiR8u8cNlM+fcl5rwcIkfLvHDJX64xA+X+OESHi7h4RIeLvHDJX64xA+XzZxzX2rCwyV+uMQPl/jhEj9c4odLeLiEh0t4uMQPl/jhEj9cNnPOfakJD5f44RI/XOKHS/xwiR8u4eESHi7h4RI/XOKHS/xwOcw596UmPFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHD5TDn3Jea8HAJD5fwcAkPl/jhEh4uh3M4/HAJD5fwcAkPl/Bw+cfD3f9Wv3OGPx7uv1WxalbDalk9Vr+zjPlxMjk/TianyCgyiowio8goMoqMIqPJaDKajCajyWgymowmo8loMoaMIWPIGDKGjCGD9/bh73P8cAkPl/BwCQ+X8HAJD5fcl5rcl5rwcIkfLvHDJX64xA+X8HAJD5fwcIkfLvHDJX64HOac+1ITHi7xwyV+uMQPl/jhEj9cwsMlPFzCwyV+uMQPl/jhcplz7ktNeLjED5f44RI/XOKHS/xwCQ+X8HAJD5f44RI/XOKHy2XOuS814eESP1zih0v8cIkfLvHDJTxccl9qcl9qwsMlfriEh0t4uISHS3i4hIdLeLiEh0v8cIkfLvHDJfelJvelJn64xA+X+OFy+V2N+1ITP1zih0v8cIkfLvHDJX64xA+X3Jea3Jea+OESP1zih8vldzXuS038cIkfLvHDJX64xA+X+OESP1xyX2pyX2rih0v8cAkPl/BwCQ+X8HAJD5fwcAkPl/BwiR8u8cMl96UmPFzih0v8cIkfLpc5577UhIdL/HCJHy7xwyV+uMQPl/BwCQ+X8HCJHy7xwyV+uFzmnPtSEx4u8cMlfrjED5f44RI/XMLDJTxcwsMlfrjED5f44fIx59yXmvBwiR8u8cMlfrjED5f44RIeLuHhEh4u8cMlfrjED5ePOccPl/Bw+fg+xw+XjznnvtTkvtSEh0t4uISHy8c53OO8/THnjznnvtSEh8vH3+ePOX/MOfelJvelJjxcwsMlPFw+zuEe5+2POX/MOfelJjxcPv4+f8z5Y865LzW5LzXh4RIeLuHh8vF9/vg+f8z5Y865LzXh4fLxff6Y88ecc19qcl9qwsMlPFzCw+XjHO5x3o4fLvHDJX64hIdL/HCJHy7xwyV+uMQPl/BwCQ+X8HCJHy7xwyV+uHzMOfelJjxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw+Ux59yXmvBwiR8u8cMlfrjED5f44RIeLuHhEh4u8cMlfrjED5fHnHNfasLDJX64xA+X+OESP1zih0t4uISHS3i4xA+X+OESP1wec37MOTxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw+Ux58ecw8MlfrjED5f44RI/XOKHS3i4hIdLeLjED5f44RI/XB5zfsw5PFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHD5THnx5zDwyV+uMQPl/jhEj9c4odLeLiEh0t4uMQPl/jhEj9cHnPOfakJD5f44RI/XOGHK/xwhR+u4OEKHq7g4Qo/XOGHK/xw9e8358V9qQUPV/jhCj9c4Ycr/HCFH67g4QoeruDhCj9c4Ycr/HD17zfnxX2pBQ9X+OEKP1zhhyv8cIUfruDhCh6u4OEKP1zhhyv8cPUv2atkr5KMIqPIKDKKjGKviuconqN4jiKj+DyavWr2qtmrJqPJaDKajCaj2avmOYbnGJ5jyBg+j2Gvhr0a9mrIGJ5jeI7lOZaMJWPJWDKW51ieY8lYnuP/5vz+Vu+/c4b64+H+WwWrZFWsmtWwWlaP1f1WR8aRcWQcGUfGkXFkHBlHxo+Tqe/HydT342Tq+3Ey9f04mfp+nEx9P06mvh8nU9+Pk6nvx8nU94+Mj4yPjI+Mj4zfe3t9v7/PCz9cwcMVPFzBwxU8XMHDFfelFvelFjxc4Ycr/HCFH67wwxU8XMHDFTxc4Ycr/HCFH64+5pz7UgservDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OHqY865L7Xg4Qo/XOGHK/xwhR+u8MMVPFzBwxU8XOGHK/xwhR+uPuac+1ILHq7wwxV+uMIPV/jhCj9cwcMV96UW96UWPFzhhyt4uIKHK3i4gocreLiChyt4uMIPV/jhCj9ccV9qcV9q4Ycr/HCFH66+Y6+OvToyjowj48g4Mo694vuc+1KL+1ILP1zhhyv8cBW/39WK+1ILP1zhhyv8cIUfrvDDFX64wg9X3Jda3Jda+OEKP1zBwxU8XMHDFTxcwcMVPFzBwxU8XOGHK/xwxX2pBQ9X+OEKP1zhh6tgzrkvteDhCj9c4Ycr/HCFH67wwxU8XMHDFTxc4Ycr/HCFH66COee+1IKHK/xwhR+u8MMVfrjCD1fwcAUPV/BwhR+u8MMVfrgK5pz7UgservDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OEqmHP8cAUPV8H3OX64Cuac+1KL+1ILHq7g4QoeruKR8fg8mPNgzrkvteDhKo4M5jyYc+5LLe5LLXi4gocreLjK3zlc5e+8vZI5T+ac+1ILHq7y9/d5JXOezDn3pRb3pRY8XMHDFTxcJd/nyfd5MufJnHNfasHDVfJ9nsx5Mufcl1rcl1rwcAUPV/BwlUHG77y98MMVfrjCD1fwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9XyZxzX2rBwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cJXPOfakFD1f44Qo/XOGHK/xwhR+u4OEKHq7g4Qo/XOGHK/xwlcw596UWPFzhhyv8cIUfrvDDFX64gocreLiChyv8cIUfrvDDVTLnyZzDwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cFXNezDk8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MNVMefFnMPDFX64wg9X+OEKP1zhhyt4uIKHK3i4wg9X+OEKP1wVc17MOTxc4Ycr/HCFH67wwxV+uIKHK3i4gocr/HCFH67ww1Ux59yXWvBwhR+u8MMVfrjCD1f44QoeruDhCh6u8MMVfrjCD1fFnHNfasHDFX64wg9X+OEKP1zhhyt4uIKHK3i4wg9X+OEKP1wVc859qQUPV/jhCj9c4Ycr/HCFH67g4QoeruDhCj9c4Ycr/HBVzDn3pRY8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MNVMefcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9XzZxzX2rBwxU8XMHDFTxc4YcreLhqzuHwwxU8XMHDFTxcwcPVHw93/1v9zhn+eLj/rfIfq49VsEpWxapZDatlRUaSUWQUGUVGkVFkFBlFRpFRZBQZTUaT0WQ0GU1Gk9FkNBlNRpMxZAwZvLc3f5/jhyt4uIKHK3i4gocreLjivtTivtSChyv8cIUfrvDDFX64gocreLiChyv8cIUfrvDDVTPn3Jda8HCFH67wwxV+uMIPV/jhCh6u4OEKHq7wwxV+uMIPV82cc19qwcMVfrjCD1f44Qo/XOGHK3i4gocreLjCD1f44Qo/XA1zzn2pBQ9X+OEKP1zhhyv8cIUfruDhivtSi/tSCx6u8MMVPFzBwxU8XMHDFTxcwcMVPFzhhyv8cIUfrrgvtbgvtfDDFX64wg9Xk+wV3+f44Qo/XOGHK/xwhR+u8MMVfrjivtTivtTCD1f44Qo/XE2zV3yf44cr/HCFH67wwxV+uMIPV/jhivtSi/tSCz9c4YcreLiChyt4uIKHK3i4gocreLiChyv8cIUfrrgvteDhCj9c4Ycr/HA1zDn3pRY8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MPVMOfcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9Xy5xzX2rBwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cLXOOH67g4Wr5PscPV8ucc19qcV9qwcMVPFzBw9VyDrecty9zvsw596UWPFwtf58vc77MOfelFvelFjxcwcMVPFwt53DLefsy58ucc19qwcPV8vf5MufLnHNfanFfasHDFTxcwcPV8n2+fJ8vc77MOfelFjxcLd/ny5wvc859qcV9qQUPV/BwBQ9Xyzncct6OH67wwxV+uIKHK/xwhR+u8MMVfrjCD1fwcAUPV/BwhR+u8MMVfrha5pz7UgservDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OHqMefcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9XjznnvtSChyv8cIUfrvDDFX64wg9X8HAFD1fwcIUfrvDDFX64esz5Y87h4Qo/XOGHK/xwhR+u8MMVPFzBwxU8XOGHK/xwhR+uHnP+mHN4uMIPV/jhCj9c4Ycr/HAFD1fwcAUPV/jhCj9c4Yerx5w/5hwervDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OHqMeePOYeHK/xwhR+u8MMVfrjCD1fwcAUPV/BwhR+u8MMVfrh6zDn3pRY8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MPVMefcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9Xx5xzX2rBwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cHXPOfakFD1f44Qo/XOGHK/xwhR+u4OEKHq7g4Qo/XOGHK/xwdcw596UWPFzhhyv8cIUfrvDDFX64gocreLiChyv8cIUfrvDD1THn3Jda8HAFD1fwcAUPV/jhCh6ujnM4/HAFD1fwcAUPV/Bw9cfD3f9Wv3OGPx7uv9Vj9TtnODiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZ+3Ey/e/HyfS/HyfT/36cTP/7cTL978fJ9L8fJ9P/fpxM//txMv3vx8n0v39k/N7b+9/v7/PGD9fwcA0P1/BwDQ/X8HDNfanNfakND9f44Ro/XOOHa/xwDQ/X8HAND9f44Ro/XOOH63/JcyTPkWQkGUlGkpFk/Oa84eEaHq7h4Ro/XOOHa/xw/e835819qQ0P1/jhGj9c44dr/HCNH67h4RoeruHhGj9c44dr/HD9r9mrYa+GjCFjyBgyhoxhr4bnGJ5jeI4lY/k8lr1a9mrZqyVjyVgylowl47FXj+d4PMfjOR4Zj8/jsVePvXrs1SPjyDgyjowj49ir4zmO5zie48j4nbc3frj+fr+rNfelNn64xg/X+OEaP1zjh2v8cI0frrkvtbkvtfHDNX64hodreLiGh2t4uIaHa3i4hodreLjGD9f44Zr7UhservHDNX64xg/XH3POfakND9f44Ro/XOOHa/xwjR+u4eEaHq7h4Ro/XOOHa/xw/THn3Jfa8HCNH67xwzV+uMYP1/jhGh6u4eEaHq7xwzV+uMYP1x9zzn2pDQ/X+OEaP1zjh2v8cI0fruHhGh6u4eEaP1zjh2v8cP0x5/jhGh6uvyWDOf+Yc+5Lbe5LbXi4hodreLj+HhmPz4M5/5hz7ktteLj+HhnM+cecc19qc19qw8M1PFzDw/V3ZByfB3P+Mefcl9rwcB2/v887mPNgzrkvtbkvteHhGh6u4eE6+D4Pvs+DOQ/mnPtSGx6ug+/zYM6DOee+1Oa+1IaHa3i4hofrCDJ+5+2NH67xwzV+uIaHa/xwjR+u8cM1frjGD9fwcA0P1/BwjR+u8cM1frgO5pz7UhservHDNX64xg/X+OEaP1zDwzU8XMPDNX64xg/X+OE6mHPuS214uMYP1/jhGj9c44dr/HAND9fwcA0P1/jhGj9c44frYM65L7Xh4Ro/XOOHa/xwjR+u8cM1PFzDwzU8XOOHa/xwjR+ugzkP5hwervHDNX64xg/X+OEaP1zDwzU8XMPDNX64xg/X+OE6mPNgzuHhGj9c44dr/HCNH67xwzU8XMPDNTxc44dr/HCNH66TOU/mHB6u8cM1frjGD9f44Ro/XMPDNTxcw8M1frjGD9f44TqZ82TO4eEaP1zjh2v8cI0frvHDNTxcw8M1PFzjh2v8cI0frpM5577Uhodr/HCNH67xwzV+uMYP1/BwDQ/X8HCNH67xwzV+uE7mnPtSGx6u8cM1frjGD9f44Ro/XMPDNTxcw8M1frjGD9f44TqZc+5LbXi4xg/X+OEaP1zjh2v8cA0P1/BwDQ/X+OEaP1zjh+tkzrkvteHhGj9c44dr/HCNH67xwzU8XMPDNTxc44dr/HCNH66TOee+1IaHa/xwjR+u8cM1frjGD9fwcA0P1/BwjR+u8cM1frgu5pz7UhseruHhGh6u4eEaP1zDw3V9ZPD3OTxcw8M1PFzDw/UfD3f/W/3OGf54uP9Ww2pZPVa/c4b6cTJdP06m68fJdP04ma4kI8lIMpKMJCPJKDKKjCKjyCgyiowio8goMoqMJqPJaDKajCajyWgymgze24u/z/HDNTxcw8M1PFzDwzU8XHNfanNfasPDNX64xg/X+OEaP1zDwzU8XMPDNX64xg/X+OG6mHPuS214uMYP1/jhGj9c44dr/HAND9fwcA0P1/jhGj9c44frYs65L7Xh4Ro/XOOHa/xwjR+u8cM1PFzDwzU8XOOHa/xwjR+umznnvtSGh2v8cI0frvHDNX64xg/X8HDNfanNfakND9f44RoeruHhGh6u4eEaHq7h4RoervHDNX64xg/X3Jfa3Jfa+OEaP1zjh+tO9orvc/xwjR+u8cM1frjGD9f44Ro/XHNfanNfauOHa/xwjR+uu9grvs/xwzV+uMYP1/jhGj9c44dr/HDNfanNfamNH67xwzU8XMPDNTxcw8M1PFzDwzU8XMPDNX64xg/X3Jfa8HCNH67xwzV+uG7mnPtSGx6u8cM1frjGD9f44Ro/XMPDNTxcw8M1frjGD9f44bqZc+5LbXi4xg/X+OEaP1zjh2v8cA0P1/BwDQ/X+OEaP1zjh+thzrkvteHhGj9c44dr/HCNH67xwzU8XMPDNTxc44dr/HCNH66HOccP1/BwPXyf44frYc65L7W5L7Xh4RoeruHhejiHG87bhzkf5pz7Uhseroe/z4c5H+ac+1Kb+1IbHq7h4RoerodzuOG8fZjzYc65L7Xh4Xr4+3yY82HOuS+1uS+14eEaHq7h4Xr4Ph++z4c5H+ac+1IbHq6H7/Nhzoc5577U5r7UhodreLiGh+vhHG44b8cP1/jhGj9cw8M1frjGD9f44Ro/XOOHa3i4hodreLjGD9f44Ro/XA9zzn2pDQ/X+OEaP1zjh2v8cI0fruHhGh6u4eEaP1zjh2v8cL3MOfelNjxc44dr/HCNH67xwzV+uIaHa3i4hodr/HCNH67xw/Uy59yX2vBwjR+u8cM1frjGD9f44RoeruHhGh6u8cM1frjGD9fLnC9zDg/X+OEaP1zjh2v8cI0fruHhGh6u4eEaP1zjh2v8cL3M+TLn8HCNH67xwzV+uMYP1/jhGh6u4eEaHq7xwzV+uMYP18ucL3MOD9f44Ro/XOOHa/xwjR+u4eEaHq7h4Ro/XOOHa/xwvcz5MufwcI0frvHDNX64xg/X+OEaHq7h4RoervHDNX64xg/Xy5xzX2rDwzV+uMYP1/jhGj9c44dreLiGh2t4uMYP1/jhGj9cP+ac+1IbHq7xwzV+uMYP1/jhGj9cw8M1PFzDwzV+uMYP1/jh+jHn3Jfa8HCNH67xwzV+uMYP1/jhGh6u4eEaHq7xwzV+uMYP1485577Uhodr/HCNH67xwzV+uMYP1/BwDQ/X8HCNH67xwzV+uH7MOfelNjxc44dr/HCNH67xwzV+uIaHa3i4hodr/HCNH67xw/VjzrkvteHhGh6u4eEaHq7xwzU8XD/O4fDDNTxcw8M1PFzDw/UfD3f/W/3OGf54uP9WxapZDatl9Vj9zjLej5Pp9+Nk+j0yHhmPjEfGI+OR8ch4ZBwZR8aRcWQcGUfGkXFkHBlwMgcnc3AyBydzcDIHJ3NwMvBwffx9jh+u4eEaHq7h4RoeruHhmvtSm/tSGx6u8cM1frjGD9f44RoeruHhGh6u8cM1frjGD9fHnHNfasPDNX64xg/X+OEaP1zjh2t4uIaHa3i4xg/X+OEaP1wfc859qQ0P1/jhGj9c44dr/HCNH67h4RoeruHhGj9c44dr/HB9zDn3pTY8XOOHa/xwjR+u8cM1friGh2vuS23uS214uMYP1/BwDQ/X8HAND9fwcA0P1/BwjR+u8cM1frjmvtTmvtTGD9f44Ro/XB+/q3FfauOHa/xwjR+u8cM1frjGD9f44Zr7Upv7Uhs/XOOHa/xwffyuxn2pjR9u8MMNfrjBDzf44QY/3OCHG+5LHe5LHfxwgx9u4OEGHm7g4QYebuDhBh5u4OEGHm7www1+uOG+1IGHG/xwgx9u8MPNv9+cD/elDjzc4Icb/HCDH27www1+uIGHG3i4gYcb/HCDH27ww82/ZK+KvSoyiowio8goMoq9Kp6jeI7iOZqM5vNo9qrZq2avmowmo8loMpqMYa+G5xieY3iOIWP4PIa9GvZq2KshY8lYMpaMJWPZq+U5ludYnmPJWD6Px1499uqxV4+MR8Yj45HxyHjs1eM5juc4nuPIOD6PY6+OvTr26sg4MpjzjznnvtThvtSBhxt4uIGHm+/3fT7f7/t8Pub8Y865L3Xg4eb7yGDOP+ac+1KH+1IHHm7g4QYebr4g43fePvjhBj/c4IcbeLjBDzf44QY/3OCHG/xwAw838HADDzf44QY/3OCHm485577UgYcb/HCDH27www1+uMEPN/BwAw838HCDH27www1+uPmYc+5LHXi4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5uPOee+1IGHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrj5mPOPOYeHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrj5mPOPOYeHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrgJ5jyYc3i4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5tgzoM5h4cb/HCDH27www1+uMEPN/BwAw838HCDH27www1+uAnmnPtSBx5u8MMNfrjBDzf44QY/3MDDDTzcwMMNfrjBDzf44SaYc+5LHXi4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5tgzrkvdeDhBj/c4Icb/HCDH27www083MDDDTzc4Icb/HCDH26COee+1IGHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrgJ5pz7UgcebvDDDX64wQ83+OEGP9zAww083MDDDX64wQ83+OEmmXPuSx14uIGHG3i4gYcb/HADDzf5kfGRwZzDww083MDDzR8Pd3+r+O+cYf54uP9WwSpZFatmNayW1WN1v1WSkWQkGUlGkpFkJBlJRpKRZBQZRUaRUWQUGUVGkVFkFBlFRpPRZDQZTQbv7dl85s1nzpzDww083MDDDTzccF/qcF/qwMMNfrjBDzf44QY/3MDDDTzcwMMNfrjBDzf44SaZc+5LHXi4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5tkzrkvdeDhBj/c4Icb/HCDH27www083MDDDTzc4Icb/HCDH26KOee+1IGHG/xwgx9u8MMNfrjBDzfwcMN9qcN9qQMPN/jhBh5u4OEGHm7g4QYebuDhBh5u8MMNfrjBDzfclzrclzr44QY/3OCHm0r2iu9z/HCDH27www1+uMEPN/jhBj/ccF/qcF/q4Icb/HCDH26q2Cu+z/HDDX64wQ83+OEGP9zghxv8cMN9qcN9qYMfbvDDDTzcwMMNPNzAww083MDDDTzcwMMNfrjBDzfclzrwcIMfbvDDDX64Keac+1IHHm7www1+uMEPN/jhBj/cwMMNPNzAww1+uMEPN/jhpphz7ksdeLjBDzf44QY/3OCHG/xwAw838HADDzf44QY/3OCHm2bOuS914OEGP9zghxv8cIMfbvDDDTzcwMMNPNzghxv8cIMfbpo5xw838HDTfJ/jh5tmzrkvdbgvdeDhBh5u4OGmOYfr33n7NHPezDn3pQ483DR/nzdz3sw596UO96UOPNzAww083DTncF18Hsx5M+fclzrwcNP8fd7MeTPn3Jc63Jc68HADDzfwcNN8nzff582cN3POfakDDzfN93kz582cc1/qcF/qwMMNPNzAw01zDtfD58Gc44cb/HADDzf44QY/3OCHG/xwgx9u4OEGHm7g4QY/3OCHG/xw08w596UOPNzghxv8cIMfbvDDDX64gYcbeLiBhxv8cIMfbvDDTTPn3Jc68HCDH27www1+uMEPN/jhBh5u4OEGHm7www1+uMEPN8Occ1/qwMMNfrjBDzf44QY/3OCHG3i4gYcbeLjBDzf44QY/3AxzPsw5PNzghxv8cIMfbvDDDX64gYcbeLiBhxv8cIMfbvDDzTDnw5zDww1+uMEPN/jhBj/c4IcbeLiBhxt4uMEPN/jhBj/cDHM+zDk83OCHG/xwgx9u8MMNfriBhxt4uIGHG/xwgx9u8MPNMOfDnMPDDX64wQ83+OEGP9zghxt4uIGHG3i4wQ83+OEGP9wMc859qQMPN/jhBj/c4Icb/HCDH27g4QYebuDhBj/c4Icb/HAzzDn3pQ483OCHG/xwgx9u8MMNfriBhxt4uIGHG/xwgx9u8MPNMufclzrwcIMfbvDDDX64wQ83+OEGHm7g4QYebvDDDX64wQ83y5xzX+rAww1+uMEPN/jhBj/c4IcbeLiBhxt4uMEPN/jhBj/cLHPOfakDDzf44QY/3OCHG/xwgx9u4OEGHm7g4QY/3OCHG/xws8w596UOPNzAww083MDDDX64gYeb5RwOP9zAww083MDDDTzc/PFw97/V75zhj4f732r/sfpYBatkVaya1bBaVmQsGY+MR8Yj45HxyHhkPDIeGY+MR8aRcWQcGUfGkXFkHBlHxpHx42Tm/TiZeT9OZuDh5vH3OX64gYcbeLiBhxt4uIGHG+5LHe5LHXi4wQ83+OEGP9zghxt4uIGHG3i4wQ83+OEGP9w85pz7UgcebvDDDX64wQ83+OEGP9zAww083MDDDX64wQ83+OHmMefclzrwcIMfbvDDDX64wQ83+OEGHm7g4QYebvDDDX64wQ83jznnvtSBhxv8cIMfbvDDDX64wQ838HDDfanDfakDDzf44QYebuDhBh5u4OEGHm7g4QYebvDDDX64wQ833Jc63Jc6+OEGP9zgh5vH72rclzr44QY/3OCHG/xwgx9u8MMNfrjhvtThvtTBDzf44QY/3Dx+V+O+1MEPN/jhBj/c4Icb/HCDH27www33pQ73pQ5+uMEPN/BwAw838HADDzfwcAMPN/BwAw83+OEGP9xwX+rAww1+uMEPN/jh5phz7ksdeLjBDzf44QY/3OCHG/xwAw838HADDzf44QY/3OCHm2POuS914OEGP9zghxv8cIMfbvDDDTzcwMMNPNzghxv8cIMfbo45577UgYcb/HCDH27www1+uMEPN/BwAw838HCDH27www1+uDnmHD/cwMPN8X2OH26OOee+1OG+1IGHG3i4gYeb4xzuOG8/5vyYc+5LHXi4Of4+P+b8mHPuSx3uSx14uIGHG3i4Oc7hjvP2Y86POee+1IGHm+Pv82POjznnvtThvtSBh1t4uIWH23+/7/P99/s+33+/Od9/vzlf7ktdeLj99/s+33//yPjI+Mj4zfnCwy083MLD7b+PjN95++KHW/xwix9u4eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbv8le5XsVZKRZCQZSUaSUexV8RzFcxTPUWQUn0exV8VeFXtVZDQZTUaT0WQ0e9U8R/MczXM0Gc3nMezVsFfDXg0ZQ8aQMWQMGcNeDc+xPMfyHEvG8nkse7Xs1bJXS8aSsWQ8Mh4Zj716PMfjOR7P8ch4fB6PvXrs1bFXR8aRcWQcGUfGsVfHcxzPwZzjh1v8cIsfbj/m/GPO4eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbj/m/GPO4eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbj/mnPtSFx5u8cMtfrjFD7f44RY/3MLDLTzcwsMtfrjFD7f44fZjzrkvdeHhFj/c4odb/HCLH27xwy083MLDLTzc4odb/HCLH24/5pz7UhcebvHDLX64xQ+3+OEWP9zCwy083MLDLX64xQ+3+OH2Y865L3Xh4RY/3OKHW/xwix9u8cMtPNzCwy083OKHW/xwix9uP+ac+1IXHm7xwy1+uMUPt/jhFj/cwsMtPNzCwy1+uMUPt/jhNphz7ktdeLiFh1t4uIWHW/xwCw+38Y+MjwzmHB5u4eEWHm7/eLj73+q/c4b94+H+Wz1W91v9OJmNHyez8eNkNn6czMaPk9n4cTIbQUaQEWQEGUlGkpFkJBlJRpKRZCQZSUaSUWQUGUVGkVFkFBlFRpFRZBQZzefRfObNZ86cw8MtPNzCwy083HJf6nJf6sLDLX64xQ+3+OEWP9zCwy083MLDLX64xQ+3+OE2mHPuS114uMUPt/jhFj/c4odb/HALD7fwcAsPt/jhFj/c4ofbYM65L3Xh4RY/3OKHW/xwix9u8cMtPNzCwy083OKHW/xwix9ugznnvtSFh1v8cIsfbvHDLX64xQ+38HDLfanLfakLD7f44RYebuHhFh5u4eEWHm7h4RYebvHDLX64xQ+33Je63Je6+OEWP9zih9v8/a623Je6+OEWP9zih1v8cIsfbvHDLX645b7U5b7UxQ+3+OEWP9xmsVd8n+OHW/xwix9u8cMtfrjFD7f44Zb7Upf7Uhc/3OKHW3i4hYdbeLiFh1t4uIWHW3i4hYdb/HCLH265L3Xh4RY/3OKHW/xwm8w596UuPNzih1v8cIsfbvHDLX64hYdbeLiFh1v8cIsfbvHDbTLn3Je68HCLH27xwy1+uMUPt/jhFh5u4eEWHm7xwy1+uMUPt8mcc1/qwsMtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3BZzjh9u4eG2+D7HD7fFnHNf6nJf6sLDLTzcwsNtBRm/8/Yt5ryYc+5LXXi4Lf4+L+a8mHPuS13uS114uIWHW3i4rSTjd96+xZwXc859qQsPt8Xf58WcF3POfanLfakLD7fwcAsPt8X3efF9Xsx5Mefcl7rwcFt8nxdzXsw596Uu96UuPNzCwy083NaQMXwezDl+uMUPt/Bwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7fFnHNf6sLDLX64xQ+3+OEWP9zih1t4uIWHW3i4xQ+3+OEWP9wWc859qQsPt/jhFj/c4odb/HCLH27h4RYebuHhFj/c4odb/HDbzDn3pS483OKHW/xwix9u8cMtfriFh1t4uIWHW/xwix9u8cNtM+fNnMPDLX64xQ+3+OEWP9zih1t4uIWHW3i4xQ+3+OEWP9w2c97MOTzc4odb/HCLH27xwy1+uIWHW3i4hYdb/HCLH27xw20z582cw8MtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3DZz3sw5PNzih1v8cIsfbvHDLX64hYdbeLiFh1v8cIsfbvHDbTPn3Je68HCLH27xwy1+uMUPt/jhFh5u4eEWHm7xwy1+uMUPt82cc1/qwsMtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3A5zzn2pCw+3+OEWP9zih1v8cIsfbuHhFh5u4eEWP9zih1v8cDvMOfelLjzc4odb/HCLH27xwy1+uIWHW3i4hYdb/HCLH27xw+0w59yXuvBwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7fDnHNf6sLDLTzcwsMtPNzih1t4uB3O4fDDLTzcwsMtPNzCw+0fD3f/W/3OGf54uP9Ww2pZPVa/c4b5cTI7P05m58fJ7Pw4mZ0lY8lYMpaMJWPJeGQ8Mh4Zj4xHxiPjkfHIeGQ8Mo6MI+PIODKOjCPjyDgyeG8f/j7HD7fwcAsPt/BwCw+38HDLfanLfakLD7f44RY/3OKHW/xwCw+38HALD7f44RY/3OKH22XOuS914eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbpc5577UhYdb/HCLH27xwy1+uMUPt/BwCw+38HCLH27xwy1+uF3mnPtSFx5u8cMtfrjFD7f44RY/3MLDLfelLvelLjzc4odbeLiFh1t4uIWHW3i4hYdbeLjFD7f44RY/3HJf6nJf6uKHW/xwix9ul9/VuC918cMtfrjFD7f44RY/3OKHW/xwy32py32pix9u8cMtfrhdflfjvtTFD7f44RY/3OKHW/xwix9u8cMt96Uu96UufrjFD7fwcAsPt/BwCw+38HALD7fwcAsPt/jhFj/ccl/qwsMtfrjFD7f44fYx59yXuvBwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7ePOee+1IWHW/xwix9u8cMtfrjFD7fwcAsPt/Bwix9u8cMtfrh9zDn3pS483OKHW/xwix9u8cMtfriFh1t4uIWHW/xwix9u8cPtY87xwy083D6+z/HD7WPOuS91uS914eEWHm7h4fZxDvc4b3/M+WPOuS914eH28ff5Y84fc859qct9qQsPt/BwCw+3j3O4x3n7Y84fc859qQsPt4+/zx9z/phz7ktd7ktdeLiFh1t4uH18nz++z485P+ac+1IXHm6P7/Njzo85577U5b7UhYdbeLiFh9vjHO44b8cPt/jhFj/cwsMtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3B5zzn2pCw+3+OEWP9zih1v8cIsfbuHhFh5u4eEWP9zih1v8cHvMOfelLjzc4odb/HCLH27xwy1+uIWHW3i4hYdb/HCLH27xw+0x59yXuvBwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7fHnB9zDg+3+OEWP9zih1v8cIsfbuHhFh5u4eEWP9zih1v8cHvM+THn8HCLH27xwy1+uMUPt/jhFh5u4eEWHm7xwy1+uMUPt/eb8/fvN+cPHu7hh3v44R5+uIcf7uGHe/BwDx7uwcM9/HAPP9zDD/f+/eb8/fvN+YOHe/jhHn64hx/u4Yd7+OEePNyDh3vwcA8/3MMP9/DDvX+/OX/cl/rg4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cO9fsVfFXhUZRUaRUWQUGcVeFc/RPEfzHE1G83k0e9XsVbNXTUaT0WQMGUPGsFfDcwzPMTzHkDF8HsNeDXu17NWSsWQsGUvGkrHs1fIcy3Msz/HIeHwej7167NVjrx4Zj4xHxiPjkXHs1fEcx3Mcz3FkHJ/HsVfHXh179Xtvf/BwDx7uwcM9/HAPHu59v3O4hx/uwcM9eLgHD/fg4d4fD3f/W/13zvD+eLj/VsWqWQ2rZfVY3W/142Te9+Nk3hdkBBlBRpARZAQZQUaQkWQkGUlGkpFkJBlJRpKRZCQZRUaRUWQUGUVGkVF8Hr+/zx9+uAcP9+DhHjzcg4d78HCP+1If96U+eLiHH+7hh3v44R5+uAcP9+DhHjzcww/38MM9/HDvY865L/XBwz38cA8/3MMP9/DDPfxwDx7uwcM9eLiHH+7hh3v44d7HnHNf6oOHe/jhHn64hx/u4Yd7+OEePNyDh3vwcA8/3MMP9/DDvY85577UBw/38MM9/HAPP9zDD/fwwz14uMd9qY/7Uh883MMP9+DhHjzcg4d78HAPHu7Bwz14uIcf7uGHe/jhHvelPu5LffjhHn64hx/uxe93tcd9qQ8/3MMP9/DDPfxwDz/cww/38MM97kt93Jf68MM9/HAPP9yLZK/4PscP9/DDPfxwDz/cww/38MM9/HCP+1If96U+/HAPP9yDh3vwcA8e7sHDPXi4Bw/34OEePNzDD/fwwz3uS33wcA8/3MMP9/DDvWDOuS/1wcM9/HAPP9zDD/fwwz38cA8e7sHDPXi4hx/u4Yd7+OFeMOfcl/rg4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cC+Yc+5LffBwDz/cww/38MM9/HAPP9yDh3vwcA8e7uGHe/jhHn64l8w5frgHD/eS73P8cC+Zc+5LfdyX+uDhHjzcg4d7+ZHxO29/yZwnc859qQ8e7mWQwZwnc859qY/7Uh883IOHe/BwL5OM33n7S+Y8mXPuS33wcC+TDOY8mXPuS33cl/rg4R483IOHe8n3efJ9nsx5Mufcl/rg4V7yfZ7MeTLn3Jf6uC/1wcM9eLgHD/dyyBg+D+YcP9zDD/fg4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cC+Zc+5LffBwDz/cww/38MM9/HAPP9yDh3vwcA8e7uGHe/jhHn64l8w596U+eLiHH+7hh3v44R5+uIcf7sHDPXi4Bw/38MM9/HAPP9wr5pz7Uh883MMP9/DDPfxwDz/cww/34OEePNyDh3v44R5+uIcf7hVzXsw5PNzDD/fwwz38cA8/3MMP9+DhHjzcg4d7+OEefriHH+4Vc17MOTzcww/38MM9/HAPP9zDD/fg4R483IOHe/jhHn64hx/uFXNezDk83MMP9/DDPfxwDz/cww/34OEePNyDh3v44R5+uIcf7hVzXsw5PNzDD/fwwz38cA8/3MMP9+DhHjzcg4d7+OEefriHH+4Vc859qQ8e7uGHe/jhHn64hx/u4Yd78HAPHu7Bwz38cA8/3MMP94o5577UBw/38MM9/HAPP9zDD/fwwz14uAcP9+DhHn64hx/u4Yd7zZxzX+qDh3v44R5+uIcf7uGHe/jhHjzcg4d78HAPP9zDD/fww71mzrkv9cHDPfxwDz/cww/38MM9/HAPHu7Bwz14uIcf7uGHe/jhXjPn3Jf64OEefriHH+7hh3v44R5+uAcP9+DhHjzcww/38MM9/HCvmXPuS33wcA8e7sHDPXi4hx/uwcO95hwOP9yDh3vwcA8e7sHDvT8e7u/85Y+Hq/+tPlbBKlkVq2Y1rJbVY/U7y+glY8lYMpaMJWPJWDKWjCVjyXhkPDIeGY+MR8Yj45HxyHhkPDKOjCPjyDgyeG9v/j7HD/fg4R483IOHe/BwDx7ucV/q477UBw/38MM9/HAPP9zDD/fg4R483IOHe/jhHn64hx/uDXPOfakPHu7hh3v44R5+uIcf7uGHe/BwDx7uwcM9/HAPP9zDD/eGOee+1AcP9/DDPfxwDz/cww/38MM9eLgHD/fg4R5+uIcf7uGHe8Occ1/qg4d7+OEefriHH+7hh3v44R483OO+1Md9qQ8e7uGHe/BwDx7uwcM9eLgHD/fg4R483MMP9/DDPfxwj/tSH/elPvxwDz/cww/3Ztkrvs/xwz38cA8/3MMP9/DDPfxwDz/c477Ux32pDz/cww/38MO9eewV3+f44R5+uIcf7uGHe/jhHn64hx/ucV/q477Uhx/u4Yd78HAPHu7Bwz14uAcP9+DhHjzcg4d7+OEefrjHfakPHu7hh3v44R5+uLfMOfelPni4hx/u4Yd7+OEefriHH+7Bwz14uAcP9/DDPfxwDz/cW+ac+1IfPNzDD/fwwz38cA8/3MMP9+DhHjzcg4d7+OEefriHH+4tc859qQ8e7uGHe/jhHn64hx/u4Yd78HAPHu7Bwz38cA8/3MMP95Y5xw/34OHe8n2OH+4tc859qY/7Uh883IOHe/BwbzmHW87blzlf5pz7Uh883Fv+Pl/mfJlz7kt93Jf64OEePNyDh3vLOdxy3r7M+TLn3Jf64OHe8vf5MufLnHNf6uO+1AcP9+DhHjzcW77Pl+/zZc6XOee+1AcP9x7f5485f8w596U+7kt98HAPHu7Bw73HOdzjvB0/3MMP9/DDPXi4hx/u4Yd7+OEefriHH+7Bwz14uAcP9/DDPfxwDz/ce8w596U+eLiHH+7hh3v44R5+uIcf7sHDPXi4Bw/38MM9/HAPP9x7zDn3pT54uIcf7uGHe/jhHn64hx/uwcM9eLgHD/fwwz38cA8/3HvMOfelPni4hx/u4Yd7+OEefriHH+7Bwz14uAcP9/DDPfxwDz/ce8z5Y87h4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cO8x5485h4d7+OEefriHH+7hh3v44R483IOHe/BwDz/cww/38MO9x5w/5hwe7uGHe/jhHn64hx/u4Yd78HAPHu7Bwz38cA8/3MMP9445P+YcHu7hh3v44R5+uIcf7uGHe/BwDx7uwcM9/HAPP9zDD/eOOee+1AcP9/DDPfxwDz/cww/38MM9eLgHD/fg4R5+uIcf7uGHe8ecc1/qg4d7+OEefriHH+7hh3v44R483IOHe/BwDz/cww/38MO9Y865L/XBwz38cA8/3MMP9/DDPfxwDx7uwcM9eLiHH+7hh3v44d4x59yX+uDhHn64hx/u4Yd7+OEefrgHD/fg4R483MMP9/DDPfxw75hz7kt98HAPP9zDD/fwwz38cA8/3IOHe/BwDx7u4Yd7+OEefrh3zDn3pT54uAcP9+DhHjzcww938HD373cOd/jhDh7u4OEOHu7g4e6Ph7v/rf47Z7g/Hu5/q+8fq49VsEpWxapZDatlRcZHRpARZAQZQUaQEWQEGUFGkBFkJBlJRpKRZCQZSUaSkWQkGUlGkVFkFJ/H7+/zww938HAHD3fwcAcPd/Bwx32px32pBw93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7t/w3MMzzFkDBlDxpAxZPzm/ODhDh7u4OEOP9zhhzv8cPfvN+fHfakHD3f44Q4/3OGHO/xwhx/u4OEOHu7g4Q4/3OGHO/xw9+/Yq2Ovjowj48g4Mo6MY6+Yc+5LPe5LPXi4ww938HAHD3fwcAcPd/BwBw938HCHH+7wwx1+uOO+1OO+1MMPd/jhDj/cfb/f1Y77Ug8/3OGHO/xwhx/u8MMdfrjDD3fcl3rcl3r44Q4/3OGHuy/Zq2SvkowkI8lIMpKMYq+K5yieo3gO5hw/3MHDHTzcwcMdPNzBwx083MHDHTzc4Yc7/HDHfakHD3f44Q4/3OGHu485577Ug4c7/HCHH+7wwx1+uMMPd/BwBw938HCHH+7wwx1+uPuYc+5LPXi4ww93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7uPOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrgL5hw/3MHDXfB9jh/ugjnnvtTjvtSDhzt4uIOHu/jI+J23XzDnwZxzX+rBw10EGcx5MOfcl3rcl3rwcAcPd/BwF0HG77z9gjkP5pz7Ug8e7iLJYM6DOee+1OO+1IOHO3i4g4e74Ps8+D4P5jyYc+5LPXi4C77PgzkP5pz7Uo/7Ug8e7uDhDh7uosloPg/mHD/c4Yc7eLjDD3f44Q4/3OGHO/xwBw938HAHD3f44Q4/3OGHu2DOuS/14OEOP9zhhzv8cIcf7vDDHTzcwcMdPNzhhzv8cIcf7oI5577Ug4c7/HCHH+7wwx1+uMMPd/BwBw938HCHH+7wwx1+uEvmnPtSDx7u8MMdfrjDD3f44Q4/3MHDHTzcwcMdfrjDD3f44S6Z82TO4eEOP9zhhzv8cIcf7vDDHTzcwcMdPNzhhzv8cIcf7pI5T+YcHu7wwx1+uMMPd/jhDj/cwcMdPNzBwx1+uMMPd/jhLpnzZM7h4Q4/3OGHO/xwhx/u8MMdPNzBwx083OGHO/xwhx/ukjlP5hwe7vDDHX64ww93+OEOP9zBwx083MHDHX64ww93+OEumXPuSz14uMMPd/jhDj/c4Yc7/HAHD3fwcAcPd/jhDj/c4Ye7ZM65L/Xg4Q4/3OGHO/xwhx/u8MMdPNzBwx083OGHO/xwhx/ukjnnvtSDhzv8cIcf7vDDHX64ww938HAHD3fwcIcf7vDDHX64K+ac+1IPHu7wwx1+uMMPd/jhDj/cwcMdPNzBwx1+uMMPd/jhrphz7ks9eLjDD3f44Q4/3OGHO/xwBw938HAHD3f44Q4/3OGHu2LOuS/14OEOHu7g4Q4e7vDDHTzcVZHB3+fwcAcPd/BwBw93fzzc/W/1O2f44+H+Wz1Wv3OG+nEyVz9O5urHyVz9OJmrHydz9eNkroaMIWPIGDKWjCVjyVgylowlY8lYMpaMJeOR8ch4ZDwyHhmPjEfGI+OR8cjgvb34+xw/3MHDHTzcwcMdPNzBwx33pR73pR483OGHO/xwhx/u8MMdPNzBwx083OGHO/xwhx/umjnnvtSDhzv8cIcf7vDDHX64ww938HAHD3fwcIcf7vDDHX64a+ac+1IPHu7wwx1+uMMPd/jhDj/cwcMdPNzBwx1+uMMPd/jhrplz7ks9eLjDD3f44Q4/3OGHO/xwBw933Jd63Jd68HCHH+7g4Q4e7uDhDh7u4OEOHu7g4Q4/3OGHO/xwx32px32phx/u8MMdfrjrYa/4PscPd/jhDj/c4Yc7/HCHH+7wwx33pR73pR5+uMMPd/jhrh97xfc5frjDD3f44Q4/3OGHO/xwhx/uuC/1uC/18MMdfriDhzt4uIOHO3i4g4c7eLiDhzt4uMMPd/jhjvtSDx7u8MMdfrjDD3fDnHNf6sHDHX64ww93+OEOP9zhhzt4uIOHO3i4ww93+OEOP9wNc859qQcPd/jhDj/c4Yc7/HCHH+7g4Q4e7uDhDj/c4Yc7/HA3zDn3pR483OGHO/xwhx/u8MMdfriDhzt4uIOHO/xwhx/u8MPdMOf44Q4e7obvc/xwN8w596Ue96UePNzBwx083A3ncMN5+zDnw5xzX+rBw93w9/kw58Occ1/qcV/qwcMdPNzBw91wDjectw9zPsw596UePNwNf58Pcz7MOfelHvelHjzcwcMdPNwN3+fD9/kw58Occ1/qwcPd8H0+zPkw59yXetyXevBwBw938HC3nMMt5+344Q4/3OGHO3i4ww93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7tlzrkv9eDhDj/c4Yc7/HCHH+7wwx083MHDHTzc4Yc7/HCHH+6WOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrhb5pz7Ug8e7vDDHX64ww93+OEOP9zBwx083MHDHX64ww93+OFumfNlzuHhDj/c4Yc7/HCHH+7wwx083MHDHTzc4Yc7/HCHH+6WOV/mHB7u8MMdfrjDD3f44Q4/3MHDHTzcwcMdfrjDD3f44W6Z82XO4eEOP9zhhzv8cIcf7vDDHTzcwcMdPNzhhzv8cIcf7h5z/phzeLjDD3f44Q4/3OGHO/xwBw938HAHD3f44Q4/3OGHu8ecc1/qwcMdfrjDD3f44Q4/3OGHO3i4g4c7eLjDD3f44Q4/3D3mnPtSDx7u8MMdfrjDD3f44Q4/3MHDHTzcwcMdfrjDD3f44e4x59yXevBwhx/u8MMdfrjDD3f44Q4e7uDhDh7u8MMdfrjDD3ePOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrh7zDn3pR483OGHO/xwhx/u8MMdfriDhzt4uIOHO/xwhx/u8MPdY865L/Xg4Q4e7uDhDh7u8MMdPNw9zuHwwx083MHDHTzcwcPdHw93/1v9zhn+eLj/VsNqWT1Wv3OGg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4GXi4O/4+xw938HAHD3fwcAcPd/Bwx32px32pBw93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7tjzrkv9eDhDj/c4Yc7/HCHH+7wwx083MHDHTzc4Yc7/HCHH+6OOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrg75pz7Ug8e7vDDHX64ww93+OEOP9zBwx33pR73pR483P38cN+/fz8g7m/5uQyX/8v5W5bLdjku1+VzeSz/+2r/W34uTfvv9P1vWS7b5bg07TPtMy1MC9P++5r/W/ps4bOFzxam/XcW/7d8Lt3JdCfTtDQtTUvT0rR0J9NnS58tfbYyrfzcyp0sd7LcyTKtTCvTyrQyrd3J9tnaZ2ufrU1rP7d2J9udbHeyTRvTxrQxbUwbd3J8tvHZxmcb08bPbd3JdSfXnVzT1rQ1bU1b09adXJ/t+WzPZ3umPT+3504+d/K5k8+0Z9oz7Uw7086dPJ/tfLbz2c6083M7d9Iu+eySH3X3twyX6bJctstxuS6fS57t+0z7PpfhMl2WS9M+0+ySzy757JLPLvnsks8u+eySL0yLdjku1+VzaVqaZpd8dslnl3x2yWeXfHbJZ5d8aVr6udkln13y2SU/Pu9vaZpd8tkln13y2SWfXfLZJZ9d8rVp7edml3x2yWeX/Gi9v6Vpdslnl3x2yWeXfHbJZ5d8dslPY/e39HOzSz675LNLfuze39I0u+SzSz675LNLPrvks0s+u+Qntftb+rnZJZ9d8tklP5Lvb2maXfLZJZ9d8tkln13y2SWfXfJT3P0t/dzsks8u+eySH9f3/d9X9z+Xn8twmS7LZbscl+uStJ/x7v+WdknYJWGX/Ci/v6VpdknYJWGXhF0SdknYJWGX/PR3f8t0WS7b5bg0LUyzS8IuCbsk7JKwS8IuCbvkJ8P7W65Ld9IuCbvkRwD+LU2zS8IuCbsk7JKwS8IuCbvkp8b7W/q52SVhl4Rd8uMB/5am2SVhl4RdEnZJ2CVhl4Rd8hPl/S393OySsEvCLvnRgf+3XNPskrBLwi4JuyTskrBLwi75afP+ln5udknYJWGX/FjBv6VpdknYJWGXhF0SdknYJWGX/CR6f0s/N7sk7JKwS37k4N/SNLsk7ZK0S9IuSbsk7ZK0S35Kvb/lunwu2cm0S9K/cX5ivb+laXZJ2iVpl6RdknZJ2iU/wd7f8nMZLtNluTQtTLNL0i5JuyTtkrRL0i5Ju+Sn2/tbtkt30i5JuyT9GyftkvS9JH0vSbsk/Rsny7QyzS5JuyTtkvS95I83vP+W/zvI+Vumy3LZLsflunwuj+V/QNLf8nNp2pg2po1pY9qYNqaNaWvamramrWlr2pq2pq1pa9qa9kx7pj3TnmnPtGeaf+Pk83/J83+JXZJ2Sdol6XtJ+l6SdknaJWmXpF2SdknaJWWXlF1SdknZJT9p39+yXY7LdflcmuZ5SdklZZeUXVJ2SdklZZeUXfJT+P0taa6yS8ouKbuk/BunPC8pu6TskrJLyi4pu6TskrJLfkK/v2W6dCftkrJLyr9xyvOSskt+Yr+/pWm+l5RdUr6XlO8lZZf8/H5/S3ey3EnfS8q/ccrzkvK85Ic1/i1N872kfC8p30vK95Kf7O9v6ec27uS4k76XlH/jlOcl5XnJT/r3tzTN95LyvaR8LynfS37qv7+ln9u6k+tO+l5S/o1TnpeU5yU/BeDf0jTfS8r3kvK9pHwvKbvkZwL8v+W5k+dO+l5Sdkl5XlKel/wAyL+laXZJ2SVtl7Rd0p69/ryAf8ty2S7H5fovPJem2SVtl7Rd0nZJ2yVtl7Rnrz9L4N/yuWQn2y5p/8Zpz0vaLmm7pO2StkvaLmm7pO2S9uz15wz8W7qTdknbJe3fOO15SdslbZe0XdJ2SdslbZe0XdK+l7TvJW2XtF3Sdkn7XtK+l7Rd0nZJ2yVtl7Rd0nZJ2yXt2Wu3n5td0nZJ2yXt3zjteUnbJW2XtF3SdknbJW2XtF3Snr32+rnZJW2XtF3S/o3Tnpe0XdJ2SdslbZe0XdJ2Sdsl7XtJ+17SdknbJW2XtO8l7XtJ2yVtl7Rd0nZJ2yVtl7RdMp69jr/jjF0ydsnYJePfOON5ydglY5eMXTJ2ydglY5eMXTKevY6/44xdMnbJ2CXj3zjjecnYJWOXjF0ydsnYJWOXjF0ynr2Ov+OMXTJ2ydgl498443nJ2CVjl4xdMnbJ2CVjl4xdMv6NM/6OM3bJ2CVjl4x/44x/44xdMnbJ2CVjl4xdMnbJ2CXj2ev4O87YJWOXjF0ynpeM5yVjl4xdMnbJ2CVjl4xdMnbJePY6/o4zdsnYJWOXjOcl43nJ2CVjl4xdMnbJ2CVjl4xdMp69jr/jjF0ydsnYJePfOOPfOGOXjF0ydsnYJWOXjF0ydsl49jr+jrN2ydola5esf+Os5yVrl6xdsnbJ2iVrl6xdsnbJeva6/o6zdsnaJWuXrH/jrOcla5esXbJ2ydola5esXbJ2yXr2uv6Os3bJ2iVrl6x/46znJWuXrF2ydsnaJWuXrF2ydsl6XrKel6xdsnbJ2iXr3zjr2evaJWuXrF2ydsnaJWuXrF2ynr2uv+OsXbJ2ydol698469nr2iVrl6xdsnbJ2iVrl6xdsp69rr/jrF2ydsnaJevfOOvZ69ola5esXbJ2ydola5esXbKeva6/46xdsnbJ2iXr3zhrl6zvJet7ydol698469nrel6ydsnaJWuXrO8lf7zo/87P/oDR+m/5uQyX6bJctstxuS6fS06e3mfaZ9pn2mfaZ9pn2mfaZ9pn2mdamBamhWlhWpgWpoVpYVqYFqalaWlampam+TfO87zkeV7y7JJnlzy75Ple8nwveXbJs0ueXfLskmeXPLvk2SXPLnl2ybNLnr/jPH/HeXbJs0ueXfL8G+d5XvLskmeXPLvk2SXPLnl2ybNLnr/jPH/HeXbJs0ueXfL8G+d5XvLskmeXPLvk2SXPLnl2ybNLnr/jPH/HeXbJs0ueXfL8G+d5XvLskufvOM/3kud7ybNLnu8lz/eSZ5c8z16fZ6/P34Sf7yXPv3HO85LzvOQ8ez3fS873kvO95HwvOd9LzrPX83ec83ec8zfh873k/BvnPC85z0vOs9fzveR8LznfS873kvO95Dx7PX/HOX/HOX8TPt9Lzr9xzvOS87zkPHs930vO95LzveR8LznfS84uOX/HOX/HOX8TPt9Lzi45z0vO85Lz7PXskrNLzi45u+TskvPs9fxN+OySs0vOLjn/xjnPS84uObvk7JKzS84uObvk7JLz7PX8TfjskrNLzi45/8Y5z0vOLjm75OySs0vOLjm75OyS8+z1/E347JKzS84uOf/GOc9Lzi45u+TskrNLzi45u+TskvO95HwvObvk7JKzS873kvO95OiS7x9d8v2jS75/dMkn9/rJvX5yr98/zl6/f/yO8/2jS75/dMn3jy755F6/f59pn2mfaZ9pdMkn9/rJvX5yr9+/MI3fcb5/dMn3jy75/tEln9zr9y9MC9PCtDAt3cn02dJnS58tTeO95PuX7mS6k+lOpmllWplWppVp5U6Wz1Y+W/lsZVr5ubU72e5ku5NtWpvWprVpbVq7k+2zjc82PtuYNn5u406OOznu5Jg2po1pa9qatu7k+mzrs63Ptqatn9u6k+tOPnfymfZMe6Y9055pz518Ptvz2Z7Pdqadn9u5k+dOnjt5pp1pZ9qZZpd8donc6yf3+sm9fh9nr9/H7zjfZ5d8dslnl8i9ft9nml3y2SWfXfLZJXKvn9zrJ/f6fZ9p/I7zfXbJZ5d8donc6/eFaXbJZ5d8dslnl8i9fnKvn9zr96Vp/I7zfXbJZ5d8donc6/elaXbJZ5d8dslnl8i9fnKvn9zr95Vp5edml3x2yWeXyL1+X5tml3x2yWeXfHaJ3Osn9/rJvX7fmDZ+bnbJZ5d8donc6/eNaXbJZ5d8dslnl8i9fnKvn9zr961p6+dml3x2yWeXyL1+3zPNLvnsks8u+ewSuddP7vWTe/2+Z9rzc7NLPrvks0vkXr/vTLNLPrvks0s+u0Tu9ZN7/eRev+Ds9Qt+x/nCLgm7JOwSudcvOHv9wi4JuyTskrBL5F4/uddP7vWLzzR+x/nCLgm7JOwSudcvwjS7JOySsEvCLpF7/eReP7nXL9I0fsf5wi4JuyTsErnXT+71k3v95F6/sEvkXr8o08o0u0Tu9ZN7/eRevz/u9f5b/s6Cvj/u9b9l/3P5uQyX6bJctstxuS5Na9PGtDFtTBvTxrQxbUwb08a0MW1NW9PWtDVtTVvT1rQ1bU1b055pz7Tn5/b8X/L8X2KXyL1+cq+f3Osn9/qFXRJ2idzrF3ZJ2CVhl4RdIvf6yb1+cq9f8jvOl/yO86VdknZJ2iVyr19yXvKlXZJ2SdolaZfIvX5yr5/c65efafyO86VdknZJ2iVyr1+GaXZJ2iVpl6RdIvf6yb1+cq9fhmn8jvOlXZJ2Sdolcq9fpml2SaZpvpek7yVyr1/6XpK+l8i9fll+buVOljvpe4nc6yf3+sm9fnKvX/pekr6XpO8l6XtJ+l6SbVr7ubU72e6k7yXp3zg5po1pY5rvJel7Sfpekr6XpO8luaatn9u6k+tO+l6S/o2Ta9qatqb5XpK+l6TvJel7SfpeknZJPj+3504+d9L3ErnXT+71k3v95F4/udcv7ZK0S9IukXv98kzjN+Gv7JKyS8oukXv9yvOSskvKLim7pOwSuddP7vWTe/3qM43fhL+yS8ouKbtE7vUrz0vKLim7pOySskvkXj+510/u9aswjd+Ev7JLyi4pu0Tu9SvPS8ouKbuk7JKyS+ReP7nXT+71K99LyveSskvKLim7RO71K99Lyi4pu6TskrJL5F4/uddP7vWrNq393OySskvKLpF7/crzkrJLyi4pu6TsErnXT+71k3v9akwbPze7pOySskvkXr/yvKTskrJLyi4pu0Tu9ZN7/eRev/K9pHwvKbuk7JKyS+Rev/K9pOySskvKLim7RO71k3v95F6/OtPOz80uKbuk7RK51689L2m7pO2StkvaLpF7/eReP7nXrz17bX7H+douabuk7RK51689L2m7pO2StkvaLpF7/eReP7nXrz17bX7H+douabuk7RK51689L2m7pO2StkvaLpF7/eReP7nXr/0bp9PPzS5pu6TtErnXr/0bp+2StkvaLmm7RO71k3v95F6/9uy128/NLmm7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+51689e+3xc7NL2i5pu0Tu9WvPS9ouabuk7ZK2S+ReP7nXT+71a89e+/m52SVtl7RdIvf6tX/jtF3SdknbJW2XyL1+cq+f3OvXnr32+bnZJW2XtF0i9/qN5yVjl4xdMnbJ2CVyr5/c6yf3+o1nr+PvOGOXjF0ydonc6zeel4xdMnbJ2CVjl8i9fnKvn9zrN569jr/jjF0ydsnYJXKv33heMnbJ2CVjl4xdIvf6yb1+cq/feF4ynpeMXTJ2ydglcq/fePY6dsnYJWOXjF0i9/rJvX5yr9949jr+jjN2ydglY5fIvX7j2evYJWOXjF0ydonc6yf3+sm9fuPZ6/g7ztglY5eMXSL3+o1nr2OXjF0ydsnYJXKvn9zrJ/f6jWev4+84Y5eMXTJ2idzrJ/f6yb1+cq/f2CVyr9949jqel8i9fnKvn9zrJ/f6/XGv99+Ss6A/7vW3fC45C1pYtW9h1b6FVfsWVu1bWLVvYdW+hVX7FlbtW1i1b/+Z9pn2mfaZ9pn2mfaZ9pn2mfaZ9pkWpoVpYVqYFqaFaWFamBamhWn+jbOel6znJXKvn9zrJ/f6yb1+cq/f2iVrl8i9fmuXrF2ydsnaJXKvn9zrJ/f6rb/jrL/jrF2ydsnaJXKv33pesnbJ2iVrl6xdIvf6yb1+cq/f+jvO+jvO2iVrl6xdIvf6recla5esXbJ2ydolcq+f3Osn9/qtv+Osv+OsXbJ2ydolcq/fel6ydsn6O876XrK+l8i9fut7yfpeIvf6rWevcq+f3Osn9/rJvX5yr5/c6yf3+q3vJc/3kud7yfO95Ple8jx7ff6O8/wd5/mb8PO95Pk3zvO85Hle8jx7fb6XPN9Lnu8lz/eS53vJ8+z1+TvO83ec52/Cz/eS5984z/OS53nJ8+z1+V7yfC95vpc830ue7yXPLnn+jiP3+sm9fnKvn9zrJ/f6yb1+cq+f3Ov37JJnlzy7RO71e569Pn8TfnbJs0ueXSL3+j3PS55d8uySZ5c8u0Tu9ZN7/eRev+fZ6/M34WeXPLvk2SVyr9/zvOTZJc8ueXbJs0vkXj+510/u9XuevT5/E352ybNLnl0i9/o9z0ueXfLskmeXPLtE7vWTe/3kXr/ne8nzveTZJc8ueXaJ3Ov3fC95dsmzS55d8uwSuddP7vWTe/3Os9fzd5yzS84uObtE7vU7z0vOLjm75OySs0vkXj+510/u9TvPXs/fcc4uObvk7BK51+88Lzm75OySs0vOLpF7/eReP7nX73wvOd9Lzi45u+TsErnX73wvObvk7JKzS84ukXv95F4/udfvPHs9f8c5u+TskrNL5F6/87zk7JKzS84uObtE7vWTe/3kXr/z7PX8HefskrNLzi6Re/3O85KzS84uObvk7BK510/u9ZN7/c6z1/N3nLNLzi45u0Tu9TvPS84uObvk7JKzS+ReP7nXT+71O//GOX/HObvk7JKzS+Rev/NvnLNLzi45u+TsErnXT+71k3sNfa+h7zX0vcY/uiT+0SUh9xr6XkPfa+h7DX2voe815F5D7jXkXkPfa+h7DX2v8Y8uiX90Sci9hr7X0Pca+l5D32voew2515B7DbnX0Pca+l5D32v8S3cy3ck0LU1L09K0NC3dyfTZymcrn61MKz+3cifLnSx3skwr08q0Nq1Na3eyfbb22dpna9Paz63dyXYnx50c08a0MW1MG9PGnRyfbXy28dnWtPVzW3dy3cl1J9e0NW1NW9PWtOdOPp/t+WzPZ3umPT+3504+d/K5k8+0M+1MO9POtHMnz2c7n+18tjON33His0s+u+SzS+ReQ99r6HsNfa+h7zX0vYbca8i9htxr6HsNfa+h7zU+u+SzS+ReQ99r6HsNfa+h7zX0vYbca8i9htxr6HsNfa+h7zU+u+SzS+ReQ+415F5D7jX0vYbca3xpWppml8i9htxryL3GH/d6/y1/Z0Hxx73+luNyXT6XxxJWLT5Ytfhg1eKDVYuvTWvT2rQ2rU1r08a0MW1MG9PGtDFtTBvTxrQxbU1b09a0NW1NW9PWtDVt/dzW/yXP/yV2idxryL2G3GvIvcZnl3x2idxr6HsNfa+h7zX0vYbca8i9htxr6HsNfa+h7zU+uyTsErnX0Pca+l5D32voew19ryH3GnKvIfca+l5D32voe42wS8IukXsNfa+h7zX0vYa+19D3GnKvIfcacq+h7zX0vYa+1wi7JOwSudfQ9xr6XkPfa+h7DX2vIfca4XtJ+F4i9xr6XkPuNeReQ+415F5D7jXkXkPuNfS9hr7X0Pca4XtJ+F6i7zX0vYa+14h2J30v0fca+l5D32voew19r6HvNfS9RvheEr6X6HsNfa+h7zVi3EnfS/S9hr7X0Pca+l5D32voew19rxG+l4TvJfpeQ99ryL2G3GvIvYbca8i9htxryL2G3Gvoew19rxF2idxr6HsNfa+h7zXCLgm7RO419L2GvtfQ9xr6XkPfa8i9htxryL2GvtfQ9xr6XiPtkrRL5F5D32voew19r6HvNfS9htxryL2G3Gvoew19r6HvNdIuSbtE7jX0vYa+19D3GvpeQ99ryL2G3GvIvYa+19D3GvpeI+0Sfa8h9xrpe4m+10i7JO2StEvkXkPuNeReI9u09nOzS9IuSbtE7jWyTbNL0i5JuyTtErnXkHsNudfIMW383OyStEvSLpF7jVzT7JK0S9IuSbtE7jXkXkPuNdL3kvS9JO2StEvSLpF7jfS9JO2StEvSLkm7RO415F5D7jXyTDs/N7tE32voew2519D3GvpeQ99r6HsNfa8h9xpyryH3GvpeQ99r6HuNskvKLpF7DX2voe819L2GvtfQ9xpyryH3GnKvoe819L2Gvtcou6TsErnX0Pca+l5D32voew19ryH3GnKvIfca+l5D32voe42yS8oukXsNfa+h7zX0vYa+19D3GnKvIfcacq+h7zX0vYa+1yi7pOwSudfQ9xr6XkPfa+h7DX2vIfcacq8h9xr6XkPfa+h7jbJLyi6Rew19r6HvNfS9hr7X0Pcacq8h9xpyr6HvNfS9hr7XKLuk7BK519D3GvpeQ99r6HsNfa8h9xpyryH3GvpeQ99r6HuNskvKLpF7DX2voe819L2GvtfQ9xpyryH3GnKvoe819L2Gvtdou6TtErnX0Pca+l5D32voew19ryH3GnKvIfca+l5D32voe422S9oukXsNfa+h7zX0vYa+19D3GnKvIfcacq+h7zX0vYa+12i7pO0SudfQ9xr6XkPfa+h7DX2vIfcacq8h9xr6XkPfa+h7jbZL2i6Rew19r6HvNfS9hr7X0Pcacq8h9xpyr6HvNfS9hr7XaLuk7RK519D3GvpeQ99r6HsNfa8h9xpyryH3GvpeQ99r6HuNtkvaLpF7DbnXkHsNudfQ9xpyr9Gevep7DbnXkHsNudeQe40/7vX+W3IW9Me9/pblsl2Oy3X5XHLyNLBqMbBqMbBqMbBqMbBqMbBqMbBqMbBqMbBqMf9M+0z7TPtM+0z7TPtM+0z7TPtM+0wL08K0MC1MC9PCNP/GGc9L9L2G3GvIvYbca8i9htxrjF0ydonca+h7DX2voe819L2G3GvIvYbca+h7DX2voe81xi4Zu0TuNfS9hr7X0Pca+l5D32vIvYbca8i9hr7X0Pca+l5j7JKxS+ReQ99r6HsNfa+h7zX0vYbca8i9htxr6HsNfa+h7zXGLhm7RO419L2GvtfQ9xr6XkPfa8i9xvheMr6XyL2GvteQew2515B7DbnXkHsNudeQew19r6HvNfS9xvheMr6X6HsNfa+h7zXW34TX9xJ9r6HvNfS9hr7X0Pca+l5D32us7yXre4m+19D3GvpeY/1NeH0v0fca+l5D32voew19r6HvNfS9xvpesr6X6HsNfa8h9xpyryH3GnKvIfcacq8h9xpyr6HvNfS9xtolcq+h7zX0vYa+11i7ZO0SudfQ9xr6XkPfa+h7DX2vIfcacq8h9xr6XkPfa+h7jbVL1i6Rew19r6HvNfS9hr7X0Pcacq8h9xpyr6HvNfS9hr7XWLtk7RK519D3GvpeQ99r6HsNfa8h9xpyryH3GvpeQ99r6HuNtUv0vYbca6zvJfpeY+2StUvWLpF7DbnXkHuN9ex1/R3n2SXPLnl2idxrPM9Lnl3y7JJnlzy7RO415F5D7jWeZ6/P33GeXfLskmeXyL3G87zk2SXPLnl2ybNL5F5D7jXkXuP5XvJ8L3l2ybNLnl0i9xrP95Jnlzy75Nklzy6Rew2515B7jefZ6/N3HH2voe819L2G3Gvoew19r6HvNfS9hr7XkHsNudeQew19r6HvNfS9xrNLnl0i9xr6XkPfa+h7DX2voe815F5D7jXkXkPfa+h7DX2v8eySZ5fIvYa+19D3GvpeQ99r6HsNudeQew2519D3GvpeQ99rPLvk2SVyr6HvNfS9hr7X0Pca+l5D7jXkXkPuNfS9hr7X0Pcazy45u0TuNfS9hr7X0Pca+l5D32vIvYbca8i9hr7X0Pca+l7j7JKzS+ReQ99r6HsNfa+h7zX0vYbca8i9htxr6HsNfa+h7zXOLjm7RO419L2GvtfQ9xr6XkPfa8i9htxryL2GvtfQ9xr6XuPskrNL5F5D32voew19r6HvNfS9htxryL2G3Gvoew19r6HvNc4uObtE7jX0vYa+19D3GvpeQ99ryL2G3GvIvYa+19D3Gvpe4+ySs0vkXkPfa+h7DX2voe819L2G3GvIvYbca+h7DX2voe81zi45u0TuNfS9hr7X0Pca+l5D32vIvYbca8i9hr7X0Pca+l7j7JKzS+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zX/0SX5jy5JudfU95r6XlPfa+p7TX2vKfeacq8p95r6XlPfa+p7zX90Sf6jS1LuNeVeU+415V5T32vKvea/NC1NS58tfbY0LX22/+uS+9+yfmdB+ce9/pbhMl2Wy3Y5Ltflc3ks27Q2rU1r09q0Nq1Na9PatDZtTBvTxrQxbUwb08a0MW1MG9PWtDVtTVvT1s9t/V+y/i9ZP7f1c1v/Tz7/Tz7/lzz/lzz/lzzTnv9Lnv9LnmnPtGfamXamnWln2pl2Ptv5bGfamWaX6HvNzy757BK515R7TbnX1Pea+l5T32t+dslnl8i9pr7X1Pea+l5T32vqe02515R7TbnX1Pea+l5T32t+dslnl8i9pr7X1Pea+l5T32vqe0251/zSZ0ufzS7R95pyryn3mnKvKfeacq8p95pyr6nvNfW9pr7X/MpnK5+tTCs/t3Yn251sd7JNa9PatDatTWt3sn228dnGZxvTxs9t3MlxJ8edHNPGtDFtTVvT1p1cn219tvXZ7BJ9ryn3mnKvKfeacq8p95pyryn3mnKvqe819b3mZ5fIvaa+19T3mvpe87NLPrtE7jX1vaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpeM+ySsEvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe81wy4Ju0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l4z7BJ9ryn3muF7ib7XDLsk7JKwS+ReU+415V4zyrTyc7NLwi4Ju0TuNaNNs0vCLgm7JOwSudeUe02514wxbfzc7JKwS8IukXvNGNPskrBLwi4Ju0TuNeVeU+41w/eS8L0k7JKwS8IukXvN8L0k7JKwS8IuCbtE7jXlXlPuNeOZ9vzc7BJ9r6nvNeVeU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXTLkm7RO419b2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XjPtkrRL5F5T32vqe019r6nvNfW9ptxryr2m3Gvqe019r6nvNdMuSbtE7jX1vaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpeM+2StEvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe810y5Ju0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l4z7ZK0S+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXTLkm7RO419b2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XrPskrJL5F5T32vqe019r6nvNfW9ptxryr2m3Gvqe019r6nvNcsuKbtE7jX1vaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpes+ySskvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe81yy4pu0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7JKyS+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXLLim7RO415V5T7jXlXlPfa8q9Zj3TPC+Re02515R7TbnX/ONe778lZ0F/3Ot/y/vn8nMZLtNluWyX43Jdmgarlg2rlg2rlg2rlg2rlg2rlg2rlg2rlg2rlg2rlv3PtM+0z7TPtM+0z7TPtM+0z7TPtM+0MC1M82+c9rxE32vKvabca8q9ptxryr1m2yVtl8i9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7ZK2S+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXbLmm7RO419b2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XrPtkrZL5F5T32vqe019r6nvNfW9ptxrtu8l7XuJ3Gvqe02515R7TbnXlHtNudeUe02519T3mvpeU99rtu8l7XuJvtfU95r6XrP5TTjH9xJ9r6nvNfW9pr7X1Pea+l5T32uO7yXje4m+19T3mvpec/hNOMf3En2vqe819b2mvtfU95r6XlPfa47vJeN7ib7X1Peacq8p95pyryn3mnKvKfeacq8p95r6XlPfa45dIvea+l5T32vqe82xS8YukXtNfa+p7zX1vaa+19T3mnKvKfeacq+p7zX1vaa+1xy7ZOwSudfU95r6XlPfa+p7TX2vKfeacq8p95r6XlPfa+p7zbFLxi6Re019r6nvNfW9pr7X1Peacq8p95pyr6nvNfW9pr7XHLtE32vKveb4XqLvNccuGbtk7BK515R7TbnXHM9ex99xxi4Zu2TsErnXXM9L1i5Zu2TtkrVL5F5T7jXlXnM9e11/x1m7ZO2StUvkXnM9L1m7ZO2StUvWLpF7TbnXlHvN9b1kfS9Zu2TtkrVL5F5zfS9Zu2TtkrVL1i6Re02515R7zfXsdf0dR99r6ntNfa8p95r6XlPfa+p7TX2vqe815V5T7jXlXlPfa+p7TX2vuXbJ2iVyr6nvNfW9pr7X1Pea+l5T7jXlXlPuNfW9pr7X1Peaa5esXSL3mvpeU99r6ntNfa+p7zXlXlPuNeVeU99r6ntNfa+5dsnaJXKvqe819b2mvtfU95r6XlPuNeVeU+419b2mvtfU95prl6xdIvea+l5T32vqe019r6nvNeVeU+415V5T32vqe019r/nskmeXyL2mvtfU95r6XlPfa+p7TbnXlHtNudfU95r6XlPfaz675Nklcq+p7zX1vaa+19T3mvpeU+415V5T7jX1vaa+19T3ms8ueXaJ3Gvqe019r6nvNfW9pr7XlHtNudeUe019r6nvNfW95rNLnl0i95r6XlPfa+p7TX2vqe815V5T7jXlXlPfa+p7TX2v+eySZ5fIvaa+19T3mvpeU99r6ntNudeUe02519T3mvpeU99rPrvk2SVyr6nvNfW9pr7X1Pea+l5T7jXlXlPuNfW9pr7X1Peazy55donca+p7TX2vqe819b2mvteUe02515R7TX2vqe819b3m2SVnl8i9pr7X1Pea+l5T32vqe02515R7TbnX1Pea+l5T32ueXXJ2idxryr2m3GvKvaa+15R7zfPsVd9ryr2m3GvKvabca/5xr/ffkrOgP+71t3wuOQs6WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1WTe83zvETfa8q9ptxryr2m3GvKvebZJWeXyL2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XvPskrNL5F5T32vqe019r6nvNfW9ptxryb2W3Gvpey19r6Xvtf7RJfWPLim519L3WvpeS99r6Xstfa8l91pyryX3WvpeS99r6Xutf3RJ/aNLSu619L2WvtfS91r6Xkvfa8m91r/w2cJnS9M4ey2515J7LbnXknstudeSey2519L3WvpeS99r/SufrXy2Mq383MqdLHey3MkyrU1r09q0Nq3dyfbZ2mdrn61Naz+3cSfHnRx3ckwb08a0MW1MG3dyfLb12dZnW9PWz23dyXUn151c09a0Ne2Z9kx77uTz2Z7P9ny2Z9rzc3vu5HMnz5080860M+1MO9POnTyf7Xw2u0Tfa+l7rc8u+eySzy6Rey19r6XvtfS9lr7X0vdacq8l91pyr6XvtfS9lr7X+uySzy6Rey19r6XvtfS9lr7X0vdacq8l91pyr6XvtfS9lr7X+uwSfa8l91pfmmaXfHbJZ5d8donca8m9ltxrfWVa+bnZJZ9d8tklcq/1lWl2yWeXfHbJZ5fIvZbca8m91temtZ+bXfLZJZ9dIvda35hml3x2yWeXfHaJ3GvJvZbca31r2vq52SWfXfLZJXKv9a1pdslnl3x2yWeXyL2W3GvJvdb3THt+bnaJvtfS91pyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaYZeEXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa8VdknYJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91phl4RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19rxV2Sdglcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmGXhF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vFXZJ2CVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaYZeEXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa8VdknaJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91ppl6RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19r5V2Sdolcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmmXpF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vlXZJ2iVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaaZekXSL3WnKvJfdacq+l77XkXivXtDXNLpF7LbnXknutP+71/lv+zoLqj3v9LcflunwujyWsWiWsWiWsWiWsWuWZdqadaWfamQarVgWrVgWrVgWrVgWrVgWrVgWrVgWrVgWrVgWrVvXPtM+0z7TPtM+0z7TPtM+0zzT/xinPS/S9ltxryb2W3GvJvZbca5VdUnaJ3Gvpey19r6XvtfS9ltxryb2W3Gvpey19r6XvtcouKbtE7rX0vZa+19L3WvpeS99ryb2W3GvJvZa+19L3Wvpeq+ySskvkXkvfa+l7LX2vpe+19L2W3GvJvZbca+l7LX2vpe+1yi4pu0TutfS9lr7X0vda+l5L32vJvVb5XlK+l8i9lr7XknstudeSey2515J7LbnXknstfa+l77X0vVb5XlK+l+h7LX2vpe+16txJ30v0vZa+19L3WvpeS99r6Xstfa/Vvpe07yX6Xkvfa+l7reY34WrfS/S9lr7X0vda+l5L32vpey19r9W+l7TvJfpeS99ryb2W3GvJvZbca8m9ltxryb2W3Gvpey19r9V2idxr6Xstfa+l77XaLmm7RO619L2WvtfS91r6Xkvfa8m9ltxryb2WvtfS91r6XqvtkrZL5F5L32vpey19r6XvtfS9ltxryb2W3Gvpey19r6XvtdouabtE7rX0vZa+19L3WvpeS99ryb2W3GvJvZa+19L3Wvpeq+0Sfa8l91rte4m+12q7pO2StkvkXkvuteReqz177fNzs0vaLmm7RO612vOStkvaLmm7ZOwSudeSey251xrPXsffccYuGbtk7BK51xrPS8YuGbtk7JKxS+ReS+615F5rfC8Z30vGLhm7ZOwSudca30vGLhm7ZOySsUvkXkvuteReazx7HX/H0fda+l5L32vJvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rjV0ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2CVjl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32uNXTJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbYJWOXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa61dsnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91tola5fIvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rrV2ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2iVrl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32utXbJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbaJWuXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa61dsnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91rNLnl0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2v9eySZ5fIvZbca8m9ltxr6Xstudd6nr3qey2515J7LbnXknutP+71/ltyFvTHvf6W5bJdjst1+Vxy8vRg1erBqtUr08q0Mq1MK9PKtDKtTGvT2rQ2rU1r09q0Nq1Na9PatDFtTBvTxrQxbUzzb5zneYm+15J7LbnXknstudeSe61nlzy7RO619L2WvtfS91r6XkvuteReS+619L2WvtfS91rPLnl2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbZJWeXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa51dcnaJ3Gvpey19r6XvtfS9lr7Xknut873kfC+Rey19ryX3WnKvJfdacq8l91pyryX3WvpeS99r6Xut873kfC/R91r6Xkvfa52/CZ/vJfpeS99r6Xstfa+l77X0vZa+1zrfS873En2vpe+19L3W+Zvw+V6i77X0vZa+19L3WvpeS99r6Xut873kfC/R91r6XkvuteReS+615F5L7rXkXkvuteReS99r6Xuts0vkXkvfa+l7LX2vdXbJ2SVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaR5f0P7qk5V5b32vre219r63vtfW9ttxry7223Gvre219r63vtf/RJf2PLmm519b32vpeW99r63ttfa8t99pyry332vpeW99r63vtf3RJ63ttudf+l6alaWlampbuZPps6bOlz5ampZ9buZPlTpY7WaaVaWVamVamlTtZPlv7bO2ztWnt59buZLuT7U62aW1amzamjWnjTo7PNj7b+Gxj2vi5jTs57uS6k2vamramrWlr2rqT67Otz7Y+2zPt+bk9d/K5k8+dfKY9055pz7Rn2rmT57Odz3Y+25l2fm7nTp47ee4kf+O0vtfW99r6XvuzSz67RO615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32mGXhF0i99r6Xlvfa+t7bX2vre+15V5b7rXlXlvfa+t7bX2vHXZJ2CVyr63vtfW9tr7X1vfa+l5b7rXlXlvutfW9tr7X1vfaYZeEXSL32vpeW99r63ttfa+t77XlXlvuteVeW99r63ttfa8ddknYJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99phl4RdIvfacq8t99pyr63vteVeO9a0Nc0ukXttudeWe+0/7vX+t3y/s6D+415/y3CZLstluxyX6/K5PJZn2pl2pp1pZ9qZdqadaWcarFonrFonrFonrFonrFonrFonrFonrFonrFonrFrnP9M+0z7TPtM+0/wbJzkvaX2vLffacq8t99pyry332mmXpF0i99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bRL0i6Re219r63vtfW9tr7X1vfacq8t99pyr63vtfW9tr7XTrsk7RK519b32vpeW99r63ttfa8t99pyry332vpeW99r63vttEvSLpF7bX2vre+19b22vtfW99pyr52+l6TvJXKvre+15V5b7rXlXlvuteVeW+615V5b32vre219r52+l6TvJfpeW99r63vtPHfS9xJ9r63vtfW9tr7X1vfa+l5b32uX7yXle4m+19b32vpeu/hNuMv3En2vre+19b22vtfW99r6Xlvfa5fvJeV7ib7X1vfacq8t99pyry332nKvLffacq8t99r6Xlvfa5ddIvfa+l5b32vre+2yS8oukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1y67pOwSudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bJLyi6Re219r63vtfW9tr7X1vfacq8t99pyr63vtfW9tr7XLrtE32vLvXb5XqLvtcsuKbuk7BK515Z7bbnXrmfa83OzS8ouKbtE7rXL85KyS8ouKbuk7BK515Z7bbnXbs9em99xuu2StkvaLpF77fa8pO2StkvaLmm7RO615V5b7rXb95L2vaTtkrZL2i6Re+32vaTtkrZL2i5pu0TuteVeW+6127PX5nec1vfa+l5b32vLvba+19b32vpeW99r63ttudeWe22519b32vpeW99rt13Sdonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b122yVtl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32u3XdJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vXbbJW2XyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa49dMnaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99tglY5fIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rj10ydonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b322CVjl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32uPXTJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfbYJWOXyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa49dMnaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99tgla5fIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rr12ydonca8u9ttxry722vteWe+317FXfa8u9ttxry7223Gv/ca/335KzoD/u9b9l/nP5uQyX6bJctstxuS5NS9PKtDKtTCvTyrQyrUwr08q0Mq1Na9PatDatTWvT2rQ2rU1r08a0Mc2/cdbzEn2vLffacq8t99pyry332muXrF0i99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bVL1i6Re219r63vtfW9tr7X1vfacq8t99pyr63vtfW9tr7XXrtk7RK519b32vpeW99r63ttfa8t99pyry332vpeW99r63vtZ5c8u0TutfW9tr7X1vfa+l5b32vLvfbzveT5XiL32vpeW+615V5b7rXlXlvuteVeW+619b22vtfW99rP95Lne4m+19b32vpe+/mb8PO9RN9r63ttfa+t77X1vba+19b32s/3kud7ib7X1vfa+l77+Zvw871E32vre219r63vtfW9tr7X1vfaz/eS53uJvtfW99pyry332nKvLffacq8t99pyry332vpeW99rP7tE7rX1vba+19b32s8ueXaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99rNLnl0i99r6Xlvfa+t7bX2vre+15V5b7rXlXlvfa+t7bX2vfXbJ2SVyr63vtfW9tr7X1vfa+l5b7rXlXlvutfW9tr7X1vfaZ5foe2251z7fS/S99tklZ5ecXSL32nKvLffa59nr+TvO2SVnl5xdIvfa53nJ2SVnl5xdcnaJ3GvLvbbca59nr+fvOGeXnF1ydonca5/nJWeXnF1ydsnZJXKvLffacq99vpec7yVnl5xdcnaJ3Guf7yVnl5xdcnbJ2SVyry332nKvfZ69nr/j6Httfa+t77XlXlvfa+t7bX2vre+19b223GvLvbbca+t7bX2vre+1zy45u0TutfW9tr7X1vfa+l5H3+vIvY7c68i9jr7X0fc6+l7nH10y/+iSkXsdfa+j73X0vY6+19H3OnKvI/c6cq+j73X0vY6+1/lHl8w/umTkXkff6+h7HX2vo+919L2O3OvIvY7c6+h7HX2vo+91/qU7me5kmpampWllWplW7mT5bOWzlc9WppWfW7mT5U62O9mmtWltWpvWprU72T5b+2zts41p4+c27uS4k+NOjmlj2pg2po1p606uz7Y+2/psa9r6ua07ue7kupNr2jPtmfZMe6Y9d/L5bM9nez7bM+35uZ07ee7kuZNn2pl2pp1pZ9q5k3aJ3OvIvY6+19H3Op9d8tkln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zpyryP3OnKvo+915F7nG9PWNLtE7nXkXkfudf641/tv+TsLmj/u9bd8Lo8lrNp8sGrzwarNB6s2H6zafLBq8z3TnmnPtGfamXamnWln2pl2pp1pZ9qZBqs2Aas2Aas2Aas2Aas2Aas2Aas2Aas2Aas2Aas28c80/saZ4Lxk9L2O3OvIvY7c68i9jtzrhF0Sdonc6+h7HX2vo+919L2O3OvIvY7c6+h7HX2vo+91wi4J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AksCS3ivHWsbliSWJJYklvBem/favNdO55J0LkksSSxJLOG9djqXJJYkliSWJJbwXpv32rzXzrDt+47Teq+t99p6r817bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332okliSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r51YkljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qJJYklvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq+dWJJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffaiSWJJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvXVhSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332oUlhSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r11YUljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qFJYUlvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq9dWFJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffahSWFJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvXVhSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332hdLLpbwXpv32rzX5r223mvzXvu6e9V7bd5r816b99q81/7jvf77/dkf77X+Go8xjGks4zU+YxvH+N083bQtbUvb0ra0LW1L29K2tC1tK9vKtrKtbCvbyrayrWwr28q2a9u17dp2bfM3znVfovfavNfmvTbvtXmvzXvtiyUXS3ivrffaeq+t99p6r817bd5r815b77X1XlvvtS+WXCzhvbbea+u9tt5r67223mvzXpv32rzX1nttvdfWe+2LJRdLeK+t99p6r6332nqvrffavNfmvTbvtfVeW++19V77YcnDEt5r67223mvrvbbea+u9Nu+1n3PJcy7hvbbea/Nem/favNfmvTbvtXmvzXttvdfWe229137OJc+5RO+19V5b77VfepPOJXqvrffaeq+t99p6r6332nqv/ZxLnnOJ3mvrvbbea7/yJp1L9F5b77X1XlvvtfVeW++19V77OZc85xK919Z7bd5r816b99q81+a9Nu+1ea/Ne22919Z77YclvNfWe22919Z77YclD0t4r6332nqvrffaeq+t99q81+a9Nu+19V5b77X1XvthycMS3mvrvbbea+u9tt5r670277V5r817bb3X1nttvdduLGks4b223mvrvbbea+u9tt5r816b99q819Z7bb3X1nvtxhK91+a9djuX6L12Y0ljSWMJ77V5r8177Xb32r7jNJY0ljSW8F673Zc0ljSWNJY0lvBem/favNdud6/tO05jSWNJYwnvtdt9SWNJY0ljSWMJ77V5r8177XYuaeeSxpLGksYS3mu3c0ljSWNJY0ljCe+1ea/Ne+1299q+4+i9tt5r670277X1XlvvtfVeW++19V6b99q81+a9tt5r67223ms3ljSW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6712Y8lgCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rD5YMlvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u99mDJYAnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeaw+WDJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZgyWAJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msPlgyW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6732YMlgCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rD5YMlvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u99mLJYgnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeay+WLJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZiyWIJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msvliyW8F6b99q81+a9tt5r81573b3qvTbvtXmvzXtt3mv/8V73r/G7C/rjvf419o/xGMOYxjJe4zO20Tau2nLVlqu2XLXlqi1Xbblqy1Vbrtpy1Zartly15aotV225astVW67actWWq7Zctf1ctfn5XLX5+Vy14b3Oz3dfMnqvw3sd3uvwXof3OrzX+flYMj8fS4b3Onqvo/c6eq+j9zq81+G9Du919F5H73X0XucnPFt4trAtbAvbwraw7WPJ8F6H9zq819F7Hb3X0Xudn48l8/OxZHivo/c6eq+j9zp6r6P3OrzX4b0O73X0XkfvdfRe5+d6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q/e6eq+r97oXSy6W8F5X73X1XlfvdfVeV+91ea/Le13e6+q9rt7r6r3uxZKLJbzX1XtdvdfVe12919V7Xd7r8l6X97p6r6v3unqv+7DkYQnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6z4seVjCe12919V7Xb3X1XtdvdflvS7vdXmvq/e6eq+r97oPSx6W8F5X73X1XlfvdfVeV+91ea/Le13e6+q9rt7r6r3uw5KHJbzX1XtdvdfVe12919V7Xd7r8l6X97p6r6v3unqv+7DkYQnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6z4seVjCe12919V7Xb3X1XtdvdflvS7vdXmvq/e6eq+r97oPSx6W8F5X73X1XlfvdfVeV+91ea/Le13e6+q9rt7r6r1uY0ljCe919V5X73X1XlfvdfVel/e6vNflva7e6+q9rt7rNpY0lvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q9bmNJYwnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6zaWNJbwXpf3urzX5b2u3uvyXrfdveq9Lu91ea/Le13e6/7xXv/9/uyP91p/jccYxjSW8RqfsY1j/G6eum1r29q2tq1ta9vatratbWvbxraxbWwb28a2sW1sG9vGtrFtbVvb1ra1zd847b5E73V5r8t7Xd7r8l6X97qDJYMlvNfVe12919V7Xb3X5b0u73V5r6v3unqvq/e6gyWDJbzX1XtdvdfVe12919V7Xd7r8l6X97p6r6v3unqvO1gyWMJ7Xb3X1XtdvdfVe1291+W9Lu91ea+r97p6r6v3uoMlgyW819V7Xb3X1XtdvdfVe13e645zyTiX8F5X73V5r8t7Xd7r8l6X97q81+W9rt7r6r2u3uuOc8k4l+i9rt7r6r3u+CY8ziV6r6v3unqvq/e6eq+r97p6rzvOJeNcove6eq+r97rjm/A4l+i9rt7r6r2u3uvqva7e6+q97jiXjHOJ3uvqvS7vdXmvy3td3uvyXpf3urzX5b2u3uvqve5iCe919V5X73X1XnexZLGE97p6r6v3unqvq/e6eq/Le13e6/JeV+919V5X73UXSxZLeK+r97p6r6v3unqvq/e6vNflvS7vdfVeV+919V53sWSxhPe6eq+r97p6r6v3unqvy3td3uvyXlfvdfVeV+91F0v0Xpf3uutcove6iyWLJYslvNflvS7vddfd6/qOs1iyWLJYwnvddV+yWLJYsliyWMJ7Xd7r8l533b2u7ziLJYsliyW81133JYsliyWLJYslvNflvS7vdde5ZJ1LFksWSxZLPu/1/Pz8fS75HY8xjGks4zU+Yxv/2vY77jf+zZLf8RjDaNux7dh2bDu2/c2S39GzhWcLzxa2/f0d53cs4zU+o21hW9iWtqVt6U2mZ0vPlp4tbfv7O87v6E2mN1neZNlWtpVtZVvZVt5kebbybOXZrm3X73a9yetNXm/y2nZtu7Zd265tz5t8nu15tufZnm3P7/a8yedNPm/y2da2tW1tW9vW3mR7tvZs7dnatva7jTc53uR4k2Pb2Da2jW1j23iT49nWs61nW9vW77be5HqT602ubWsblhwsOVhysORgycGSgyVf7/V3bOMYvzd5sOTzXn9H27DkYMnBkoMlB0sOlhws+Xqvv+MxhjGNZbQtbMOSgyUHSw6WHCw5WHKw5Ou9/o7X6E1iycGSz3v9x1i2YcnBkoMlB0sOlhwsOVjy9V5/R78blhwsOVjyea+/o21YcrDkYMnBkoMlB0sOlny919/R74YlB0sOlnze6+9oG5YcLDlYcrDkYMnBkoMlX+/1d/S7YcnBkoMln/f6O9qGJQdLDpYcLDlYcrDkYMnXe/0d/W5YcrDkYMnnvf6Onm0923o2LPm819/xGMOY/rdlvMZn7H+/P/sd/7oL+h33G8+P8RjDmMYyXuMzttG2Y1vYFraFbWFb2Ba2hW1hW9gWtqVtaVvalralbWlb2pa2pW1pW9lWtpXfrdJYRr8blgSWhHNJOJcElgSWBJYElgSWBJYElgSWBJYElny919/RNiwJLAks+bzX39E2LAksCSwJLAksCSwJLPl6r7/jNT5jG8do29iGJYElgSWBJYElgSWBJV/v9Xf8yBVYElgSWPJ5r7+jbVjy9V5/R9ucSwJL0rkknUsSS77e6+9Yxmt8xvZPGKNtxzbnknQuSeeSdC5J55Kv9/o7tnGM35tM55L0N87Xe/0dbQvbnEvSuSSdS9K5JJ1Lvt7r73iM3mR6k84l6W+cr/f6O9qWtjmXpHNJOpekc0k6lySWfL3X39GbLG/SuSSx5PNef0fbrm1YkliSWJJYkljy9V5/R78bliSWJJakv3G+3uvvaBuWJJYkliSWJJYklny919/R74YliSWJJelvnK/3+jvahiWJJYkliSWJJYklX+/1d/S7YUliSWJJ+hvn673+jrZhSWJJYkliSWJJYkk5l5RzSWFJYUlhSTmXlHNJYUlhSWFJYUlhSWFJYUkd2841PmMbx2ib+5LCksKSwpLCksKSwpLCkgrb4vvdCksKSwpLyt845b6ksKSwpLCksKSwpLCksKScS8q5pLCksKSwpJxLyrmksKSwpLCksKSwpLCksKSubdfvhiWFJYUl5W+ccl9SWFJYUlhSWFJYUlhSWPL1Xn9HvxuWFJYUlpS/ccp9SWFJYUlhSWFJYUlhSWHJ13v9Hf1uWFJYUlhS/sYp9yWFJYUlhSWFJYUlhSWFJeVvnK/3+o9rDyy5WHKx5Pob5/ob52LJxZKLJRdLLpZcLLlYct29fr3X37GM1/iMtrkvuVhyseRiycWSiyUXSy6WXHevX+/1dxyjN4kl133JdV9yseRiycWSiyUXSy6WXCy57l6/3uvv6E1iycWS62+c62+ciyUXSy6WXCy5WHKx5GLJdff69V5/R28SSy6WXH/jXPclF0sullwsuVhyseRiycWS6+71673+Y8SSiyUXS66/ca77koslF0sullwsuVhyseRiyXX3+vVef0dvEksullx/41z3JRdLLpZcLLlYcrHkYsnFkuu+5LovuVhyseRhyfM3znP3+rDkYcnDkoclD0seljwsee5en+84D0seljwsef7Gee5eH5Y8LHlY8rDkYcnDkoclz93r8x3nYcnDkoclz984z93rw5KHJQ9LHpY8LHlY8rDkuXt9vuM8LHlY8rDk+RvnYclzLnnOJQ9Lnr9xnrvX577kYcnDkoclz7nkj/e6f43fXdAf7/XvcYzfXdB7P8ZjDGMay3iNtj3bnm3PtratbWvb2ra2rW1r29q2tq1tG9vGtrFtbBvbxraxbWwb28Y2f+M89yXPfcnDkoclD0uec8lzLnlY8rCksaSxpLGksaSxpLGksaSxpH3Had9xGksaSxpL2t847b6ksaSxpLGksaSxpLGksaR9x2nfcRpLGksaS9rfOO2+pLGksaSxpLGksaSxpLGkfcdp33EaSxpLGkva3zjtvqSxpH3HaeeSdi5pLGnnknYuaSxpd6/t7rV9E27nkvY3Trsvafcl7e61nUvauaSdS9q5pJ1L2t1r+47TvuO0b8LtXNL+xmn3Je2+pN29tnNJO5e0c0k7l7RzSbt7bd9x2nec9k24nUva3zjtvqTdl7S713YuaeeSdi5p55J2Lmksad9x2nec9k24nUsaS9p9SbsvGXevgyWDJYMlgyWDJePudXwTHiwZLBksGX/jjPuSwZLBksGSwZLBksGSwZJx9zq+CQ+WDJYMloy/ccZ9yWDJYMlgyWDJYMlgyWDJuHsd34QHSwZLBkvG3zjjvmSwZLBksGSwZLBksGSwZJxLxrlksGSwZLBknEvGuWSwZLBksGSwZLBksGSwZNy9ju84gyWDJYMl42+ccV8yWDJYMlgyWDJYMlgyWDLuXsd3nMGSwZLBkvE3zrgvGSwZLBksGSwZLBksGSwZ55JxLhksGSwZLBnnknEuGSwZLBksWSxZLFksWSxZd6/rO85iyWLJYsn6G2fdlyyWLJYsliyWLJYsliyWrLvX9R1nsWSxZLFk/Y2z7ksWSxZLFksWSxZLFksWS9bd6/qOs1iyWLJYsv7GWfcliyWLJYsliyWLJYsliyXrb5z1HWexZLFksWT9jbP+xlksWSxZLFksWSxZLFksWXev6zvOYsliyWLJui9Z9yWLJYsliyWLJYsliyWLJevudX3HWSxZLFksWfcl675ksWSxZLFksWSxZLFksWTdva7vOIsliyWLJetvnPU3zmLJYsliyWIJ7/XwXg/v9Xy9198xjWW8xmds/4Qx2nZsO7Z9LDm818N7PbzX8/Vef8c2jnG/8WPJ4b2er/f6O9oWtoVtH0sO7/XwXg/v9Xy919/xGL3J9CbTm0zb0ra0LW1L28qbLM9Wnq08W9lWfrfyJsubLG+ybLu2Xduubde2601ez3Y92/Vs17brd3ve5PMmnzf5bHu2Pduebc+2500+z9aerT1b29Z+t/Ym25tsb7Jta9vatrFtbBtvcjzbeLbxbGPb+N3Gmxxvcr3JtW0923q29Wxr29q2tq1tWMJ7PbzXw3s9f7zX/Wv8+y7o/PFe/x6fsY1j3G/8XLVzPlftnM9VO+dz1c45th3bjm3HtmPbsS1sC9vCtrAtbAvbwrawLWwL29K2tC1tS9vStrQtbUvbvr9xzvnuS87Xe/0d/W5Ywns9vNfDez0HSw6W8F7PwZKDJQdLDpbwXg/v9fBez9d7/R1tw5KDJQdLeK/n673+jrZhycGSgyW818N7PbzX8/Vef8djDGMay2hb24YlB0sOlhws4b0e3uvhvZ6v9/o7XqM3iSUHS3iv5+u9/o62rW1r23qTWHLWs61nw5Kv9/r7f7cf4zGG8dvGez2818N7PeFcEs4l4VwSziXhXPL1Xn/HNJbxGp/RtmPbsS1scy4J55JwLgnnknAu+Xqvv2Mbx+hNOpd8vdff0ba0LW1zLgnnknAuCeeScC4JLPl6r7+jN1nepHMJ7/XwXg/v9fBeD+/1BJYElgSW8F7P13v9Hf1uWBJYEljCez1f7/V3tA1LAksCS3ivh/d6eK/n673+jn43LAksCSzhvZ6v9/o72oYlgSWBJbzXw3s9vNfz9V5/R78blgSWBJbwXs/Xe/0dbcOSwJLAEt7r4b0e3usJ55JwLgksCSxJLOG9nnQuSSxJLEksSSzhvR7e6+G9njy2fd9xTmJJYkliCe/15LENSxJLEksSS3ivh/d6eK8nw7bvO85JLEksSSzhvZ5M27AksSSxJLGE93p4r4f3etK5JJ1LEksSSxJLeK8nnUsSSxJLEksSS3ivh/d6eK8nr23X74YliSWJJbzX8/Vef0fbsCSxJLGE93p4r4f3er7e6+/od8OSxJLEEt7r+Xqvv6NtWJJYkljCez2818N7PV/v9Xf0u2FJYkliCe/1fL3X39E2LEksSSzhvR7e6+G9nvQ3ztd7/R29SSxJLOG9nvI3TmFJYUlhSWEJ7/XwXg/v9Xy919/x+90KSwpLCkt4r6fclxSWFJYUlhSW8F4P7/XwXs/Xe/0d01jGa3xG29yXFJYUlhSWFJbwXg/v9fBez9d7/R3b6E1iSWEJ7/WUv3EKSwpLCksKS3ivh/d6eK/n673+jn43LCksKSzhvZ5yX1JYUlhSWFJYwns9vNfDez1f7/V39LthSWFJYQnv9ZT7ksKSwpLCksIS3uvhvR7e6/l6r7+j3w1LCksKS3ivp9yXFJYUlhSWFJbwXg/v9fBeT7kvKfclhSWFJYUlvNfz9V5/x2/bxZKLJRdLeK+H93p4r+e6e/16r7/jGL83ebGE93quu9eLJRdLLpZcLOG9Ht7r4b2e6+71673+jmFMYxltc/d6seRiycWSiyW818N7PbzXc929fr3X39GbxJKLJbzXw3s9vNfDez0XS3iv57p7ve5LeK+H93p4r4f3ev54r/vX+N0F/fFe/x7LeI3P2MYxfjdP93PVzv1ctXOfbc+2Z9uz7dn2bHu2PdvatratbWvb2ra2rW1r29q2tm1sG9vGtrFtbBvb/I1z3Zdc9yW818N7PbzXw3s9vNdzseRiCe/1XCy5WHKx5GEJ7/XwXg/v9TzfcZ7vOA9LHpY8LOG9nue+5GHJw5KHJQ9LeK+H93p4r+f5jvN8x3lY8rDkYQnv9Tz3JQ9LHpY8LHlYwns9vNfDez3Pd5znO87DkoclD0t4r+e5L3lY8nzHec4lz7mE93qec8lzLuG9nufulfd6eK+H93p4r4f3enivh/d6nnPJcy55ziXPueQ5lzx3r893nOc7znvepHPJ8zfOc1/y3Jc8d6/PueQ5lzznkudc8pxLnrvX5zvO8x3ntTfpXPL8jfPclzz3Jc/d63Muec4lz7nkOZc855KHJc93HN7r4b0e3uvhvR7e6+G9Ht7r4b2ehyUPSxpLeK+n3b22b8KNJY0ljSW819PuSxpLGksaSxpLeK+H93p4r6fdvbZvwo0ljSWNJbzX0+5LGksaSxpLGkt4r4f3enivp929tm/CjSWNJY0lvNfT7ksaSxpLGksaS3ivh/d6eK+nnUvauaSxpLGksYT3etq5pLGksaSxpLGE93p4r4f3etrda/uO01jSWNJYwns97b6ksaSxpLGksYT3enivh/d62t1r+47TWNJY0ljCez3tvqSxpLGksaSxhPd6eK+H93rauaSdSxpLGksaS3ivp51LGksaSxpLGkt4r4f3enivZ9y9ju84gyWDJYMlvNcz7ksGSwZLBksGS3ivh/d6eK9n3L2O7ziDJYMlgyW81zPuSwZLBksGSwZLeK+H93p4r2fcvY7vOIMlgyWDJbzXM+5LBksGSwZLBkt4r4f3enivZ/yNM77jDJYMlgyW8F7P+BtnsGSwZLBksIT3enivh/d6xt3r+I4zWDJYMljCez3jvmSwZLBksGSwhPd6eK+H93rG3ev4jjNYMlgyWMJ7PeO+ZLBksGSwZLCE93p4r4f3esbd6/iOM1gyWDJYwns942+cwZLBksGSwRLe6+G9Ht7rGXev4zvOYsliyWIJ7/Ws+5LFksWSxZLFEt7r4b0e3utZd6/rO85iyWLJYgnv9az7ksWSxZLFksUS3uvhvR7e61l3r+s7zmLJYsliCe/1rPuSxZLFksWSxRLe6+G9Ht7rWfcl675ksWSxZLGE93rW3etiyWLJYsliCe/18F4P7/Wsu9f1HWexZLFksYT3etbd62LJYsliyWIJ7/XwXg/v9ay71/UdZ7FksWSxhPd61t3rYsliyWLJYgnv9fBeD+/1rLvX9R1nsWSxZLGE93p4r4f3enivZ7GE93rW3eu6L+G9Ht7r4b0e3uv5473+uT+LP95r/TUeYxjTWMZrfMY2jnG/8dh2bDu2HduObce2Y9ux7dh2bAvbwrawLWwL28K2sC1sC9vCtrQtbUvb0rbvb5z4+e5LQu81eK/Bew3ea/Beg/caPx9L4udjSfBeQ+819F5D7zX0XoP3GrzX4L2G3mvovYbea/xcz3Y927Xt2nZte7Y92z6WBO81eK/Bew2919B7Db3X+PlYEj8fS4L3Gnqvofcaeq+h9xp6r8F7Dd5r8F5D7zX0XkPvNX7Gmxxvcmwb28a2sW1sW29yPdt6tvVsa9v63dabXG9yvcnvb5zgvQbvNXivofcaeq+h9xrnO5fE+c4lofcaeq9xvu84/xiPMYy2HduObce2Y9t3Lgm91zjh2cKzhW3fd5zQe43zfROO851LQu819F5D7zX0XkPvNfReQ+81Tnq29GxYovcavNfgvQbvNXivwXsN3mvwXoP3GnqvofcaB0t4r6H3GnqvofcaB0sOlvBeQ+819F5D7zX0XkPvNXivwXsN3mvovYbea+i9xsGSgyW819B7Db3X0HsNvdfQew3ea/Beg/caeq+h9xp6r3Gw5GAJ7zX0XkPvNfReQ+819F6D9xq81+C9ht5r6L2G3mscLNF7Dd5rnLUNSwJLAksCS3ivwXsN3mvEd/ca8X3HicCSwJLAEt5rxLENSwJLAksCS3ivwXsN3mtE2PZ9x4nAksCSwBLea0TYhiWBJYElgSW81+C9Bu81wrkknEsCSwJLAkt4rxHOJYElgSWBJYElvNfgvQbvNaJsK78blui9ht5r8F5D7zX0XkPvNfReQ+81eK/Bew3ea+i9ht5r6L1GYElgCe819F5D7zX0XkPvNfReg/cavNfgvYbea+i9ht5rBJYElvBeQ+819F5D7zX0XkPvNXivwXsN3mvovYbea+i9RmBJYAnvNfReQ+819F5D7zX0XoP3GrzX4L2G3mvovYbeaySWJJbwXkPvNfReQ+819F5D7zV4r8F7Dd5r6L2G3mvovUZiSWIJ7zX0XkPvNfReQ+819F6D9xq81+C9ht5r6L2G3mskliSW8F5D7zX0XkPvNfReQ+81eK/Bew3ea+i9ht5r6L1GYkliCe819F5D7zX0XkPvNfReg/cavNfgvYbea+i9ht5rJJYklvBeQ+819F5D7zX0XkPvNXivwXsN3mvovYbea+i9RmJJYgnvNfReQ+819F5D7zX0XoP3GrzX4L2G3mvovYbeaySWJJbwXkPvNfReQ+819F5D7zV4r8F7Dd5r6L2G3mvovUZhSWEJ7zX0XkPvNfReQ+819F6D9xq81+C9ht5r6L2G3msUlhSW8F5D7zX0XkPvNfReQ+81eK/Bew3ea+i9ht5r6L1GYUlhCe81eK/Bew3ea+i9Bu81qmxzX8J7Dd5r8F6D9xp/vNf9a/zugv54r3+N98d4jGFMYxmv8RnbaNu17dn2bHu2Pduebc+2Z9uz7dn2bGvb2ra2rW1r29q2tq1ta9vatrFtbPM3Trkv0XsN3mvwXoP3GrzX4L1GYUlhCe819F5D7zX0XkPvNXivwXsN3mvovYbea+i9xsWSiyW819B7Db3X0HsNvdfQew3ea/Beg/caeq+h9xp6r3Gx5GIJ7zX0XkPvNfReQ+819F6D9xq81+C9ht5r6L2G3mtcLLlYwnsNvdfQew2919B7Db3X4L3GdS65ziW819B7Dd5r8F6D9xq81+C9Bu81eK+h9xp6r6H3Gte55DqX6L2G3mvovca93qRzid5r6L2G3mvovYbea+i9ht5rXOeS61yi9xp6r6H3Gre9SecSvdfQew2919B7Db3X0HsNvde4ziXXuUTvNfReg/cavNfgvQbvNXivwXsN3mvwXkPvNfRe42IJ7zX0XkPvNfRe42HJwxLea+i9ht5r6L2G3mvovQbvNXivwXsNvdfQew2913hY8rCE9xp6r6H3Gnqvofcaeq/Bew3ea/BeQ+819F5D7zUeljws4b2G3mvovYbea+i9ht5r8F6D9xq819B7Db3X0HuNhyV6r8F7jedcovcaD0seljws4b0G7zV4r/HcvT7fcR6WPCx5WMJ7jee+5GHJw5KHJQ9LeK/Bew3eazx3r893nIclD0selvBe47kveVjysORhycMS3mvwXoP3Gs+55DmXPCx5WPKwhPcaz7nkYcnDkoclD0t4r8F7Dd5rPHevz3ccvdfQew291+C9ht5r6L2G3mvovYbea/Beg/cavNfQew2919B7jcaSxhLea+i9ht5r6L2G3mvovQbvNXivwXsNvdfQew2912gsaSzhvYbea+i9ht5r6L2G3mvwXoP3GrzX0HsNvdfQe43GksYS3mvovYbea+i9ht5r6L0G7zV4r8F7Db3X0HsNvddoLGks4b2G3mvovYbea+i9ht5r8F6D9xq819B7Db3X0HuNxpLGEt5r6L2G3mvovYbea+i9Bu81eK/Bew2919B7Db3XaCxpLOG9ht5r6L2G3mvovYbea/Beg/cavNfQew2919B7jcaSxhLea+i9ht5r6L2G3mvovQbvNXivwXsNvdfQew291xgsGSzhvYbea+i9ht5r6L2G3mvwXoP3GrzX0HsNvdfQe43BksES3mvovYbea+i9ht5r6L0G7zV4r8F7Db3X0HsNvdcYLBks4b2G3mvovYbea+i9ht5r8F6D9xq819B7Db3X0HuNwZLBEt5r6L2G3mvovYbea+i9Bu81eK/Bew2919B7Db3XGCwZLOG9ht5r6L2G3mvovYbea/Beg/cavNfQew2919B7jcGSwRLea/Beg/cavNfQew3ea4y7V73X4L0G7zV4r8F7jT/e6/41fndBf7zXv8cxfndBy1Vbrtpy1Zartly15aotV225astVW67actWWq7ZcteWqLVdtuWrLVVuu2nLVlqu2XLXlqi1Xbblqy1Vbrtpy1Zartly15arxXmPdl+i9Bu81eK/Bew3ea/BeY7FksYT3Gnqvofcaeq+h9xq81+C9Bu819F5D7zX0XmOxZLGE9xp6r6H3Gnqvofcaeq/Bew3ea/BeQ+819F5D7zUWSxZLeK+h9xp6r6H3GnqvofcavNfgvQbvNfReQ+819F5jsWSxhPcaeq+h9xp6r6H3GnqvwXuNdS5Z5xLea+i9Bu81eK/Bew3ea/Beg/cavNfQe02919R7zZ/vXJI/37kk9V5T7zX1XvPn+yacP9+5JPVeU+819V5T7zX1XlPvNfVe8+c7l+TPdy5JvdfUe0291/z5vgnnz3cuSb3X1HtNvdfUe02919R7Tb3X/EnPlp4tbfu+4yTvNXmvyXtN3mvyXpP3mrzX5L2m3mvqveZPebbybGVb+d3Kmyxv8nqT17Zr27Xt2nZtu97k9WzXs13P9mx7frfnTT5v8nmTz7Zn27Pt2fZsa2+yPVt7tvZsbVv73dqbbG+yvcm2bWwb28a2sW28yfFs49nGs41t43dbb3K9yfUm17a1bW1b29a29SaxhPeavNc8391rnu87Th4sOVhysIT3mue7L8mDJQdLDpYcLOG9Ju81ea95jm3fd5w8WHKw5GAJ7zVP2IYlB0sOlhws4b0m7zV5r3nStu9ckgdLDpYcLOG95knbsORgycGSgyW81+S9Ju81T9lWfjcs0XtNvdfkvabea+q9pt5r6r2m3mvyXpP3mrzX1HtNvdfUe82DJQdLeK+p95p6r6n3mnqvqfeavNfkvSbvNfVeU+819V7zYMnBEt5r6r2m3mvqvabea+q9Ju81ea/Je02919R7Tb3XPFhysIT3mnqvqfeaeq+p95p6r8l7Td5r8l5T7zX1XlPvNQNLAkt4r6n3mnqvqfeaeq+p95q81+S9Ju819V5T7zX1XjOwJLCE95p6r6n3mnqvqfeaeq/Je03ea/JeU+819V5T7zUDSwJLeK+p95p6r6n3mnqvqfeavNfkvSbvNfVeU+819V4zsCSwhPeaeq+p95p6r6n3mnqvyXtN3mvyXlPvNfVeU+81A0sCS3ivqfeaeq+p95p6r6n3mrzX5L0m7zX1XlPvNfVeM7AksIT3mnqvqfeaeq+p95p6r8l7Td5r8l5T7zX1XlPvNQNLAkt4r6n3mnqvqfeaeq+p95q81+S9Ju819V5T7zX1XjOxJLGE95p6r6n3mnqvqfeaeq/Je03ea/JeU+819V5T7zUTSxJLeK+p95p6r6n3mnqvqfeavNfkvSbvNfVeU+819V4zsSSxhPeavNfkvSbvNfVek/eambalbVjCe03ea/Je84/3un+Nf98F5R/v9e/xGds4xv3Gz1XL/Fy1zM9Vy/xctcxr27Xt2nZtu7Zd255tz7Zn27Pt2fZse7Y9255tz7a2rW1r29q2tq1ta9vaNn/jZPu3ZPxbgiW81+S9Ju81ea+ZWJJYwntNvdfUe02919R7Td5r8l6T95p6r6n3mnqvmVhSWMJ7Tb3X1HtNvdfUe0291+S9Ju81ea+p95p6r6n3moUlhSW819R7Tb3X1HtNvdfUe03ea/Jek/eaeq+p95p6r1lYUljCe02919R7Tb3X1HtNvdfkvWY5l5RzCe819V6T95q81+S9Ju81ea/Je03ea+q9pt5r6r1mOZeUc4nea+q9pt5r1vUmnUv0XlPvNfVeU+819V5T7zX1XrOcS8q5RO819V5T7zXreZPOJXqvqfeaeq+p95p6r6n3mnqvWc4l5Vyi95p6r8l7Td5r8l6T95q81+S9Ju81ea+p95p6r1lYwntNvdfUe0291ywsKSzhvabea+q9pt5r6r2m3mvyXpP3mrzX1HtNvdfUe82LJRdLeK+p95p6r6n3mnqvqfeavNfkvSbvNfVeU+819V7zYsnFEt5r6r2m3mvqvabea+q9Ju81ea/Je02919R7Tb3XvFii95q817zOJXqvebHkYsnFEt5r8l6T95rX3eu9fjcsuVhysYT3mtd9ycWSiyUXSy6W8F6T95q817zuXu/zu2HJxZKLJbzXvO5LLpZcLLlYcrGE95q81+S95nUuuc4lF0sullws4b3mdS65WHKx5GLJxRLea/Jek/ea193rXb8blui9pt5r8l5T7zX1XlPvNfVeU+81ea/Je03ea+q9pt5r6r3mw5KHJbzX1HtNvdfUe02919R7Td5r8l6T95p6r6n3mnqv+bDkYQnvNfVeU+819V5T7zX1XpP3mrzX5L2m3mvqvabeaz4seVjCe02919R7Tb3X1HtNvdfkvSbvNXmvqfeaeq+p95oPSx6W8F5T7zX1XlPvNfVeU+81ea/Je03ea+q9pt5r6r3mw5KHJbzX1HtNvdfUe02919R7Td5r8l6T95p6r6n3mnqv+bDkYQnvNfVeU+819V5T7zX1XpP3mrzX5L2m3mvqvabeaz4seVjCe02919R7Tb3X1HtNvdfkvSbvNXmvqfeaeq+p95qNJY0lvNfUe02919R7Tb3X1HtN3mvyXpP3mnqvqfeaeq/ZWNJYwntNvdfUe02919R7Tb3X5L0m7zV5r6n3mnqvqfeajSWNJbzX1HtNvdfUe02919R7Td5r8l6T95p6r6n3mnqv2VjSWMJ7Tb3X1HtNvdfUe0291+S9Ju81ea+p95p6r6n3mo0ljSW819R7Tb3X1HtNvdfUe03ea/Jek/eaeq+p95p6r9lY0ljCe03ea/Jek/eaeq/Je81296r3mrzX5L0m7zV5r/nHe92/xu8u6I/3+vdYxmt8xjaO8bt5ms9Vy/lctZzPVcv5XLWcz1XL+Vy1nM9Vy/lctZzPVcv5se3Ydmw7th3bjm3HtmPbse3YdmwL28K2sC1sC9vCNn/jjPsSvdfkvSbvNXmvyXtN3msOlgyW8F5T7zX1XlPvNfVek/eavNfkvabea+q9pt5rDpYMlvBeU+819V5T7zX1XlPvNXmvyXtN3mvqvabea+q95mDJYAnvNfVeU+819V5T7zX1XpP3mrzX5L2m3mvqvabeaw6WDJbwXlPvNfVeU+819V5T7zV5rznOJeNcwntNvdfkvSbvNXmvyXtN3mvyXpP3mnqvqfeaeq85ziXjXKL3mnqvqfea65vwOpfovabea+q9pt5r6r2m3mvqveY6l6xzid5r6r2m3muub8LrXKL3mnqvqfeaeq+p95p6r6n3mutcss4leq+p95q81+S9Ju81ea/Je03ea/Jek/eaeq+p95qLJbzX1HtNvdfUe83FksUS3mvqvabea+q9pt5r6r0m7zV5r8l7Tb3X1HtNvddcLFks4b2m3mvqvabea+q9pt5r8l6T95q819R7Tb3X1HvNxZLFEt5r6r2m3mvqvabea+q9Ju81ea/Je02919R7Tb3XXCzRe03ea65zid5rLpYsliyW8F6T95q811x3r/t9x6mfjyX187Gkfj6WFO+1fr77kvr5WFI/H0vq52NJ/XwsKd5r8V6L91o/x7bvO079fCypn48l9fOxpHiv9XNsO7aFbWHbx5LivRbvtXiv9RO2feeS+vlYUj/hTaY3mbalbWlb2pa2pTeZni09W3q2sq38buVNljdZ3mTZVraVbWVb2Xa9yevZrme7nu3adv1u15u83uT1Jq9tz7Zn27Pt2fa8yefZnmd7nu3Z9vxu7U22N9neZNvWtrVtbVvb1t5ke7bxbOPZxrbxu403Od7keJNj29g2tq1ta9t6k+vZ1rOtZ1vb1u+23iSWHCzhvZbea+m9lt5r6b2W3mvxXov3WrzX0nstvdc6WHKw5GAJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3msdLDlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaB0sOlvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sGSgyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r3Ww5GAJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3msdLDlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaB0sOlvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m9VmBJYAnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbeawWWBJbwXov3WrzX4r2W3mvxXivStrQNS3ivxXst3mv98V7338f6+y6o/nivf49hTGMZr/EZ2zjG/cZr27Xt2nZtu7Zd265t17Zr27Xt2fZse7Y9255tz7Zn27Pt2fZsa9vatratbWu/W/u3pP1bgiW81+K9Fu+1eK8VWBJYwnstvdfSey2919J7Ld5r8V6L91p6r6X3WnqvFVgSWMJ7Lb3X0nstvdfSey291+K9Fu+1eK+l91p6r6X3WokliSW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r5VYkljCey2919J7Lb3X0nstvdfivVY6l6RzCe+19F6L91q81+K9Fu+1eK/Fey3ea+m9lt5r6b1WOpekc4nea+m9lt5r5fUmnUv0XkvvtfReS++19F5L77X0XiudS9K5RO+19F5L77XyeZPOJXqvpfdaeq+l91p6r6X3Wnqvlc4l6Vyi91p6r8V7Ld5r8V6L91q81+K9Fu+1eK+l91p6r5VYwnstvdfSey2910osSSzhvZbea+m9lt5r6b2W3mvxXov3WrzX0nstvdfSe63CksIS3mvpvZbea+m9lt5r6b0W77V4r8V7Lb3X0nstvdcqLCks4b2W3mvpvZbea+m9lt5r8V6L91q819J7Lb3X0nutwhK91+K9VjmX6L1WYUlhSWEJ77V4r8V7rSrbyu+GJYUlhSW81yr3JYUlhSWFJYUlvNfivRbvterZ9vxuWFJYUljCe61yX1JYUlhSWFJYwnst3mvxXqucS8q5pLCksKSwhPda5VxSWFJYUlhSWMJ7Ld5r8V6rxrbxu2GJ3mvpvRbvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbea10suVjCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91oXSy6W8F5L77X0XkvvtfReS++1eK/Fey3ea+m9lt5r6b3WxZKLJbzX0nstvdfSey2919J7Ld5r8V6L91p6r6X3WnqvdbHkYgnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbea10suVjCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91oXSy6W8F5L77X0XkvvtfReS++1eK/Fey3ea+m9lt5r6b3WxZKLJbzX0nstvdfSey2919J7Ld5r8V6L91p6r6X3Wnqv9bDkYQnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbeaz0seVjCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91oPSx6W8F5L77X0XkvvtfReS++1eK/Fey3ea+m9lt5r6b3Ww5KHJbzX0nstvdfSey2919J7Ld5r8V6L91p6r6X3Wnqv9bDkYQnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbeaz0seVjCey3ea/Fei/daeq/Fe63n7lXvtXivxXst3mvxXuuP97p/jf/YduLf/rf/8P/+p3/9p//0n//5v/4//+F/////8R//r//53/7L//inf/lvf/3H//H//fe//5v//K//9M///E//93/87//6L//lv/6f//Nf/+t//Od/+S9//rt/+z/+7X8B", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "50": { - "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake3_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake3_hashed = std::hash::blake3(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake3_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = blake3_to_field(hash_input_flattened);\n blake3_digest\n}\n", + "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake2s_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake2s_hashed = std::hash::blake2s(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake2s_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake2s_digest = blake2s_to_field(hash_input_flattened);\n blake2s_digest\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 70e680bac1a..91812c5ad1c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -114721,7 +114721,7 @@ expression: artifact "EXPR [ (-1, _82942) (-1, _82943) 1 ]", "EXPR [ (1, _82932, _82933) (1, _82931) (-1, _82944) 0 ]", "EXPR [ (1, _82943, _82944) (1, _82942) -1 ]", - "BLACKBOX::BLAKE3 [(_288, 8), (_287, 8), (_286, 8), (_285, 8), (_284, 8), (_283, 8), (_282, 8), (_281, 8), (_280, 8), (_279, 8), (_278, 8), (_277, 8), (_276, 8), (_275, 8), (_274, 8), (_273, 8), (_272, 8), (_271, 8), (_270, 8), (_269, 8), (_268, 8), (_267, 8), (_266, 8), (_265, 8), (_264, 8), (_263, 8), (_262, 8), (_261, 8), (_260, 8), (_259, 8), (_258, 8), (_257, 8), (_611, 8), (_610, 8), (_609, 8), (_608, 8), (_607, 8), (_606, 8), (_605, 8), (_604, 8), (_603, 8), (_602, 8), (_601, 8), (_600, 8), (_599, 8), (_598, 8), (_597, 8), (_596, 8), (_595, 8), (_594, 8), (_593, 8), (_592, 8), (_591, 8), (_590, 8), (_589, 8), (_588, 8), (_587, 8), (_586, 8), (_585, 8), (_584, 8), (_583, 8), (_582, 8), (_581, 8), (_580, 8), (_934, 8), (_933, 8), (_932, 8), (_931, 8), (_930, 8), (_929, 8), (_928, 8), (_927, 8), (_926, 8), (_925, 8), (_924, 8), (_923, 8), (_922, 8), (_921, 8), (_920, 8), (_919, 8), (_918, 8), (_917, 8), (_916, 8), (_915, 8), (_914, 8), (_913, 8), (_912, 8), (_911, 8), (_910, 8), (_909, 8), (_908, 8), (_907, 8), (_906, 8), (_905, 8), (_904, 8), (_903, 8), (_1257, 8), (_1256, 8), (_1255, 8), (_1254, 8), (_1253, 8), (_1252, 8), (_1251, 8), (_1250, 8), (_1249, 8), (_1248, 8), (_1247, 8), (_1246, 8), (_1245, 8), (_1244, 8), (_1243, 8), (_1242, 8), (_1241, 8), (_1240, 8), (_1239, 8), (_1238, 8), (_1237, 8), (_1236, 8), (_1235, 8), (_1234, 8), (_1233, 8), (_1232, 8), (_1231, 8), (_1230, 8), (_1229, 8), (_1228, 8), (_1227, 8), (_1226, 8), (_1580, 8), (_1579, 8), (_1578, 8), (_1577, 8), (_1576, 8), (_1575, 8), (_1574, 8), (_1573, 8), (_1572, 8), (_1571, 8), (_1570, 8), (_1569, 8), (_1568, 8), (_1567, 8), (_1566, 8), (_1565, 8), (_1564, 8), (_1563, 8), (_1562, 8), (_1561, 8), (_1560, 8), (_1559, 8), (_1558, 8), (_1557, 8), (_1556, 8), (_1555, 8), (_1554, 8), (_1553, 8), (_1552, 8), (_1551, 8), (_1550, 8), (_1549, 8), (_1903, 8), (_1902, 8), (_1901, 8), (_1900, 8), (_1899, 8), (_1898, 8), (_1897, 8), (_1896, 8), (_1895, 8), (_1894, 8), (_1893, 8), (_1892, 8), (_1891, 8), (_1890, 8), (_1889, 8), (_1888, 8), (_1887, 8), (_1886, 8), (_1885, 8), (_1884, 8), (_1883, 8), (_1882, 8), (_1881, 8), (_1880, 8), (_1879, 8), (_1878, 8), (_1877, 8), (_1876, 8), (_1875, 8), (_1874, 8), (_1873, 8), (_1872, 8), (_2226, 8), (_2225, 8), (_2224, 8), (_2223, 8), (_2222, 8), (_2221, 8), (_2220, 8), (_2219, 8), (_2218, 8), (_2217, 8), (_2216, 8), (_2215, 8), (_2214, 8), (_2213, 8), (_2212, 8), (_2211, 8), (_2210, 8), (_2209, 8), (_2208, 8), (_2207, 8), (_2206, 8), (_2205, 8), (_2204, 8), (_2203, 8), (_2202, 8), (_2201, 8), (_2200, 8), (_2199, 8), (_2198, 8), (_2197, 8), (_2196, 8), (_2195, 8), (_2549, 8), (_2548, 8), (_2547, 8), (_2546, 8), (_2545, 8), (_2544, 8), (_2543, 8), (_2542, 8), (_2541, 8), (_2540, 8), (_2539, 8), (_2538, 8), (_2537, 8), (_2536, 8), (_2535, 8), (_2534, 8), (_2533, 8), (_2532, 8), (_2531, 8), (_2530, 8), (_2529, 8), (_2528, 8), (_2527, 8), (_2526, 8), (_2525, 8), (_2524, 8), (_2523, 8), (_2522, 8), (_2521, 8), (_2520, 8), (_2519, 8), (_2518, 8), (_2872, 8), (_2871, 8), (_2870, 8), (_2869, 8), (_2868, 8), (_2867, 8), (_2866, 8), (_2865, 8), (_2864, 8), (_2863, 8), (_2862, 8), (_2861, 8), (_2860, 8), (_2859, 8), (_2858, 8), (_2857, 8), (_2856, 8), (_2855, 8), (_2854, 8), (_2853, 8), (_2852, 8), (_2851, 8), (_2850, 8), (_2849, 8), (_2848, 8), (_2847, 8), (_2846, 8), (_2845, 8), (_2844, 8), (_2843, 8), (_2842, 8), (_2841, 8), (_3195, 8), (_3194, 8), (_3193, 8), (_3192, 8), (_3191, 8), (_3190, 8), (_3189, 8), (_3188, 8), (_3187, 8), (_3186, 8), (_3185, 8), (_3184, 8), (_3183, 8), (_3182, 8), (_3181, 8), (_3180, 8), (_3179, 8), (_3178, 8), (_3177, 8), (_3176, 8), (_3175, 8), (_3174, 8), (_3173, 8), (_3172, 8), (_3171, 8), (_3170, 8), (_3169, 8), (_3168, 8), (_3167, 8), (_3166, 8), (_3165, 8), (_3164, 8), (_3518, 8), (_3517, 8), (_3516, 8), (_3515, 8), (_3514, 8), (_3513, 8), (_3512, 8), (_3511, 8), (_3510, 8), (_3509, 8), (_3508, 8), (_3507, 8), (_3506, 8), (_3505, 8), (_3504, 8), (_3503, 8), (_3502, 8), (_3501, 8), (_3500, 8), (_3499, 8), (_3498, 8), (_3497, 8), (_3496, 8), (_3495, 8), (_3494, 8), (_3493, 8), (_3492, 8), (_3491, 8), (_3490, 8), (_3489, 8), (_3488, 8), (_3487, 8), (_3841, 8), (_3840, 8), (_3839, 8), (_3838, 8), (_3837, 8), (_3836, 8), (_3835, 8), (_3834, 8), (_3833, 8), (_3832, 8), (_3831, 8), (_3830, 8), (_3829, 8), (_3828, 8), (_3827, 8), (_3826, 8), (_3825, 8), (_3824, 8), (_3823, 8), (_3822, 8), (_3821, 8), (_3820, 8), (_3819, 8), (_3818, 8), (_3817, 8), (_3816, 8), (_3815, 8), (_3814, 8), (_3813, 8), (_3812, 8), (_3811, 8), (_3810, 8), (_4164, 8), (_4163, 8), (_4162, 8), (_4161, 8), (_4160, 8), (_4159, 8), (_4158, 8), (_4157, 8), (_4156, 8), (_4155, 8), (_4154, 8), (_4153, 8), (_4152, 8), (_4151, 8), (_4150, 8), (_4149, 8), (_4148, 8), (_4147, 8), (_4146, 8), (_4145, 8), (_4144, 8), (_4143, 8), (_4142, 8), (_4141, 8), (_4140, 8), (_4139, 8), (_4138, 8), (_4137, 8), (_4136, 8), (_4135, 8), (_4134, 8), (_4133, 8), (_4487, 8), (_4486, 8), (_4485, 8), (_4484, 8), (_4483, 8), (_4482, 8), (_4481, 8), (_4480, 8), (_4479, 8), (_4478, 8), (_4477, 8), (_4476, 8), (_4475, 8), (_4474, 8), (_4473, 8), (_4472, 8), (_4471, 8), (_4470, 8), (_4469, 8), (_4468, 8), (_4467, 8), (_4466, 8), (_4465, 8), (_4464, 8), (_4463, 8), (_4462, 8), (_4461, 8), (_4460, 8), (_4459, 8), (_4458, 8), (_4457, 8), (_4456, 8), (_4810, 8), (_4809, 8), (_4808, 8), (_4807, 8), (_4806, 8), (_4805, 8), (_4804, 8), (_4803, 8), (_4802, 8), (_4801, 8), (_4800, 8), (_4799, 8), (_4798, 8), (_4797, 8), (_4796, 8), (_4795, 8), (_4794, 8), (_4793, 8), (_4792, 8), (_4791, 8), (_4790, 8), (_4789, 8), (_4788, 8), (_4787, 8), (_4786, 8), (_4785, 8), (_4784, 8), (_4783, 8), (_4782, 8), (_4781, 8), (_4780, 8), (_4779, 8), (_5133, 8), (_5132, 8), (_5131, 8), (_5130, 8), (_5129, 8), (_5128, 8), (_5127, 8), (_5126, 8), (_5125, 8), (_5124, 8), (_5123, 8), (_5122, 8), (_5121, 8), (_5120, 8), (_5119, 8), (_5118, 8), (_5117, 8), (_5116, 8), (_5115, 8), (_5114, 8), (_5113, 8), (_5112, 8), (_5111, 8), (_5110, 8), (_5109, 8), (_5108, 8), (_5107, 8), (_5106, 8), (_5105, 8), (_5104, 8), (_5103, 8), (_5102, 8), (_5456, 8), (_5455, 8), (_5454, 8), (_5453, 8), (_5452, 8), (_5451, 8), (_5450, 8), (_5449, 8), (_5448, 8), (_5447, 8), (_5446, 8), (_5445, 8), (_5444, 8), (_5443, 8), (_5442, 8), (_5441, 8), (_5440, 8), (_5439, 8), (_5438, 8), (_5437, 8), (_5436, 8), (_5435, 8), (_5434, 8), (_5433, 8), (_5432, 8), (_5431, 8), (_5430, 8), (_5429, 8), (_5428, 8), (_5427, 8), (_5426, 8), (_5425, 8), (_5779, 8), (_5778, 8), (_5777, 8), (_5776, 8), (_5775, 8), (_5774, 8), (_5773, 8), (_5772, 8), (_5771, 8), (_5770, 8), (_5769, 8), (_5768, 8), (_5767, 8), (_5766, 8), (_5765, 8), (_5764, 8), (_5763, 8), (_5762, 8), (_5761, 8), (_5760, 8), (_5759, 8), (_5758, 8), (_5757, 8), (_5756, 8), (_5755, 8), (_5754, 8), (_5753, 8), (_5752, 8), (_5751, 8), (_5750, 8), (_5749, 8), (_5748, 8), (_6102, 8), (_6101, 8), (_6100, 8), (_6099, 8), (_6098, 8), (_6097, 8), (_6096, 8), (_6095, 8), (_6094, 8), (_6093, 8), (_6092, 8), (_6091, 8), (_6090, 8), (_6089, 8), (_6088, 8), (_6087, 8), (_6086, 8), (_6085, 8), (_6084, 8), (_6083, 8), (_6082, 8), (_6081, 8), (_6080, 8), (_6079, 8), (_6078, 8), (_6077, 8), (_6076, 8), (_6075, 8), (_6074, 8), (_6073, 8), (_6072, 8), (_6071, 8), (_6425, 8), (_6424, 8), (_6423, 8), (_6422, 8), (_6421, 8), (_6420, 8), (_6419, 8), (_6418, 8), (_6417, 8), (_6416, 8), (_6415, 8), (_6414, 8), (_6413, 8), (_6412, 8), (_6411, 8), (_6410, 8), (_6409, 8), (_6408, 8), (_6407, 8), (_6406, 8), (_6405, 8), (_6404, 8), (_6403, 8), (_6402, 8), (_6401, 8), (_6400, 8), (_6399, 8), (_6398, 8), (_6397, 8), (_6396, 8), (_6395, 8), (_6394, 8), (_6748, 8), (_6747, 8), (_6746, 8), (_6745, 8), (_6744, 8), (_6743, 8), (_6742, 8), (_6741, 8), (_6740, 8), (_6739, 8), (_6738, 8), (_6737, 8), (_6736, 8), (_6735, 8), (_6734, 8), (_6733, 8), (_6732, 8), (_6731, 8), (_6730, 8), (_6729, 8), (_6728, 8), (_6727, 8), (_6726, 8), (_6725, 8), (_6724, 8), (_6723, 8), (_6722, 8), (_6721, 8), (_6720, 8), (_6719, 8), (_6718, 8), (_6717, 8), (_7071, 8), (_7070, 8), (_7069, 8), (_7068, 8), (_7067, 8), (_7066, 8), (_7065, 8), (_7064, 8), (_7063, 8), (_7062, 8), (_7061, 8), (_7060, 8), (_7059, 8), (_7058, 8), (_7057, 8), (_7056, 8), (_7055, 8), (_7054, 8), (_7053, 8), (_7052, 8), (_7051, 8), (_7050, 8), (_7049, 8), (_7048, 8), (_7047, 8), (_7046, 8), (_7045, 8), (_7044, 8), (_7043, 8), (_7042, 8), (_7041, 8), (_7040, 8), (_7394, 8), (_7393, 8), (_7392, 8), (_7391, 8), (_7390, 8), (_7389, 8), (_7388, 8), (_7387, 8), (_7386, 8), (_7385, 8), (_7384, 8), (_7383, 8), (_7382, 8), (_7381, 8), (_7380, 8), (_7379, 8), (_7378, 8), (_7377, 8), (_7376, 8), (_7375, 8), (_7374, 8), (_7373, 8), (_7372, 8), (_7371, 8), (_7370, 8), (_7369, 8), (_7368, 8), (_7367, 8), (_7366, 8), (_7365, 8), (_7364, 8), (_7363, 8), (_7717, 8), (_7716, 8), (_7715, 8), (_7714, 8), (_7713, 8), (_7712, 8), (_7711, 8), (_7710, 8), (_7709, 8), (_7708, 8), (_7707, 8), (_7706, 8), (_7705, 8), (_7704, 8), (_7703, 8), (_7702, 8), (_7701, 8), (_7700, 8), (_7699, 8), (_7698, 8), (_7697, 8), (_7696, 8), (_7695, 8), (_7694, 8), (_7693, 8), (_7692, 8), (_7691, 8), (_7690, 8), (_7689, 8), (_7688, 8), (_7687, 8), (_7686, 8), (_8040, 8), (_8039, 8), (_8038, 8), (_8037, 8), (_8036, 8), (_8035, 8), (_8034, 8), (_8033, 8), (_8032, 8), (_8031, 8), (_8030, 8), (_8029, 8), (_8028, 8), (_8027, 8), (_8026, 8), (_8025, 8), (_8024, 8), (_8023, 8), (_8022, 8), (_8021, 8), (_8020, 8), (_8019, 8), (_8018, 8), (_8017, 8), (_8016, 8), (_8015, 8), (_8014, 8), (_8013, 8), (_8012, 8), (_8011, 8), (_8010, 8), (_8009, 8), (_8363, 8), (_8362, 8), (_8361, 8), (_8360, 8), (_8359, 8), (_8358, 8), (_8357, 8), (_8356, 8), (_8355, 8), (_8354, 8), (_8353, 8), (_8352, 8), (_8351, 8), (_8350, 8), (_8349, 8), (_8348, 8), (_8347, 8), (_8346, 8), (_8345, 8), (_8344, 8), (_8343, 8), (_8342, 8), (_8341, 8), (_8340, 8), (_8339, 8), (_8338, 8), (_8337, 8), (_8336, 8), (_8335, 8), (_8334, 8), (_8333, 8), (_8332, 8), (_8686, 8), (_8685, 8), (_8684, 8), (_8683, 8), (_8682, 8), (_8681, 8), (_8680, 8), (_8679, 8), (_8678, 8), (_8677, 8), (_8676, 8), (_8675, 8), (_8674, 8), (_8673, 8), (_8672, 8), (_8671, 8), (_8670, 8), (_8669, 8), (_8668, 8), (_8667, 8), (_8666, 8), (_8665, 8), (_8664, 8), (_8663, 8), (_8662, 8), (_8661, 8), (_8660, 8), (_8659, 8), (_8658, 8), (_8657, 8), (_8656, 8), (_8655, 8), (_9009, 8), (_9008, 8), (_9007, 8), (_9006, 8), (_9005, 8), (_9004, 8), (_9003, 8), (_9002, 8), (_9001, 8), (_9000, 8), (_8999, 8), (_8998, 8), (_8997, 8), (_8996, 8), (_8995, 8), (_8994, 8), (_8993, 8), (_8992, 8), (_8991, 8), (_8990, 8), (_8989, 8), (_8988, 8), (_8987, 8), (_8986, 8), (_8985, 8), (_8984, 8), (_8983, 8), (_8982, 8), (_8981, 8), (_8980, 8), (_8979, 8), (_8978, 8), (_9332, 8), (_9331, 8), (_9330, 8), (_9329, 8), (_9328, 8), (_9327, 8), (_9326, 8), (_9325, 8), (_9324, 8), (_9323, 8), (_9322, 8), (_9321, 8), (_9320, 8), (_9319, 8), (_9318, 8), (_9317, 8), (_9316, 8), (_9315, 8), (_9314, 8), (_9313, 8), (_9312, 8), (_9311, 8), (_9310, 8), (_9309, 8), (_9308, 8), (_9307, 8), (_9306, 8), (_9305, 8), (_9304, 8), (_9303, 8), (_9302, 8), (_9301, 8), (_9655, 8), (_9654, 8), (_9653, 8), (_9652, 8), (_9651, 8), (_9650, 8), (_9649, 8), (_9648, 8), (_9647, 8), (_9646, 8), (_9645, 8), (_9644, 8), (_9643, 8), (_9642, 8), (_9641, 8), (_9640, 8), (_9639, 8), (_9638, 8), (_9637, 8), (_9636, 8), (_9635, 8), (_9634, 8), (_9633, 8), (_9632, 8), (_9631, 8), (_9630, 8), (_9629, 8), (_9628, 8), (_9627, 8), (_9626, 8), (_9625, 8), (_9624, 8), (_9978, 8), (_9977, 8), (_9976, 8), (_9975, 8), (_9974, 8), (_9973, 8), (_9972, 8), (_9971, 8), (_9970, 8), (_9969, 8), (_9968, 8), (_9967, 8), (_9966, 8), (_9965, 8), (_9964, 8), (_9963, 8), (_9962, 8), (_9961, 8), (_9960, 8), (_9959, 8), (_9958, 8), (_9957, 8), (_9956, 8), (_9955, 8), (_9954, 8), (_9953, 8), (_9952, 8), (_9951, 8), (_9950, 8), (_9949, 8), (_9948, 8), (_9947, 8), (_10301, 8), (_10300, 8), (_10299, 8), (_10298, 8), (_10297, 8), (_10296, 8), (_10295, 8), (_10294, 8), (_10293, 8), (_10292, 8), (_10291, 8), (_10290, 8), (_10289, 8), (_10288, 8), (_10287, 8), (_10286, 8), (_10285, 8), (_10284, 8), (_10283, 8), (_10282, 8), (_10281, 8), (_10280, 8), (_10279, 8), (_10278, 8), (_10277, 8), (_10276, 8), (_10275, 8), (_10274, 8), (_10273, 8), (_10272, 8), (_10271, 8), (_10270, 8), (_10624, 8), (_10623, 8), (_10622, 8), (_10621, 8), (_10620, 8), (_10619, 8), (_10618, 8), (_10617, 8), (_10616, 8), (_10615, 8), (_10614, 8), (_10613, 8), (_10612, 8), (_10611, 8), (_10610, 8), (_10609, 8), (_10608, 8), (_10607, 8), (_10606, 8), (_10605, 8), (_10604, 8), (_10603, 8), (_10602, 8), (_10601, 8), (_10600, 8), (_10599, 8), (_10598, 8), (_10597, 8), (_10596, 8), (_10595, 8), (_10594, 8), (_10593, 8), (_10947, 8), (_10946, 8), (_10945, 8), (_10944, 8), (_10943, 8), (_10942, 8), (_10941, 8), (_10940, 8), (_10939, 8), (_10938, 8), (_10937, 8), (_10936, 8), (_10935, 8), (_10934, 8), (_10933, 8), (_10932, 8), (_10931, 8), (_10930, 8), (_10929, 8), (_10928, 8), (_10927, 8), (_10926, 8), (_10925, 8), (_10924, 8), (_10923, 8), (_10922, 8), (_10921, 8), (_10920, 8), (_10919, 8), (_10918, 8), (_10917, 8), (_10916, 8), (_11270, 8), (_11269, 8), (_11268, 8), (_11267, 8), (_11266, 8), (_11265, 8), (_11264, 8), (_11263, 8), (_11262, 8), (_11261, 8), (_11260, 8), (_11259, 8), (_11258, 8), (_11257, 8), (_11256, 8), (_11255, 8), (_11254, 8), (_11253, 8), (_11252, 8), (_11251, 8), (_11250, 8), (_11249, 8), (_11248, 8), (_11247, 8), (_11246, 8), (_11245, 8), (_11244, 8), (_11243, 8), (_11242, 8), (_11241, 8), (_11240, 8), (_11239, 8), (_11593, 8), (_11592, 8), (_11591, 8), (_11590, 8), (_11589, 8), (_11588, 8), (_11587, 8), (_11586, 8), (_11585, 8), (_11584, 8), (_11583, 8), (_11582, 8), (_11581, 8), (_11580, 8), (_11579, 8), (_11578, 8), (_11577, 8), (_11576, 8), (_11575, 8), (_11574, 8), (_11573, 8), (_11572, 8), (_11571, 8), (_11570, 8), (_11569, 8), (_11568, 8), (_11567, 8), (_11566, 8), (_11565, 8), (_11564, 8), (_11563, 8), (_11562, 8), (_11916, 8), (_11915, 8), (_11914, 8), (_11913, 8), (_11912, 8), (_11911, 8), (_11910, 8), (_11909, 8), (_11908, 8), (_11907, 8), (_11906, 8), (_11905, 8), (_11904, 8), (_11903, 8), (_11902, 8), (_11901, 8), (_11900, 8), (_11899, 8), (_11898, 8), (_11897, 8), (_11896, 8), (_11895, 8), (_11894, 8), (_11893, 8), (_11892, 8), (_11891, 8), (_11890, 8), (_11889, 8), (_11888, 8), (_11887, 8), (_11886, 8), (_11885, 8), (_12239, 8), (_12238, 8), (_12237, 8), (_12236, 8), (_12235, 8), (_12234, 8), (_12233, 8), (_12232, 8), (_12231, 8), (_12230, 8), (_12229, 8), (_12228, 8), (_12227, 8), (_12226, 8), (_12225, 8), (_12224, 8), (_12223, 8), (_12222, 8), (_12221, 8), (_12220, 8), (_12219, 8), (_12218, 8), (_12217, 8), (_12216, 8), (_12215, 8), (_12214, 8), (_12213, 8), (_12212, 8), (_12211, 8), (_12210, 8), (_12209, 8), (_12208, 8), (_12562, 8), (_12561, 8), (_12560, 8), (_12559, 8), (_12558, 8), (_12557, 8), (_12556, 8), (_12555, 8), (_12554, 8), (_12553, 8), (_12552, 8), (_12551, 8), (_12550, 8), (_12549, 8), (_12548, 8), (_12547, 8), (_12546, 8), (_12545, 8), (_12544, 8), (_12543, 8), (_12542, 8), (_12541, 8), (_12540, 8), (_12539, 8), (_12538, 8), (_12537, 8), (_12536, 8), (_12535, 8), (_12534, 8), (_12533, 8), (_12532, 8), (_12531, 8), (_12885, 8), (_12884, 8), (_12883, 8), (_12882, 8), (_12881, 8), (_12880, 8), (_12879, 8), (_12878, 8), (_12877, 8), (_12876, 8), (_12875, 8), (_12874, 8), (_12873, 8), (_12872, 8), (_12871, 8), (_12870, 8), (_12869, 8), (_12868, 8), (_12867, 8), (_12866, 8), (_12865, 8), (_12864, 8), (_12863, 8), (_12862, 8), (_12861, 8), (_12860, 8), (_12859, 8), (_12858, 8), (_12857, 8), (_12856, 8), (_12855, 8), (_12854, 8), (_13208, 8), (_13207, 8), (_13206, 8), (_13205, 8), (_13204, 8), (_13203, 8), (_13202, 8), (_13201, 8), (_13200, 8), (_13199, 8), (_13198, 8), (_13197, 8), (_13196, 8), (_13195, 8), (_13194, 8), (_13193, 8), (_13192, 8), (_13191, 8), (_13190, 8), (_13189, 8), (_13188, 8), (_13187, 8), (_13186, 8), (_13185, 8), (_13184, 8), (_13183, 8), (_13182, 8), (_13181, 8), (_13180, 8), (_13179, 8), (_13178, 8), (_13177, 8), (_13531, 8), (_13530, 8), (_13529, 8), (_13528, 8), (_13527, 8), (_13526, 8), (_13525, 8), (_13524, 8), (_13523, 8), (_13522, 8), (_13521, 8), (_13520, 8), (_13519, 8), (_13518, 8), (_13517, 8), (_13516, 8), (_13515, 8), (_13514, 8), (_13513, 8), (_13512, 8), (_13511, 8), (_13510, 8), (_13509, 8), (_13508, 8), (_13507, 8), (_13506, 8), (_13505, 8), (_13504, 8), (_13503, 8), (_13502, 8), (_13501, 8), (_13500, 8), (_13854, 8), (_13853, 8), (_13852, 8), (_13851, 8), (_13850, 8), (_13849, 8), (_13848, 8), (_13847, 8), (_13846, 8), (_13845, 8), (_13844, 8), (_13843, 8), (_13842, 8), (_13841, 8), (_13840, 8), (_13839, 8), (_13838, 8), (_13837, 8), (_13836, 8), (_13835, 8), (_13834, 8), (_13833, 8), (_13832, 8), (_13831, 8), (_13830, 8), (_13829, 8), (_13828, 8), (_13827, 8), (_13826, 8), (_13825, 8), (_13824, 8), (_13823, 8), (_14177, 8), (_14176, 8), (_14175, 8), (_14174, 8), (_14173, 8), (_14172, 8), (_14171, 8), (_14170, 8), (_14169, 8), (_14168, 8), (_14167, 8), (_14166, 8), (_14165, 8), (_14164, 8), (_14163, 8), (_14162, 8), (_14161, 8), (_14160, 8), (_14159, 8), (_14158, 8), (_14157, 8), (_14156, 8), (_14155, 8), (_14154, 8), (_14153, 8), (_14152, 8), (_14151, 8), (_14150, 8), (_14149, 8), (_14148, 8), (_14147, 8), (_14146, 8), (_14500, 8), (_14499, 8), (_14498, 8), (_14497, 8), (_14496, 8), (_14495, 8), (_14494, 8), (_14493, 8), (_14492, 8), (_14491, 8), (_14490, 8), (_14489, 8), (_14488, 8), (_14487, 8), (_14486, 8), (_14485, 8), (_14484, 8), (_14483, 8), (_14482, 8), (_14481, 8), (_14480, 8), (_14479, 8), (_14478, 8), (_14477, 8), (_14476, 8), (_14475, 8), (_14474, 8), (_14473, 8), (_14472, 8), (_14471, 8), (_14470, 8), (_14469, 8), (_14823, 8), (_14822, 8), (_14821, 8), (_14820, 8), (_14819, 8), (_14818, 8), (_14817, 8), (_14816, 8), (_14815, 8), (_14814, 8), (_14813, 8), (_14812, 8), (_14811, 8), (_14810, 8), (_14809, 8), (_14808, 8), (_14807, 8), (_14806, 8), (_14805, 8), (_14804, 8), (_14803, 8), (_14802, 8), (_14801, 8), (_14800, 8), (_14799, 8), (_14798, 8), (_14797, 8), (_14796, 8), (_14795, 8), (_14794, 8), (_14793, 8), (_14792, 8), (_15146, 8), (_15145, 8), (_15144, 8), (_15143, 8), (_15142, 8), (_15141, 8), (_15140, 8), (_15139, 8), (_15138, 8), (_15137, 8), (_15136, 8), (_15135, 8), (_15134, 8), (_15133, 8), (_15132, 8), (_15131, 8), (_15130, 8), (_15129, 8), (_15128, 8), (_15127, 8), (_15126, 8), (_15125, 8), (_15124, 8), (_15123, 8), (_15122, 8), (_15121, 8), (_15120, 8), (_15119, 8), (_15118, 8), (_15117, 8), (_15116, 8), (_15115, 8), (_15469, 8), (_15468, 8), (_15467, 8), (_15466, 8), (_15465, 8), (_15464, 8), (_15463, 8), (_15462, 8), (_15461, 8), (_15460, 8), (_15459, 8), (_15458, 8), (_15457, 8), (_15456, 8), (_15455, 8), (_15454, 8), (_15453, 8), (_15452, 8), (_15451, 8), (_15450, 8), (_15449, 8), (_15448, 8), (_15447, 8), (_15446, 8), (_15445, 8), (_15444, 8), (_15443, 8), (_15442, 8), (_15441, 8), (_15440, 8), (_15439, 8), (_15438, 8), (_15792, 8), (_15791, 8), (_15790, 8), (_15789, 8), (_15788, 8), (_15787, 8), (_15786, 8), (_15785, 8), (_15784, 8), (_15783, 8), (_15782, 8), (_15781, 8), (_15780, 8), (_15779, 8), (_15778, 8), (_15777, 8), (_15776, 8), (_15775, 8), (_15774, 8), (_15773, 8), (_15772, 8), (_15771, 8), (_15770, 8), (_15769, 8), (_15768, 8), (_15767, 8), (_15766, 8), (_15765, 8), (_15764, 8), (_15763, 8), (_15762, 8), (_15761, 8), (_16115, 8), (_16114, 8), (_16113, 8), (_16112, 8), (_16111, 8), (_16110, 8), (_16109, 8), (_16108, 8), (_16107, 8), (_16106, 8), (_16105, 8), (_16104, 8), (_16103, 8), (_16102, 8), (_16101, 8), (_16100, 8), (_16099, 8), (_16098, 8), (_16097, 8), (_16096, 8), (_16095, 8), (_16094, 8), (_16093, 8), (_16092, 8), (_16091, 8), (_16090, 8), (_16089, 8), (_16088, 8), (_16087, 8), (_16086, 8), (_16085, 8), (_16084, 8), (_16438, 8), (_16437, 8), (_16436, 8), (_16435, 8), (_16434, 8), (_16433, 8), (_16432, 8), (_16431, 8), (_16430, 8), (_16429, 8), (_16428, 8), (_16427, 8), (_16426, 8), (_16425, 8), (_16424, 8), (_16423, 8), (_16422, 8), (_16421, 8), (_16420, 8), (_16419, 8), (_16418, 8), (_16417, 8), (_16416, 8), (_16415, 8), (_16414, 8), (_16413, 8), (_16412, 8), (_16411, 8), (_16410, 8), (_16409, 8), (_16408, 8), (_16407, 8), (_16761, 8), (_16760, 8), (_16759, 8), (_16758, 8), (_16757, 8), (_16756, 8), (_16755, 8), (_16754, 8), (_16753, 8), (_16752, 8), (_16751, 8), (_16750, 8), (_16749, 8), (_16748, 8), (_16747, 8), (_16746, 8), (_16745, 8), (_16744, 8), (_16743, 8), (_16742, 8), (_16741, 8), (_16740, 8), (_16739, 8), (_16738, 8), (_16737, 8), (_16736, 8), (_16735, 8), (_16734, 8), (_16733, 8), (_16732, 8), (_16731, 8), (_16730, 8), (_17084, 8), (_17083, 8), (_17082, 8), (_17081, 8), (_17080, 8), (_17079, 8), (_17078, 8), (_17077, 8), (_17076, 8), (_17075, 8), (_17074, 8), (_17073, 8), (_17072, 8), (_17071, 8), (_17070, 8), (_17069, 8), (_17068, 8), (_17067, 8), (_17066, 8), (_17065, 8), (_17064, 8), (_17063, 8), (_17062, 8), (_17061, 8), (_17060, 8), (_17059, 8), (_17058, 8), (_17057, 8), (_17056, 8), (_17055, 8), (_17054, 8), (_17053, 8), (_17407, 8), (_17406, 8), (_17405, 8), (_17404, 8), (_17403, 8), (_17402, 8), (_17401, 8), (_17400, 8), (_17399, 8), (_17398, 8), (_17397, 8), (_17396, 8), (_17395, 8), (_17394, 8), (_17393, 8), (_17392, 8), (_17391, 8), (_17390, 8), (_17389, 8), (_17388, 8), (_17387, 8), (_17386, 8), (_17385, 8), (_17384, 8), (_17383, 8), (_17382, 8), (_17381, 8), (_17380, 8), (_17379, 8), (_17378, 8), (_17377, 8), (_17376, 8), (_17730, 8), (_17729, 8), (_17728, 8), (_17727, 8), (_17726, 8), (_17725, 8), (_17724, 8), (_17723, 8), (_17722, 8), (_17721, 8), (_17720, 8), (_17719, 8), (_17718, 8), (_17717, 8), (_17716, 8), (_17715, 8), (_17714, 8), (_17713, 8), (_17712, 8), (_17711, 8), (_17710, 8), (_17709, 8), (_17708, 8), (_17707, 8), (_17706, 8), (_17705, 8), (_17704, 8), (_17703, 8), (_17702, 8), (_17701, 8), (_17700, 8), (_17699, 8), (_18053, 8), (_18052, 8), (_18051, 8), (_18050, 8), (_18049, 8), (_18048, 8), (_18047, 8), (_18046, 8), (_18045, 8), (_18044, 8), (_18043, 8), (_18042, 8), (_18041, 8), (_18040, 8), (_18039, 8), (_18038, 8), (_18037, 8), (_18036, 8), (_18035, 8), (_18034, 8), (_18033, 8), (_18032, 8), (_18031, 8), (_18030, 8), (_18029, 8), (_18028, 8), (_18027, 8), (_18026, 8), (_18025, 8), (_18024, 8), (_18023, 8), (_18022, 8), (_18376, 8), (_18375, 8), (_18374, 8), (_18373, 8), (_18372, 8), (_18371, 8), (_18370, 8), (_18369, 8), (_18368, 8), (_18367, 8), (_18366, 8), (_18365, 8), (_18364, 8), (_18363, 8), (_18362, 8), (_18361, 8), (_18360, 8), (_18359, 8), (_18358, 8), (_18357, 8), (_18356, 8), (_18355, 8), (_18354, 8), (_18353, 8), (_18352, 8), (_18351, 8), (_18350, 8), (_18349, 8), (_18348, 8), (_18347, 8), (_18346, 8), (_18345, 8), (_18699, 8), (_18698, 8), (_18697, 8), (_18696, 8), (_18695, 8), (_18694, 8), (_18693, 8), (_18692, 8), (_18691, 8), (_18690, 8), (_18689, 8), (_18688, 8), (_18687, 8), (_18686, 8), (_18685, 8), (_18684, 8), (_18683, 8), (_18682, 8), (_18681, 8), (_18680, 8), (_18679, 8), (_18678, 8), (_18677, 8), (_18676, 8), (_18675, 8), (_18674, 8), (_18673, 8), (_18672, 8), (_18671, 8), (_18670, 8), (_18669, 8), (_18668, 8), (_19022, 8), (_19021, 8), (_19020, 8), (_19019, 8), (_19018, 8), (_19017, 8), (_19016, 8), (_19015, 8), (_19014, 8), (_19013, 8), (_19012, 8), (_19011, 8), (_19010, 8), (_19009, 8), (_19008, 8), (_19007, 8), (_19006, 8), (_19005, 8), (_19004, 8), (_19003, 8), (_19002, 8), (_19001, 8), (_19000, 8), (_18999, 8), (_18998, 8), (_18997, 8), (_18996, 8), (_18995, 8), (_18994, 8), (_18993, 8), (_18992, 8), (_18991, 8), (_19345, 8), (_19344, 8), (_19343, 8), (_19342, 8), (_19341, 8), (_19340, 8), (_19339, 8), (_19338, 8), (_19337, 8), (_19336, 8), (_19335, 8), (_19334, 8), (_19333, 8), (_19332, 8), (_19331, 8), (_19330, 8), (_19329, 8), (_19328, 8), (_19327, 8), (_19326, 8), (_19325, 8), (_19324, 8), (_19323, 8), (_19322, 8), (_19321, 8), (_19320, 8), (_19319, 8), (_19318, 8), (_19317, 8), (_19316, 8), (_19315, 8), (_19314, 8), (_19668, 8), (_19667, 8), (_19666, 8), (_19665, 8), (_19664, 8), (_19663, 8), (_19662, 8), (_19661, 8), (_19660, 8), (_19659, 8), (_19658, 8), (_19657, 8), (_19656, 8), (_19655, 8), (_19654, 8), (_19653, 8), (_19652, 8), (_19651, 8), (_19650, 8), (_19649, 8), (_19648, 8), (_19647, 8), (_19646, 8), (_19645, 8), (_19644, 8), (_19643, 8), (_19642, 8), (_19641, 8), (_19640, 8), (_19639, 8), (_19638, 8), (_19637, 8), (_19991, 8), (_19990, 8), (_19989, 8), (_19988, 8), (_19987, 8), (_19986, 8), (_19985, 8), (_19984, 8), (_19983, 8), (_19982, 8), (_19981, 8), (_19980, 8), (_19979, 8), (_19978, 8), (_19977, 8), (_19976, 8), (_19975, 8), (_19974, 8), (_19973, 8), (_19972, 8), (_19971, 8), (_19970, 8), (_19969, 8), (_19968, 8), (_19967, 8), (_19966, 8), (_19965, 8), (_19964, 8), (_19963, 8), (_19962, 8), (_19961, 8), (_19960, 8), (_20314, 8), (_20313, 8), (_20312, 8), (_20311, 8), (_20310, 8), (_20309, 8), (_20308, 8), (_20307, 8), (_20306, 8), (_20305, 8), (_20304, 8), (_20303, 8), (_20302, 8), (_20301, 8), (_20300, 8), (_20299, 8), (_20298, 8), (_20297, 8), (_20296, 8), (_20295, 8), (_20294, 8), (_20293, 8), (_20292, 8), (_20291, 8), (_20290, 8), (_20289, 8), (_20288, 8), (_20287, 8), (_20286, 8), (_20285, 8), (_20284, 8), (_20283, 8), (_20637, 8), (_20636, 8), (_20635, 8), (_20634, 8), (_20633, 8), (_20632, 8), (_20631, 8), (_20630, 8), (_20629, 8), (_20628, 8), (_20627, 8), (_20626, 8), (_20625, 8), (_20624, 8), (_20623, 8), (_20622, 8), (_20621, 8), (_20620, 8), (_20619, 8), (_20618, 8), (_20617, 8), (_20616, 8), (_20615, 8), (_20614, 8), (_20613, 8), (_20612, 8), (_20611, 8), (_20610, 8), (_20609, 8), (_20608, 8), (_20607, 8), (_20606, 8), (_20960, 8), (_20959, 8), (_20958, 8), (_20957, 8), (_20956, 8), (_20955, 8), (_20954, 8), (_20953, 8), (_20952, 8), (_20951, 8), (_20950, 8), (_20949, 8), (_20948, 8), (_20947, 8), (_20946, 8), (_20945, 8), (_20944, 8), (_20943, 8), (_20942, 8), (_20941, 8), (_20940, 8), (_20939, 8), (_20938, 8), (_20937, 8), (_20936, 8), (_20935, 8), (_20934, 8), (_20933, 8), (_20932, 8), (_20931, 8), (_20930, 8), (_20929, 8), (_21283, 8), (_21282, 8), (_21281, 8), (_21280, 8), (_21279, 8), (_21278, 8), (_21277, 8), (_21276, 8), (_21275, 8), (_21274, 8), (_21273, 8), (_21272, 8), (_21271, 8), (_21270, 8), (_21269, 8), (_21268, 8), (_21267, 8), (_21266, 8), (_21265, 8), (_21264, 8), (_21263, 8), (_21262, 8), (_21261, 8), (_21260, 8), (_21259, 8), (_21258, 8), (_21257, 8), (_21256, 8), (_21255, 8), (_21254, 8), (_21253, 8), (_21252, 8), (_21606, 8), (_21605, 8), (_21604, 8), (_21603, 8), (_21602, 8), (_21601, 8), (_21600, 8), (_21599, 8), (_21598, 8), (_21597, 8), (_21596, 8), (_21595, 8), (_21594, 8), (_21593, 8), (_21592, 8), (_21591, 8), (_21590, 8), (_21589, 8), (_21588, 8), (_21587, 8), (_21586, 8), (_21585, 8), (_21584, 8), (_21583, 8), (_21582, 8), (_21581, 8), (_21580, 8), (_21579, 8), (_21578, 8), (_21577, 8), (_21576, 8), (_21575, 8), (_21929, 8), (_21928, 8), (_21927, 8), (_21926, 8), (_21925, 8), (_21924, 8), (_21923, 8), (_21922, 8), (_21921, 8), (_21920, 8), (_21919, 8), (_21918, 8), (_21917, 8), (_21916, 8), (_21915, 8), (_21914, 8), (_21913, 8), (_21912, 8), (_21911, 8), (_21910, 8), (_21909, 8), (_21908, 8), (_21907, 8), (_21906, 8), (_21905, 8), (_21904, 8), (_21903, 8), (_21902, 8), (_21901, 8), (_21900, 8), (_21899, 8), (_21898, 8), (_22252, 8), (_22251, 8), (_22250, 8), (_22249, 8), (_22248, 8), (_22247, 8), (_22246, 8), (_22245, 8), (_22244, 8), (_22243, 8), (_22242, 8), (_22241, 8), (_22240, 8), (_22239, 8), (_22238, 8), (_22237, 8), (_22236, 8), (_22235, 8), (_22234, 8), (_22233, 8), (_22232, 8), (_22231, 8), (_22230, 8), (_22229, 8), (_22228, 8), (_22227, 8), (_22226, 8), (_22225, 8), (_22224, 8), (_22223, 8), (_22222, 8), (_22221, 8), (_22575, 8), (_22574, 8), (_22573, 8), (_22572, 8), (_22571, 8), (_22570, 8), (_22569, 8), (_22568, 8), (_22567, 8), (_22566, 8), (_22565, 8), (_22564, 8), (_22563, 8), (_22562, 8), (_22561, 8), (_22560, 8), (_22559, 8), (_22558, 8), (_22557, 8), (_22556, 8), (_22555, 8), (_22554, 8), (_22553, 8), (_22552, 8), (_22551, 8), (_22550, 8), (_22549, 8), (_22548, 8), (_22547, 8), (_22546, 8), (_22545, 8), (_22544, 8), (_22898, 8), (_22897, 8), (_22896, 8), (_22895, 8), (_22894, 8), (_22893, 8), (_22892, 8), (_22891, 8), (_22890, 8), (_22889, 8), (_22888, 8), (_22887, 8), (_22886, 8), (_22885, 8), (_22884, 8), (_22883, 8), (_22882, 8), (_22881, 8), (_22880, 8), (_22879, 8), (_22878, 8), (_22877, 8), (_22876, 8), (_22875, 8), (_22874, 8), (_22873, 8), (_22872, 8), (_22871, 8), (_22870, 8), (_22869, 8), (_22868, 8), (_22867, 8), (_23221, 8), (_23220, 8), (_23219, 8), (_23218, 8), (_23217, 8), (_23216, 8), (_23215, 8), (_23214, 8), (_23213, 8), (_23212, 8), (_23211, 8), (_23210, 8), (_23209, 8), (_23208, 8), (_23207, 8), (_23206, 8), (_23205, 8), (_23204, 8), (_23203, 8), (_23202, 8), (_23201, 8), (_23200, 8), (_23199, 8), (_23198, 8), (_23197, 8), (_23196, 8), (_23195, 8), (_23194, 8), (_23193, 8), (_23192, 8), (_23191, 8), (_23190, 8), (_23544, 8), (_23543, 8), (_23542, 8), (_23541, 8), (_23540, 8), (_23539, 8), (_23538, 8), (_23537, 8), (_23536, 8), (_23535, 8), (_23534, 8), (_23533, 8), (_23532, 8), (_23531, 8), (_23530, 8), (_23529, 8), (_23528, 8), (_23527, 8), (_23526, 8), (_23525, 8), (_23524, 8), (_23523, 8), (_23522, 8), (_23521, 8), (_23520, 8), (_23519, 8), (_23518, 8), (_23517, 8), (_23516, 8), (_23515, 8), (_23514, 8), (_23513, 8), (_23867, 8), (_23866, 8), (_23865, 8), (_23864, 8), (_23863, 8), (_23862, 8), (_23861, 8), (_23860, 8), (_23859, 8), (_23858, 8), (_23857, 8), (_23856, 8), (_23855, 8), (_23854, 8), (_23853, 8), (_23852, 8), (_23851, 8), (_23850, 8), (_23849, 8), (_23848, 8), (_23847, 8), (_23846, 8), (_23845, 8), (_23844, 8), (_23843, 8), (_23842, 8), (_23841, 8), (_23840, 8), (_23839, 8), (_23838, 8), (_23837, 8), (_23836, 8), (_24190, 8), (_24189, 8), (_24188, 8), (_24187, 8), (_24186, 8), (_24185, 8), (_24184, 8), (_24183, 8), (_24182, 8), (_24181, 8), (_24180, 8), (_24179, 8), (_24178, 8), (_24177, 8), (_24176, 8), (_24175, 8), (_24174, 8), (_24173, 8), (_24172, 8), (_24171, 8), (_24170, 8), (_24169, 8), (_24168, 8), (_24167, 8), (_24166, 8), (_24165, 8), (_24164, 8), (_24163, 8), (_24162, 8), (_24161, 8), (_24160, 8), (_24159, 8), (_24513, 8), (_24512, 8), (_24511, 8), (_24510, 8), (_24509, 8), (_24508, 8), (_24507, 8), (_24506, 8), (_24505, 8), (_24504, 8), (_24503, 8), (_24502, 8), (_24501, 8), (_24500, 8), (_24499, 8), (_24498, 8), (_24497, 8), (_24496, 8), (_24495, 8), (_24494, 8), (_24493, 8), (_24492, 8), (_24491, 8), (_24490, 8), (_24489, 8), (_24488, 8), (_24487, 8), (_24486, 8), (_24485, 8), (_24484, 8), (_24483, 8), (_24482, 8), (_24836, 8), (_24835, 8), (_24834, 8), (_24833, 8), (_24832, 8), (_24831, 8), (_24830, 8), (_24829, 8), (_24828, 8), (_24827, 8), (_24826, 8), (_24825, 8), (_24824, 8), (_24823, 8), (_24822, 8), (_24821, 8), (_24820, 8), (_24819, 8), (_24818, 8), (_24817, 8), (_24816, 8), (_24815, 8), (_24814, 8), (_24813, 8), (_24812, 8), (_24811, 8), (_24810, 8), (_24809, 8), (_24808, 8), (_24807, 8), (_24806, 8), (_24805, 8), (_25159, 8), (_25158, 8), (_25157, 8), (_25156, 8), (_25155, 8), (_25154, 8), (_25153, 8), (_25152, 8), (_25151, 8), (_25150, 8), (_25149, 8), (_25148, 8), (_25147, 8), (_25146, 8), (_25145, 8), (_25144, 8), (_25143, 8), (_25142, 8), (_25141, 8), (_25140, 8), (_25139, 8), (_25138, 8), (_25137, 8), (_25136, 8), (_25135, 8), (_25134, 8), (_25133, 8), (_25132, 8), (_25131, 8), (_25130, 8), (_25129, 8), (_25128, 8), (_25482, 8), (_25481, 8), (_25480, 8), (_25479, 8), (_25478, 8), (_25477, 8), (_25476, 8), (_25475, 8), (_25474, 8), (_25473, 8), (_25472, 8), (_25471, 8), (_25470, 8), (_25469, 8), (_25468, 8), (_25467, 8), (_25466, 8), (_25465, 8), (_25464, 8), (_25463, 8), (_25462, 8), (_25461, 8), (_25460, 8), (_25459, 8), (_25458, 8), (_25457, 8), (_25456, 8), (_25455, 8), (_25454, 8), (_25453, 8), (_25452, 8), (_25451, 8), (_25805, 8), (_25804, 8), (_25803, 8), (_25802, 8), (_25801, 8), (_25800, 8), (_25799, 8), (_25798, 8), (_25797, 8), (_25796, 8), (_25795, 8), (_25794, 8), (_25793, 8), (_25792, 8), (_25791, 8), (_25790, 8), (_25789, 8), (_25788, 8), (_25787, 8), (_25786, 8), (_25785, 8), (_25784, 8), (_25783, 8), (_25782, 8), (_25781, 8), (_25780, 8), (_25779, 8), (_25778, 8), (_25777, 8), (_25776, 8), (_25775, 8), (_25774, 8), (_26128, 8), (_26127, 8), (_26126, 8), (_26125, 8), (_26124, 8), (_26123, 8), (_26122, 8), (_26121, 8), (_26120, 8), (_26119, 8), (_26118, 8), (_26117, 8), (_26116, 8), (_26115, 8), (_26114, 8), (_26113, 8), (_26112, 8), (_26111, 8), (_26110, 8), (_26109, 8), (_26108, 8), (_26107, 8), (_26106, 8), (_26105, 8), (_26104, 8), (_26103, 8), (_26102, 8), (_26101, 8), (_26100, 8), (_26099, 8), (_26098, 8), (_26097, 8), (_26451, 8), (_26450, 8), (_26449, 8), (_26448, 8), (_26447, 8), (_26446, 8), (_26445, 8), (_26444, 8), (_26443, 8), (_26442, 8), (_26441, 8), (_26440, 8), (_26439, 8), (_26438, 8), (_26437, 8), (_26436, 8), (_26435, 8), (_26434, 8), (_26433, 8), (_26432, 8), (_26431, 8), (_26430, 8), (_26429, 8), (_26428, 8), (_26427, 8), (_26426, 8), (_26425, 8), (_26424, 8), (_26423, 8), (_26422, 8), (_26421, 8), (_26420, 8), (_26774, 8), (_26773, 8), (_26772, 8), (_26771, 8), (_26770, 8), (_26769, 8), (_26768, 8), (_26767, 8), (_26766, 8), (_26765, 8), (_26764, 8), (_26763, 8), (_26762, 8), (_26761, 8), (_26760, 8), (_26759, 8), (_26758, 8), (_26757, 8), (_26756, 8), (_26755, 8), (_26754, 8), (_26753, 8), (_26752, 8), (_26751, 8), (_26750, 8), (_26749, 8), (_26748, 8), (_26747, 8), (_26746, 8), (_26745, 8), (_26744, 8), (_26743, 8), (_27097, 8), (_27096, 8), (_27095, 8), (_27094, 8), (_27093, 8), (_27092, 8), (_27091, 8), (_27090, 8), (_27089, 8), (_27088, 8), (_27087, 8), (_27086, 8), (_27085, 8), (_27084, 8), (_27083, 8), (_27082, 8), (_27081, 8), (_27080, 8), (_27079, 8), (_27078, 8), (_27077, 8), (_27076, 8), (_27075, 8), (_27074, 8), (_27073, 8), (_27072, 8), (_27071, 8), (_27070, 8), (_27069, 8), (_27068, 8), (_27067, 8), (_27066, 8), (_27420, 8), (_27419, 8), (_27418, 8), (_27417, 8), (_27416, 8), (_27415, 8), (_27414, 8), (_27413, 8), (_27412, 8), (_27411, 8), (_27410, 8), (_27409, 8), (_27408, 8), (_27407, 8), (_27406, 8), (_27405, 8), (_27404, 8), (_27403, 8), (_27402, 8), (_27401, 8), (_27400, 8), (_27399, 8), (_27398, 8), (_27397, 8), (_27396, 8), (_27395, 8), (_27394, 8), (_27393, 8), (_27392, 8), (_27391, 8), (_27390, 8), (_27389, 8), (_27743, 8), (_27742, 8), (_27741, 8), (_27740, 8), (_27739, 8), (_27738, 8), (_27737, 8), (_27736, 8), (_27735, 8), (_27734, 8), (_27733, 8), (_27732, 8), (_27731, 8), (_27730, 8), (_27729, 8), (_27728, 8), (_27727, 8), (_27726, 8), (_27725, 8), (_27724, 8), (_27723, 8), (_27722, 8), (_27721, 8), (_27720, 8), (_27719, 8), (_27718, 8), (_27717, 8), (_27716, 8), (_27715, 8), (_27714, 8), (_27713, 8), (_27712, 8), (_28066, 8), (_28065, 8), (_28064, 8), (_28063, 8), (_28062, 8), (_28061, 8), (_28060, 8), (_28059, 8), (_28058, 8), (_28057, 8), (_28056, 8), (_28055, 8), (_28054, 8), (_28053, 8), (_28052, 8), (_28051, 8), (_28050, 8), (_28049, 8), (_28048, 8), (_28047, 8), (_28046, 8), (_28045, 8), (_28044, 8), (_28043, 8), (_28042, 8), (_28041, 8), (_28040, 8), (_28039, 8), (_28038, 8), (_28037, 8), (_28036, 8), (_28035, 8), (_28389, 8), (_28388, 8), (_28387, 8), (_28386, 8), (_28385, 8), (_28384, 8), (_28383, 8), (_28382, 8), (_28381, 8), (_28380, 8), (_28379, 8), (_28378, 8), (_28377, 8), (_28376, 8), (_28375, 8), (_28374, 8), (_28373, 8), (_28372, 8), (_28371, 8), (_28370, 8), (_28369, 8), (_28368, 8), (_28367, 8), (_28366, 8), (_28365, 8), (_28364, 8), (_28363, 8), (_28362, 8), (_28361, 8), (_28360, 8), (_28359, 8), (_28358, 8), (_28712, 8), (_28711, 8), (_28710, 8), (_28709, 8), (_28708, 8), (_28707, 8), (_28706, 8), (_28705, 8), (_28704, 8), (_28703, 8), (_28702, 8), (_28701, 8), (_28700, 8), (_28699, 8), (_28698, 8), (_28697, 8), (_28696, 8), (_28695, 8), (_28694, 8), (_28693, 8), (_28692, 8), (_28691, 8), (_28690, 8), (_28689, 8), (_28688, 8), (_28687, 8), (_28686, 8), (_28685, 8), (_28684, 8), (_28683, 8), (_28682, 8), (_28681, 8), (_29035, 8), (_29034, 8), (_29033, 8), (_29032, 8), (_29031, 8), (_29030, 8), (_29029, 8), (_29028, 8), (_29027, 8), (_29026, 8), (_29025, 8), (_29024, 8), (_29023, 8), (_29022, 8), (_29021, 8), (_29020, 8), (_29019, 8), (_29018, 8), (_29017, 8), (_29016, 8), (_29015, 8), (_29014, 8), (_29013, 8), (_29012, 8), (_29011, 8), (_29010, 8), (_29009, 8), (_29008, 8), (_29007, 8), (_29006, 8), (_29005, 8), (_29004, 8), (_29358, 8), (_29357, 8), (_29356, 8), (_29355, 8), (_29354, 8), (_29353, 8), (_29352, 8), (_29351, 8), (_29350, 8), (_29349, 8), (_29348, 8), (_29347, 8), (_29346, 8), (_29345, 8), (_29344, 8), (_29343, 8), (_29342, 8), (_29341, 8), (_29340, 8), (_29339, 8), (_29338, 8), (_29337, 8), (_29336, 8), (_29335, 8), (_29334, 8), (_29333, 8), (_29332, 8), (_29331, 8), (_29330, 8), (_29329, 8), (_29328, 8), (_29327, 8), (_29681, 8), (_29680, 8), (_29679, 8), (_29678, 8), (_29677, 8), (_29676, 8), (_29675, 8), (_29674, 8), (_29673, 8), (_29672, 8), (_29671, 8), (_29670, 8), (_29669, 8), (_29668, 8), (_29667, 8), (_29666, 8), (_29665, 8), (_29664, 8), (_29663, 8), (_29662, 8), (_29661, 8), (_29660, 8), (_29659, 8), (_29658, 8), (_29657, 8), (_29656, 8), (_29655, 8), (_29654, 8), (_29653, 8), (_29652, 8), (_29651, 8), (_29650, 8), (_30004, 8), (_30003, 8), (_30002, 8), (_30001, 8), (_30000, 8), (_29999, 8), (_29998, 8), (_29997, 8), (_29996, 8), (_29995, 8), (_29994, 8), (_29993, 8), (_29992, 8), (_29991, 8), (_29990, 8), (_29989, 8), (_29988, 8), (_29987, 8), (_29986, 8), (_29985, 8), (_29984, 8), (_29983, 8), (_29982, 8), (_29981, 8), (_29980, 8), (_29979, 8), (_29978, 8), (_29977, 8), (_29976, 8), (_29975, 8), (_29974, 8), (_29973, 8), (_30327, 8), (_30326, 8), (_30325, 8), (_30324, 8), (_30323, 8), (_30322, 8), (_30321, 8), (_30320, 8), (_30319, 8), (_30318, 8), (_30317, 8), (_30316, 8), (_30315, 8), (_30314, 8), (_30313, 8), (_30312, 8), (_30311, 8), (_30310, 8), (_30309, 8), (_30308, 8), (_30307, 8), (_30306, 8), (_30305, 8), (_30304, 8), (_30303, 8), (_30302, 8), (_30301, 8), (_30300, 8), (_30299, 8), (_30298, 8), (_30297, 8), (_30296, 8), (_30650, 8), (_30649, 8), (_30648, 8), (_30647, 8), (_30646, 8), (_30645, 8), (_30644, 8), (_30643, 8), (_30642, 8), (_30641, 8), (_30640, 8), (_30639, 8), (_30638, 8), (_30637, 8), (_30636, 8), (_30635, 8), (_30634, 8), (_30633, 8), (_30632, 8), (_30631, 8), (_30630, 8), (_30629, 8), (_30628, 8), (_30627, 8), (_30626, 8), (_30625, 8), (_30624, 8), (_30623, 8), (_30622, 8), (_30621, 8), (_30620, 8), (_30619, 8), (_30973, 8), (_30972, 8), (_30971, 8), (_30970, 8), (_30969, 8), (_30968, 8), (_30967, 8), (_30966, 8), (_30965, 8), (_30964, 8), (_30963, 8), (_30962, 8), (_30961, 8), (_30960, 8), (_30959, 8), (_30958, 8), (_30957, 8), (_30956, 8), (_30955, 8), (_30954, 8), (_30953, 8), (_30952, 8), (_30951, 8), (_30950, 8), (_30949, 8), (_30948, 8), (_30947, 8), (_30946, 8), (_30945, 8), (_30944, 8), (_30943, 8), (_30942, 8), (_31296, 8), (_31295, 8), (_31294, 8), (_31293, 8), (_31292, 8), (_31291, 8), (_31290, 8), (_31289, 8), (_31288, 8), (_31287, 8), (_31286, 8), (_31285, 8), (_31284, 8), (_31283, 8), (_31282, 8), (_31281, 8), (_31280, 8), (_31279, 8), (_31278, 8), (_31277, 8), (_31276, 8), (_31275, 8), (_31274, 8), (_31273, 8), (_31272, 8), (_31271, 8), (_31270, 8), (_31269, 8), (_31268, 8), (_31267, 8), (_31266, 8), (_31265, 8), (_31619, 8), (_31618, 8), (_31617, 8), (_31616, 8), (_31615, 8), (_31614, 8), (_31613, 8), (_31612, 8), (_31611, 8), (_31610, 8), (_31609, 8), (_31608, 8), (_31607, 8), (_31606, 8), (_31605, 8), (_31604, 8), (_31603, 8), (_31602, 8), (_31601, 8), (_31600, 8), (_31599, 8), (_31598, 8), (_31597, 8), (_31596, 8), (_31595, 8), (_31594, 8), (_31593, 8), (_31592, 8), (_31591, 8), (_31590, 8), (_31589, 8), (_31588, 8), (_31942, 8), (_31941, 8), (_31940, 8), (_31939, 8), (_31938, 8), (_31937, 8), (_31936, 8), (_31935, 8), (_31934, 8), (_31933, 8), (_31932, 8), (_31931, 8), (_31930, 8), (_31929, 8), (_31928, 8), (_31927, 8), (_31926, 8), (_31925, 8), (_31924, 8), (_31923, 8), (_31922, 8), (_31921, 8), (_31920, 8), (_31919, 8), (_31918, 8), (_31917, 8), (_31916, 8), (_31915, 8), (_31914, 8), (_31913, 8), (_31912, 8), (_31911, 8), (_32265, 8), (_32264, 8), (_32263, 8), (_32262, 8), (_32261, 8), (_32260, 8), (_32259, 8), (_32258, 8), (_32257, 8), (_32256, 8), (_32255, 8), (_32254, 8), (_32253, 8), (_32252, 8), (_32251, 8), (_32250, 8), (_32249, 8), (_32248, 8), (_32247, 8), (_32246, 8), (_32245, 8), (_32244, 8), (_32243, 8), (_32242, 8), (_32241, 8), (_32240, 8), (_32239, 8), (_32238, 8), (_32237, 8), (_32236, 8), (_32235, 8), (_32234, 8), (_32588, 8), (_32587, 8), (_32586, 8), (_32585, 8), (_32584, 8), (_32583, 8), (_32582, 8), (_32581, 8), (_32580, 8), (_32579, 8), (_32578, 8), (_32577, 8), (_32576, 8), (_32575, 8), (_32574, 8), (_32573, 8), (_32572, 8), (_32571, 8), (_32570, 8), (_32569, 8), (_32568, 8), (_32567, 8), (_32566, 8), (_32565, 8), (_32564, 8), (_32563, 8), (_32562, 8), (_32561, 8), (_32560, 8), (_32559, 8), (_32558, 8), (_32557, 8), (_32911, 8), (_32910, 8), (_32909, 8), (_32908, 8), (_32907, 8), (_32906, 8), (_32905, 8), (_32904, 8), (_32903, 8), (_32902, 8), (_32901, 8), (_32900, 8), (_32899, 8), (_32898, 8), (_32897, 8), (_32896, 8), (_32895, 8), (_32894, 8), (_32893, 8), (_32892, 8), (_32891, 8), (_32890, 8), (_32889, 8), (_32888, 8), (_32887, 8), (_32886, 8), (_32885, 8), (_32884, 8), (_32883, 8), (_32882, 8), (_32881, 8), (_32880, 8), (_33234, 8), (_33233, 8), (_33232, 8), (_33231, 8), (_33230, 8), (_33229, 8), (_33228, 8), (_33227, 8), (_33226, 8), (_33225, 8), (_33224, 8), (_33223, 8), (_33222, 8), (_33221, 8), (_33220, 8), (_33219, 8), (_33218, 8), (_33217, 8), (_33216, 8), (_33215, 8), (_33214, 8), (_33213, 8), (_33212, 8), (_33211, 8), (_33210, 8), (_33209, 8), (_33208, 8), (_33207, 8), (_33206, 8), (_33205, 8), (_33204, 8), (_33203, 8), (_33557, 8), (_33556, 8), (_33555, 8), (_33554, 8), (_33553, 8), (_33552, 8), (_33551, 8), (_33550, 8), (_33549, 8), (_33548, 8), (_33547, 8), (_33546, 8), (_33545, 8), (_33544, 8), (_33543, 8), (_33542, 8), (_33541, 8), (_33540, 8), (_33539, 8), (_33538, 8), (_33537, 8), (_33536, 8), (_33535, 8), (_33534, 8), (_33533, 8), (_33532, 8), (_33531, 8), (_33530, 8), (_33529, 8), (_33528, 8), (_33527, 8), (_33526, 8), (_33880, 8), (_33879, 8), (_33878, 8), (_33877, 8), (_33876, 8), (_33875, 8), (_33874, 8), (_33873, 8), (_33872, 8), (_33871, 8), (_33870, 8), (_33869, 8), (_33868, 8), (_33867, 8), (_33866, 8), (_33865, 8), (_33864, 8), (_33863, 8), (_33862, 8), (_33861, 8), (_33860, 8), (_33859, 8), (_33858, 8), (_33857, 8), (_33856, 8), (_33855, 8), (_33854, 8), (_33853, 8), (_33852, 8), (_33851, 8), (_33850, 8), (_33849, 8), (_34203, 8), (_34202, 8), (_34201, 8), (_34200, 8), (_34199, 8), (_34198, 8), (_34197, 8), (_34196, 8), (_34195, 8), (_34194, 8), (_34193, 8), (_34192, 8), (_34191, 8), (_34190, 8), (_34189, 8), (_34188, 8), (_34187, 8), (_34186, 8), (_34185, 8), (_34184, 8), (_34183, 8), (_34182, 8), (_34181, 8), (_34180, 8), (_34179, 8), (_34178, 8), (_34177, 8), (_34176, 8), (_34175, 8), (_34174, 8), (_34173, 8), (_34172, 8), (_34526, 8), (_34525, 8), (_34524, 8), (_34523, 8), (_34522, 8), (_34521, 8), (_34520, 8), (_34519, 8), (_34518, 8), (_34517, 8), (_34516, 8), (_34515, 8), (_34514, 8), (_34513, 8), (_34512, 8), (_34511, 8), (_34510, 8), (_34509, 8), (_34508, 8), (_34507, 8), (_34506, 8), (_34505, 8), (_34504, 8), (_34503, 8), (_34502, 8), (_34501, 8), (_34500, 8), (_34499, 8), (_34498, 8), (_34497, 8), (_34496, 8), (_34495, 8), (_34849, 8), (_34848, 8), (_34847, 8), (_34846, 8), (_34845, 8), (_34844, 8), (_34843, 8), (_34842, 8), (_34841, 8), (_34840, 8), (_34839, 8), (_34838, 8), (_34837, 8), (_34836, 8), (_34835, 8), (_34834, 8), (_34833, 8), (_34832, 8), (_34831, 8), (_34830, 8), (_34829, 8), (_34828, 8), (_34827, 8), (_34826, 8), (_34825, 8), (_34824, 8), (_34823, 8), (_34822, 8), (_34821, 8), (_34820, 8), (_34819, 8), (_34818, 8), (_35172, 8), (_35171, 8), (_35170, 8), (_35169, 8), (_35168, 8), (_35167, 8), (_35166, 8), (_35165, 8), (_35164, 8), (_35163, 8), (_35162, 8), (_35161, 8), (_35160, 8), (_35159, 8), (_35158, 8), (_35157, 8), (_35156, 8), (_35155, 8), (_35154, 8), (_35153, 8), (_35152, 8), (_35151, 8), (_35150, 8), (_35149, 8), (_35148, 8), (_35147, 8), (_35146, 8), (_35145, 8), (_35144, 8), (_35143, 8), (_35142, 8), (_35141, 8), (_35495, 8), (_35494, 8), (_35493, 8), (_35492, 8), (_35491, 8), (_35490, 8), (_35489, 8), (_35488, 8), (_35487, 8), (_35486, 8), (_35485, 8), (_35484, 8), (_35483, 8), (_35482, 8), (_35481, 8), (_35480, 8), (_35479, 8), (_35478, 8), (_35477, 8), (_35476, 8), (_35475, 8), (_35474, 8), (_35473, 8), (_35472, 8), (_35471, 8), (_35470, 8), (_35469, 8), (_35468, 8), (_35467, 8), (_35466, 8), (_35465, 8), (_35464, 8), (_35818, 8), (_35817, 8), (_35816, 8), (_35815, 8), (_35814, 8), (_35813, 8), (_35812, 8), (_35811, 8), (_35810, 8), (_35809, 8), (_35808, 8), (_35807, 8), (_35806, 8), (_35805, 8), (_35804, 8), (_35803, 8), (_35802, 8), (_35801, 8), (_35800, 8), (_35799, 8), (_35798, 8), (_35797, 8), (_35796, 8), (_35795, 8), (_35794, 8), (_35793, 8), (_35792, 8), (_35791, 8), (_35790, 8), (_35789, 8), (_35788, 8), (_35787, 8), (_36141, 8), (_36140, 8), (_36139, 8), (_36138, 8), (_36137, 8), (_36136, 8), (_36135, 8), (_36134, 8), (_36133, 8), (_36132, 8), (_36131, 8), (_36130, 8), (_36129, 8), (_36128, 8), (_36127, 8), (_36126, 8), (_36125, 8), (_36124, 8), (_36123, 8), (_36122, 8), (_36121, 8), (_36120, 8), (_36119, 8), (_36118, 8), (_36117, 8), (_36116, 8), (_36115, 8), (_36114, 8), (_36113, 8), (_36112, 8), (_36111, 8), (_36110, 8), (_36464, 8), (_36463, 8), (_36462, 8), (_36461, 8), (_36460, 8), (_36459, 8), (_36458, 8), (_36457, 8), (_36456, 8), (_36455, 8), (_36454, 8), (_36453, 8), (_36452, 8), (_36451, 8), (_36450, 8), (_36449, 8), (_36448, 8), (_36447, 8), (_36446, 8), (_36445, 8), (_36444, 8), (_36443, 8), (_36442, 8), (_36441, 8), (_36440, 8), (_36439, 8), (_36438, 8), (_36437, 8), (_36436, 8), (_36435, 8), (_36434, 8), (_36433, 8), (_36787, 8), (_36786, 8), (_36785, 8), (_36784, 8), (_36783, 8), (_36782, 8), (_36781, 8), (_36780, 8), (_36779, 8), (_36778, 8), (_36777, 8), (_36776, 8), (_36775, 8), (_36774, 8), (_36773, 8), (_36772, 8), (_36771, 8), (_36770, 8), (_36769, 8), (_36768, 8), (_36767, 8), (_36766, 8), (_36765, 8), (_36764, 8), (_36763, 8), (_36762, 8), (_36761, 8), (_36760, 8), (_36759, 8), (_36758, 8), (_36757, 8), (_36756, 8), (_37110, 8), (_37109, 8), (_37108, 8), (_37107, 8), (_37106, 8), (_37105, 8), (_37104, 8), (_37103, 8), (_37102, 8), (_37101, 8), (_37100, 8), (_37099, 8), (_37098, 8), (_37097, 8), (_37096, 8), (_37095, 8), (_37094, 8), (_37093, 8), (_37092, 8), (_37091, 8), (_37090, 8), (_37089, 8), (_37088, 8), (_37087, 8), (_37086, 8), (_37085, 8), (_37084, 8), (_37083, 8), (_37082, 8), (_37081, 8), (_37080, 8), (_37079, 8), (_37433, 8), (_37432, 8), (_37431, 8), (_37430, 8), (_37429, 8), (_37428, 8), (_37427, 8), (_37426, 8), (_37425, 8), (_37424, 8), (_37423, 8), (_37422, 8), (_37421, 8), (_37420, 8), (_37419, 8), (_37418, 8), (_37417, 8), (_37416, 8), (_37415, 8), (_37414, 8), (_37413, 8), (_37412, 8), (_37411, 8), (_37410, 8), (_37409, 8), (_37408, 8), (_37407, 8), (_37406, 8), (_37405, 8), (_37404, 8), (_37403, 8), (_37402, 8), (_37756, 8), (_37755, 8), (_37754, 8), (_37753, 8), (_37752, 8), (_37751, 8), (_37750, 8), (_37749, 8), (_37748, 8), (_37747, 8), (_37746, 8), (_37745, 8), (_37744, 8), (_37743, 8), (_37742, 8), (_37741, 8), (_37740, 8), (_37739, 8), (_37738, 8), (_37737, 8), (_37736, 8), (_37735, 8), (_37734, 8), (_37733, 8), (_37732, 8), (_37731, 8), (_37730, 8), (_37729, 8), (_37728, 8), (_37727, 8), (_37726, 8), (_37725, 8), (_38079, 8), (_38078, 8), (_38077, 8), (_38076, 8), (_38075, 8), (_38074, 8), (_38073, 8), (_38072, 8), (_38071, 8), (_38070, 8), (_38069, 8), (_38068, 8), (_38067, 8), (_38066, 8), (_38065, 8), (_38064, 8), (_38063, 8), (_38062, 8), (_38061, 8), (_38060, 8), (_38059, 8), (_38058, 8), (_38057, 8), (_38056, 8), (_38055, 8), (_38054, 8), (_38053, 8), (_38052, 8), (_38051, 8), (_38050, 8), (_38049, 8), (_38048, 8), (_38402, 8), (_38401, 8), (_38400, 8), (_38399, 8), (_38398, 8), (_38397, 8), (_38396, 8), (_38395, 8), (_38394, 8), (_38393, 8), (_38392, 8), (_38391, 8), (_38390, 8), (_38389, 8), (_38388, 8), (_38387, 8), (_38386, 8), (_38385, 8), (_38384, 8), (_38383, 8), (_38382, 8), (_38381, 8), (_38380, 8), (_38379, 8), (_38378, 8), (_38377, 8), (_38376, 8), (_38375, 8), (_38374, 8), (_38373, 8), (_38372, 8), (_38371, 8), (_38725, 8), (_38724, 8), (_38723, 8), (_38722, 8), (_38721, 8), (_38720, 8), (_38719, 8), (_38718, 8), (_38717, 8), (_38716, 8), (_38715, 8), (_38714, 8), (_38713, 8), (_38712, 8), (_38711, 8), (_38710, 8), (_38709, 8), (_38708, 8), (_38707, 8), (_38706, 8), (_38705, 8), (_38704, 8), (_38703, 8), (_38702, 8), (_38701, 8), (_38700, 8), (_38699, 8), (_38698, 8), (_38697, 8), (_38696, 8), (_38695, 8), (_38694, 8), (_39048, 8), (_39047, 8), (_39046, 8), (_39045, 8), (_39044, 8), (_39043, 8), (_39042, 8), (_39041, 8), (_39040, 8), (_39039, 8), (_39038, 8), (_39037, 8), (_39036, 8), (_39035, 8), (_39034, 8), (_39033, 8), (_39032, 8), (_39031, 8), (_39030, 8), (_39029, 8), (_39028, 8), (_39027, 8), (_39026, 8), (_39025, 8), (_39024, 8), (_39023, 8), (_39022, 8), (_39021, 8), (_39020, 8), (_39019, 8), (_39018, 8), (_39017, 8), (_39371, 8), (_39370, 8), (_39369, 8), (_39368, 8), (_39367, 8), (_39366, 8), (_39365, 8), (_39364, 8), (_39363, 8), (_39362, 8), (_39361, 8), (_39360, 8), (_39359, 8), (_39358, 8), (_39357, 8), (_39356, 8), (_39355, 8), (_39354, 8), (_39353, 8), (_39352, 8), (_39351, 8), (_39350, 8), (_39349, 8), (_39348, 8), (_39347, 8), (_39346, 8), (_39345, 8), (_39344, 8), (_39343, 8), (_39342, 8), (_39341, 8), (_39340, 8), (_39694, 8), (_39693, 8), (_39692, 8), (_39691, 8), (_39690, 8), (_39689, 8), (_39688, 8), (_39687, 8), (_39686, 8), (_39685, 8), (_39684, 8), (_39683, 8), (_39682, 8), (_39681, 8), (_39680, 8), (_39679, 8), (_39678, 8), (_39677, 8), (_39676, 8), (_39675, 8), (_39674, 8), (_39673, 8), (_39672, 8), (_39671, 8), (_39670, 8), (_39669, 8), (_39668, 8), (_39667, 8), (_39666, 8), (_39665, 8), (_39664, 8), (_39663, 8), (_40017, 8), (_40016, 8), (_40015, 8), (_40014, 8), (_40013, 8), (_40012, 8), (_40011, 8), (_40010, 8), (_40009, 8), (_40008, 8), (_40007, 8), (_40006, 8), (_40005, 8), (_40004, 8), (_40003, 8), (_40002, 8), (_40001, 8), (_40000, 8), (_39999, 8), (_39998, 8), (_39997, 8), (_39996, 8), (_39995, 8), (_39994, 8), (_39993, 8), (_39992, 8), (_39991, 8), (_39990, 8), (_39989, 8), (_39988, 8), (_39987, 8), (_39986, 8), (_40340, 8), (_40339, 8), (_40338, 8), (_40337, 8), (_40336, 8), (_40335, 8), (_40334, 8), (_40333, 8), (_40332, 8), (_40331, 8), (_40330, 8), (_40329, 8), (_40328, 8), (_40327, 8), (_40326, 8), (_40325, 8), (_40324, 8), (_40323, 8), (_40322, 8), (_40321, 8), (_40320, 8), (_40319, 8), (_40318, 8), (_40317, 8), (_40316, 8), (_40315, 8), (_40314, 8), (_40313, 8), (_40312, 8), (_40311, 8), (_40310, 8), (_40309, 8), (_40663, 8), (_40662, 8), (_40661, 8), (_40660, 8), (_40659, 8), (_40658, 8), (_40657, 8), (_40656, 8), (_40655, 8), (_40654, 8), (_40653, 8), (_40652, 8), (_40651, 8), (_40650, 8), (_40649, 8), (_40648, 8), (_40647, 8), (_40646, 8), (_40645, 8), (_40644, 8), (_40643, 8), (_40642, 8), (_40641, 8), (_40640, 8), (_40639, 8), (_40638, 8), (_40637, 8), (_40636, 8), (_40635, 8), (_40634, 8), (_40633, 8), (_40632, 8), (_40986, 8), (_40985, 8), (_40984, 8), (_40983, 8), (_40982, 8), (_40981, 8), (_40980, 8), (_40979, 8), (_40978, 8), (_40977, 8), (_40976, 8), (_40975, 8), (_40974, 8), (_40973, 8), (_40972, 8), (_40971, 8), (_40970, 8), (_40969, 8), (_40968, 8), (_40967, 8), (_40966, 8), (_40965, 8), (_40964, 8), (_40963, 8), (_40962, 8), (_40961, 8), (_40960, 8), (_40959, 8), (_40958, 8), (_40957, 8), (_40956, 8), (_40955, 8), (_41309, 8), (_41308, 8), (_41307, 8), (_41306, 8), (_41305, 8), (_41304, 8), (_41303, 8), (_41302, 8), (_41301, 8), (_41300, 8), (_41299, 8), (_41298, 8), (_41297, 8), (_41296, 8), (_41295, 8), (_41294, 8), (_41293, 8), (_41292, 8), (_41291, 8), (_41290, 8), (_41289, 8), (_41288, 8), (_41287, 8), (_41286, 8), (_41285, 8), (_41284, 8), (_41283, 8), (_41282, 8), (_41281, 8), (_41280, 8), (_41279, 8), (_41278, 8), (_41632, 8), (_41631, 8), (_41630, 8), (_41629, 8), (_41628, 8), (_41627, 8), (_41626, 8), (_41625, 8), (_41624, 8), (_41623, 8), (_41622, 8), (_41621, 8), (_41620, 8), (_41619, 8), (_41618, 8), (_41617, 8), (_41616, 8), (_41615, 8), (_41614, 8), (_41613, 8), (_41612, 8), (_41611, 8), (_41610, 8), (_41609, 8), (_41608, 8), (_41607, 8), (_41606, 8), (_41605, 8), (_41604, 8), (_41603, 8), (_41602, 8), (_41601, 8), (_41955, 8), (_41954, 8), (_41953, 8), (_41952, 8), (_41951, 8), (_41950, 8), (_41949, 8), (_41948, 8), (_41947, 8), (_41946, 8), (_41945, 8), (_41944, 8), (_41943, 8), (_41942, 8), (_41941, 8), (_41940, 8), (_41939, 8), (_41938, 8), (_41937, 8), (_41936, 8), (_41935, 8), (_41934, 8), (_41933, 8), (_41932, 8), (_41931, 8), (_41930, 8), (_41929, 8), (_41928, 8), (_41927, 8), (_41926, 8), (_41925, 8), (_41924, 8), (_42278, 8), (_42277, 8), (_42276, 8), (_42275, 8), (_42274, 8), (_42273, 8), (_42272, 8), (_42271, 8), (_42270, 8), (_42269, 8), (_42268, 8), (_42267, 8), (_42266, 8), (_42265, 8), (_42264, 8), (_42263, 8), (_42262, 8), (_42261, 8), (_42260, 8), (_42259, 8), (_42258, 8), (_42257, 8), (_42256, 8), (_42255, 8), (_42254, 8), (_42253, 8), (_42252, 8), (_42251, 8), (_42250, 8), (_42249, 8), (_42248, 8), (_42247, 8), (_42601, 8), (_42600, 8), (_42599, 8), (_42598, 8), (_42597, 8), (_42596, 8), (_42595, 8), (_42594, 8), (_42593, 8), (_42592, 8), (_42591, 8), (_42590, 8), (_42589, 8), (_42588, 8), (_42587, 8), (_42586, 8), (_42585, 8), (_42584, 8), (_42583, 8), (_42582, 8), (_42581, 8), (_42580, 8), (_42579, 8), (_42578, 8), (_42577, 8), (_42576, 8), (_42575, 8), (_42574, 8), (_42573, 8), (_42572, 8), (_42571, 8), (_42570, 8), (_42924, 8), (_42923, 8), (_42922, 8), (_42921, 8), (_42920, 8), (_42919, 8), (_42918, 8), (_42917, 8), (_42916, 8), (_42915, 8), (_42914, 8), (_42913, 8), (_42912, 8), (_42911, 8), (_42910, 8), (_42909, 8), (_42908, 8), (_42907, 8), (_42906, 8), (_42905, 8), (_42904, 8), (_42903, 8), (_42902, 8), (_42901, 8), (_42900, 8), (_42899, 8), (_42898, 8), (_42897, 8), (_42896, 8), (_42895, 8), (_42894, 8), (_42893, 8), (_43247, 8), (_43246, 8), (_43245, 8), (_43244, 8), (_43243, 8), (_43242, 8), (_43241, 8), (_43240, 8), (_43239, 8), (_43238, 8), (_43237, 8), (_43236, 8), (_43235, 8), (_43234, 8), (_43233, 8), (_43232, 8), (_43231, 8), (_43230, 8), (_43229, 8), (_43228, 8), (_43227, 8), (_43226, 8), (_43225, 8), (_43224, 8), (_43223, 8), (_43222, 8), (_43221, 8), (_43220, 8), (_43219, 8), (_43218, 8), (_43217, 8), (_43216, 8), (_43570, 8), (_43569, 8), (_43568, 8), (_43567, 8), (_43566, 8), (_43565, 8), (_43564, 8), (_43563, 8), (_43562, 8), (_43561, 8), (_43560, 8), (_43559, 8), (_43558, 8), (_43557, 8), (_43556, 8), (_43555, 8), (_43554, 8), (_43553, 8), (_43552, 8), (_43551, 8), (_43550, 8), (_43549, 8), (_43548, 8), (_43547, 8), (_43546, 8), (_43545, 8), (_43544, 8), (_43543, 8), (_43542, 8), (_43541, 8), (_43540, 8), (_43539, 8), (_43893, 8), (_43892, 8), (_43891, 8), (_43890, 8), (_43889, 8), (_43888, 8), (_43887, 8), (_43886, 8), (_43885, 8), (_43884, 8), (_43883, 8), (_43882, 8), (_43881, 8), (_43880, 8), (_43879, 8), (_43878, 8), (_43877, 8), (_43876, 8), (_43875, 8), (_43874, 8), (_43873, 8), (_43872, 8), (_43871, 8), (_43870, 8), (_43869, 8), (_43868, 8), (_43867, 8), (_43866, 8), (_43865, 8), (_43864, 8), (_43863, 8), (_43862, 8), (_44216, 8), (_44215, 8), (_44214, 8), (_44213, 8), (_44212, 8), (_44211, 8), (_44210, 8), (_44209, 8), (_44208, 8), (_44207, 8), (_44206, 8), (_44205, 8), (_44204, 8), (_44203, 8), (_44202, 8), (_44201, 8), (_44200, 8), (_44199, 8), (_44198, 8), (_44197, 8), (_44196, 8), (_44195, 8), (_44194, 8), (_44193, 8), (_44192, 8), (_44191, 8), (_44190, 8), (_44189, 8), (_44188, 8), (_44187, 8), (_44186, 8), (_44185, 8), (_44539, 8), (_44538, 8), (_44537, 8), (_44536, 8), (_44535, 8), (_44534, 8), (_44533, 8), (_44532, 8), (_44531, 8), (_44530, 8), (_44529, 8), (_44528, 8), (_44527, 8), (_44526, 8), (_44525, 8), (_44524, 8), (_44523, 8), (_44522, 8), (_44521, 8), (_44520, 8), (_44519, 8), (_44518, 8), (_44517, 8), (_44516, 8), (_44515, 8), (_44514, 8), (_44513, 8), (_44512, 8), (_44511, 8), (_44510, 8), (_44509, 8), (_44508, 8), (_44862, 8), (_44861, 8), (_44860, 8), (_44859, 8), (_44858, 8), (_44857, 8), (_44856, 8), (_44855, 8), (_44854, 8), (_44853, 8), (_44852, 8), (_44851, 8), (_44850, 8), (_44849, 8), (_44848, 8), (_44847, 8), (_44846, 8), (_44845, 8), (_44844, 8), (_44843, 8), (_44842, 8), (_44841, 8), (_44840, 8), (_44839, 8), (_44838, 8), (_44837, 8), (_44836, 8), (_44835, 8), (_44834, 8), (_44833, 8), (_44832, 8), (_44831, 8), (_45185, 8), (_45184, 8), (_45183, 8), (_45182, 8), (_45181, 8), (_45180, 8), (_45179, 8), (_45178, 8), (_45177, 8), (_45176, 8), (_45175, 8), (_45174, 8), (_45173, 8), (_45172, 8), (_45171, 8), (_45170, 8), (_45169, 8), (_45168, 8), (_45167, 8), (_45166, 8), (_45165, 8), (_45164, 8), (_45163, 8), (_45162, 8), (_45161, 8), (_45160, 8), (_45159, 8), (_45158, 8), (_45157, 8), (_45156, 8), (_45155, 8), (_45154, 8), (_45508, 8), (_45507, 8), (_45506, 8), (_45505, 8), (_45504, 8), (_45503, 8), (_45502, 8), (_45501, 8), (_45500, 8), (_45499, 8), (_45498, 8), (_45497, 8), (_45496, 8), (_45495, 8), (_45494, 8), (_45493, 8), (_45492, 8), (_45491, 8), (_45490, 8), (_45489, 8), (_45488, 8), (_45487, 8), (_45486, 8), (_45485, 8), (_45484, 8), (_45483, 8), (_45482, 8), (_45481, 8), (_45480, 8), (_45479, 8), (_45478, 8), (_45477, 8), (_45831, 8), (_45830, 8), (_45829, 8), (_45828, 8), (_45827, 8), (_45826, 8), (_45825, 8), (_45824, 8), (_45823, 8), (_45822, 8), (_45821, 8), (_45820, 8), (_45819, 8), (_45818, 8), (_45817, 8), (_45816, 8), (_45815, 8), (_45814, 8), (_45813, 8), (_45812, 8), (_45811, 8), (_45810, 8), (_45809, 8), (_45808, 8), (_45807, 8), (_45806, 8), (_45805, 8), (_45804, 8), (_45803, 8), (_45802, 8), (_45801, 8), (_45800, 8), (_46154, 8), (_46153, 8), (_46152, 8), (_46151, 8), (_46150, 8), (_46149, 8), (_46148, 8), (_46147, 8), (_46146, 8), (_46145, 8), (_46144, 8), (_46143, 8), (_46142, 8), (_46141, 8), (_46140, 8), (_46139, 8), (_46138, 8), (_46137, 8), (_46136, 8), (_46135, 8), (_46134, 8), (_46133, 8), (_46132, 8), (_46131, 8), (_46130, 8), (_46129, 8), (_46128, 8), (_46127, 8), (_46126, 8), (_46125, 8), (_46124, 8), (_46123, 8), (_46477, 8), (_46476, 8), (_46475, 8), (_46474, 8), (_46473, 8), (_46472, 8), (_46471, 8), (_46470, 8), (_46469, 8), (_46468, 8), (_46467, 8), (_46466, 8), (_46465, 8), (_46464, 8), (_46463, 8), (_46462, 8), (_46461, 8), (_46460, 8), (_46459, 8), (_46458, 8), (_46457, 8), (_46456, 8), (_46455, 8), (_46454, 8), (_46453, 8), (_46452, 8), (_46451, 8), (_46450, 8), (_46449, 8), (_46448, 8), (_46447, 8), (_46446, 8), (_46800, 8), (_46799, 8), (_46798, 8), (_46797, 8), (_46796, 8), (_46795, 8), (_46794, 8), (_46793, 8), (_46792, 8), (_46791, 8), (_46790, 8), (_46789, 8), (_46788, 8), (_46787, 8), (_46786, 8), (_46785, 8), (_46784, 8), (_46783, 8), (_46782, 8), (_46781, 8), (_46780, 8), (_46779, 8), (_46778, 8), (_46777, 8), (_46776, 8), (_46775, 8), (_46774, 8), (_46773, 8), (_46772, 8), (_46771, 8), (_46770, 8), (_46769, 8), (_47123, 8), (_47122, 8), (_47121, 8), (_47120, 8), (_47119, 8), (_47118, 8), (_47117, 8), (_47116, 8), (_47115, 8), (_47114, 8), (_47113, 8), (_47112, 8), (_47111, 8), (_47110, 8), (_47109, 8), (_47108, 8), (_47107, 8), (_47106, 8), (_47105, 8), (_47104, 8), (_47103, 8), (_47102, 8), (_47101, 8), (_47100, 8), (_47099, 8), (_47098, 8), (_47097, 8), (_47096, 8), (_47095, 8), (_47094, 8), (_47093, 8), (_47092, 8), (_47446, 8), (_47445, 8), (_47444, 8), (_47443, 8), (_47442, 8), (_47441, 8), (_47440, 8), (_47439, 8), (_47438, 8), (_47437, 8), (_47436, 8), (_47435, 8), (_47434, 8), (_47433, 8), (_47432, 8), (_47431, 8), (_47430, 8), (_47429, 8), (_47428, 8), (_47427, 8), (_47426, 8), (_47425, 8), (_47424, 8), (_47423, 8), (_47422, 8), (_47421, 8), (_47420, 8), (_47419, 8), (_47418, 8), (_47417, 8), (_47416, 8), (_47415, 8), (_47769, 8), (_47768, 8), (_47767, 8), (_47766, 8), (_47765, 8), (_47764, 8), (_47763, 8), (_47762, 8), (_47761, 8), (_47760, 8), (_47759, 8), (_47758, 8), (_47757, 8), (_47756, 8), (_47755, 8), (_47754, 8), (_47753, 8), (_47752, 8), (_47751, 8), (_47750, 8), (_47749, 8), (_47748, 8), (_47747, 8), (_47746, 8), (_47745, 8), (_47744, 8), (_47743, 8), (_47742, 8), (_47741, 8), (_47740, 8), (_47739, 8), (_47738, 8), (_48092, 8), (_48091, 8), (_48090, 8), (_48089, 8), (_48088, 8), (_48087, 8), (_48086, 8), (_48085, 8), (_48084, 8), (_48083, 8), (_48082, 8), (_48081, 8), (_48080, 8), (_48079, 8), (_48078, 8), (_48077, 8), (_48076, 8), (_48075, 8), (_48074, 8), (_48073, 8), (_48072, 8), (_48071, 8), (_48070, 8), (_48069, 8), (_48068, 8), (_48067, 8), (_48066, 8), (_48065, 8), (_48064, 8), (_48063, 8), (_48062, 8), (_48061, 8), (_48415, 8), (_48414, 8), (_48413, 8), (_48412, 8), (_48411, 8), (_48410, 8), (_48409, 8), (_48408, 8), (_48407, 8), (_48406, 8), (_48405, 8), (_48404, 8), (_48403, 8), (_48402, 8), (_48401, 8), (_48400, 8), (_48399, 8), (_48398, 8), (_48397, 8), (_48396, 8), (_48395, 8), (_48394, 8), (_48393, 8), (_48392, 8), (_48391, 8), (_48390, 8), (_48389, 8), (_48388, 8), (_48387, 8), (_48386, 8), (_48385, 8), (_48384, 8), (_48738, 8), (_48737, 8), (_48736, 8), (_48735, 8), (_48734, 8), (_48733, 8), (_48732, 8), (_48731, 8), (_48730, 8), (_48729, 8), (_48728, 8), (_48727, 8), (_48726, 8), (_48725, 8), (_48724, 8), (_48723, 8), (_48722, 8), (_48721, 8), (_48720, 8), (_48719, 8), (_48718, 8), (_48717, 8), (_48716, 8), (_48715, 8), (_48714, 8), (_48713, 8), (_48712, 8), (_48711, 8), (_48710, 8), (_48709, 8), (_48708, 8), (_48707, 8), (_49061, 8), (_49060, 8), (_49059, 8), (_49058, 8), (_49057, 8), (_49056, 8), (_49055, 8), (_49054, 8), (_49053, 8), (_49052, 8), (_49051, 8), (_49050, 8), (_49049, 8), (_49048, 8), (_49047, 8), (_49046, 8), (_49045, 8), (_49044, 8), (_49043, 8), (_49042, 8), (_49041, 8), (_49040, 8), (_49039, 8), (_49038, 8), (_49037, 8), (_49036, 8), (_49035, 8), (_49034, 8), (_49033, 8), (_49032, 8), (_49031, 8), (_49030, 8), (_49384, 8), (_49383, 8), (_49382, 8), (_49381, 8), (_49380, 8), (_49379, 8), (_49378, 8), (_49377, 8), (_49376, 8), (_49375, 8), (_49374, 8), (_49373, 8), (_49372, 8), (_49371, 8), (_49370, 8), (_49369, 8), (_49368, 8), (_49367, 8), (_49366, 8), (_49365, 8), (_49364, 8), (_49363, 8), (_49362, 8), (_49361, 8), (_49360, 8), (_49359, 8), (_49358, 8), (_49357, 8), (_49356, 8), (_49355, 8), (_49354, 8), (_49353, 8), (_49707, 8), (_49706, 8), (_49705, 8), (_49704, 8), (_49703, 8), (_49702, 8), (_49701, 8), (_49700, 8), (_49699, 8), (_49698, 8), (_49697, 8), (_49696, 8), (_49695, 8), (_49694, 8), (_49693, 8), (_49692, 8), (_49691, 8), (_49690, 8), (_49689, 8), (_49688, 8), (_49687, 8), (_49686, 8), (_49685, 8), (_49684, 8), (_49683, 8), (_49682, 8), (_49681, 8), (_49680, 8), (_49679, 8), (_49678, 8), (_49677, 8), (_49676, 8), (_50030, 8), (_50029, 8), (_50028, 8), (_50027, 8), (_50026, 8), (_50025, 8), (_50024, 8), (_50023, 8), (_50022, 8), (_50021, 8), (_50020, 8), (_50019, 8), (_50018, 8), (_50017, 8), (_50016, 8), (_50015, 8), (_50014, 8), (_50013, 8), (_50012, 8), (_50011, 8), (_50010, 8), (_50009, 8), (_50008, 8), (_50007, 8), (_50006, 8), (_50005, 8), (_50004, 8), (_50003, 8), (_50002, 8), (_50001, 8), (_50000, 8), (_49999, 8), (_50353, 8), (_50352, 8), (_50351, 8), (_50350, 8), (_50349, 8), (_50348, 8), (_50347, 8), (_50346, 8), (_50345, 8), (_50344, 8), (_50343, 8), (_50342, 8), (_50341, 8), (_50340, 8), (_50339, 8), (_50338, 8), (_50337, 8), (_50336, 8), (_50335, 8), (_50334, 8), (_50333, 8), (_50332, 8), (_50331, 8), (_50330, 8), (_50329, 8), (_50328, 8), (_50327, 8), (_50326, 8), (_50325, 8), (_50324, 8), (_50323, 8), (_50322, 8), (_50676, 8), (_50675, 8), (_50674, 8), (_50673, 8), (_50672, 8), (_50671, 8), (_50670, 8), (_50669, 8), (_50668, 8), (_50667, 8), (_50666, 8), (_50665, 8), (_50664, 8), (_50663, 8), (_50662, 8), (_50661, 8), (_50660, 8), (_50659, 8), (_50658, 8), (_50657, 8), (_50656, 8), (_50655, 8), (_50654, 8), (_50653, 8), (_50652, 8), (_50651, 8), (_50650, 8), (_50649, 8), (_50648, 8), (_50647, 8), (_50646, 8), (_50645, 8), (_50999, 8), (_50998, 8), (_50997, 8), (_50996, 8), (_50995, 8), (_50994, 8), (_50993, 8), (_50992, 8), (_50991, 8), (_50990, 8), (_50989, 8), (_50988, 8), (_50987, 8), (_50986, 8), (_50985, 8), (_50984, 8), (_50983, 8), (_50982, 8), (_50981, 8), (_50980, 8), (_50979, 8), (_50978, 8), (_50977, 8), (_50976, 8), (_50975, 8), (_50974, 8), (_50973, 8), (_50972, 8), (_50971, 8), (_50970, 8), (_50969, 8), (_50968, 8), (_51322, 8), (_51321, 8), (_51320, 8), (_51319, 8), (_51318, 8), (_51317, 8), (_51316, 8), (_51315, 8), (_51314, 8), (_51313, 8), (_51312, 8), (_51311, 8), (_51310, 8), (_51309, 8), (_51308, 8), (_51307, 8), (_51306, 8), (_51305, 8), (_51304, 8), (_51303, 8), (_51302, 8), (_51301, 8), (_51300, 8), (_51299, 8), (_51298, 8), (_51297, 8), (_51296, 8), (_51295, 8), (_51294, 8), (_51293, 8), (_51292, 8), (_51291, 8), (_51645, 8), (_51644, 8), (_51643, 8), (_51642, 8), (_51641, 8), (_51640, 8), (_51639, 8), (_51638, 8), (_51637, 8), (_51636, 8), (_51635, 8), (_51634, 8), (_51633, 8), (_51632, 8), (_51631, 8), (_51630, 8), (_51629, 8), (_51628, 8), (_51627, 8), (_51626, 8), (_51625, 8), (_51624, 8), (_51623, 8), (_51622, 8), (_51621, 8), (_51620, 8), (_51619, 8), (_51618, 8), (_51617, 8), (_51616, 8), (_51615, 8), (_51614, 8), (_51968, 8), (_51967, 8), (_51966, 8), (_51965, 8), (_51964, 8), (_51963, 8), (_51962, 8), (_51961, 8), (_51960, 8), (_51959, 8), (_51958, 8), (_51957, 8), (_51956, 8), (_51955, 8), (_51954, 8), (_51953, 8), (_51952, 8), (_51951, 8), (_51950, 8), (_51949, 8), (_51948, 8), (_51947, 8), (_51946, 8), (_51945, 8), (_51944, 8), (_51943, 8), (_51942, 8), (_51941, 8), (_51940, 8), (_51939, 8), (_51938, 8), (_51937, 8), (_52291, 8), (_52290, 8), (_52289, 8), (_52288, 8), (_52287, 8), (_52286, 8), (_52285, 8), (_52284, 8), (_52283, 8), (_52282, 8), (_52281, 8), (_52280, 8), (_52279, 8), (_52278, 8), (_52277, 8), (_52276, 8), (_52275, 8), (_52274, 8), (_52273, 8), (_52272, 8), (_52271, 8), (_52270, 8), (_52269, 8), (_52268, 8), (_52267, 8), (_52266, 8), (_52265, 8), (_52264, 8), (_52263, 8), (_52262, 8), (_52261, 8), (_52260, 8), (_52614, 8), (_52613, 8), (_52612, 8), (_52611, 8), (_52610, 8), (_52609, 8), (_52608, 8), (_52607, 8), (_52606, 8), (_52605, 8), (_52604, 8), (_52603, 8), (_52602, 8), (_52601, 8), (_52600, 8), (_52599, 8), (_52598, 8), (_52597, 8), (_52596, 8), (_52595, 8), (_52594, 8), (_52593, 8), (_52592, 8), (_52591, 8), (_52590, 8), (_52589, 8), (_52588, 8), (_52587, 8), (_52586, 8), (_52585, 8), (_52584, 8), (_52583, 8), (_52937, 8), (_52936, 8), (_52935, 8), (_52934, 8), (_52933, 8), (_52932, 8), (_52931, 8), (_52930, 8), (_52929, 8), (_52928, 8), (_52927, 8), (_52926, 8), (_52925, 8), (_52924, 8), (_52923, 8), (_52922, 8), (_52921, 8), (_52920, 8), (_52919, 8), (_52918, 8), (_52917, 8), (_52916, 8), (_52915, 8), (_52914, 8), (_52913, 8), (_52912, 8), (_52911, 8), (_52910, 8), (_52909, 8), (_52908, 8), (_52907, 8), (_52906, 8), (_53260, 8), (_53259, 8), (_53258, 8), (_53257, 8), (_53256, 8), (_53255, 8), (_53254, 8), (_53253, 8), (_53252, 8), (_53251, 8), (_53250, 8), (_53249, 8), (_53248, 8), (_53247, 8), (_53246, 8), (_53245, 8), (_53244, 8), (_53243, 8), (_53242, 8), (_53241, 8), (_53240, 8), (_53239, 8), (_53238, 8), (_53237, 8), (_53236, 8), (_53235, 8), (_53234, 8), (_53233, 8), (_53232, 8), (_53231, 8), (_53230, 8), (_53229, 8), (_53583, 8), (_53582, 8), (_53581, 8), (_53580, 8), (_53579, 8), (_53578, 8), (_53577, 8), (_53576, 8), (_53575, 8), (_53574, 8), (_53573, 8), (_53572, 8), (_53571, 8), (_53570, 8), (_53569, 8), (_53568, 8), (_53567, 8), (_53566, 8), (_53565, 8), (_53564, 8), (_53563, 8), (_53562, 8), (_53561, 8), (_53560, 8), (_53559, 8), (_53558, 8), (_53557, 8), (_53556, 8), (_53555, 8), (_53554, 8), (_53553, 8), (_53552, 8), (_53906, 8), (_53905, 8), (_53904, 8), (_53903, 8), (_53902, 8), (_53901, 8), (_53900, 8), (_53899, 8), (_53898, 8), (_53897, 8), (_53896, 8), (_53895, 8), (_53894, 8), (_53893, 8), (_53892, 8), (_53891, 8), (_53890, 8), (_53889, 8), (_53888, 8), (_53887, 8), (_53886, 8), (_53885, 8), (_53884, 8), (_53883, 8), (_53882, 8), (_53881, 8), (_53880, 8), (_53879, 8), (_53878, 8), (_53877, 8), (_53876, 8), (_53875, 8), (_54229, 8), (_54228, 8), (_54227, 8), (_54226, 8), (_54225, 8), (_54224, 8), (_54223, 8), (_54222, 8), (_54221, 8), (_54220, 8), (_54219, 8), (_54218, 8), (_54217, 8), (_54216, 8), (_54215, 8), (_54214, 8), (_54213, 8), (_54212, 8), (_54211, 8), (_54210, 8), (_54209, 8), (_54208, 8), (_54207, 8), (_54206, 8), (_54205, 8), (_54204, 8), (_54203, 8), (_54202, 8), (_54201, 8), (_54200, 8), (_54199, 8), (_54198, 8), (_54552, 8), (_54551, 8), (_54550, 8), (_54549, 8), (_54548, 8), (_54547, 8), (_54546, 8), (_54545, 8), (_54544, 8), (_54543, 8), (_54542, 8), (_54541, 8), (_54540, 8), (_54539, 8), (_54538, 8), (_54537, 8), (_54536, 8), (_54535, 8), (_54534, 8), (_54533, 8), (_54532, 8), (_54531, 8), (_54530, 8), (_54529, 8), (_54528, 8), (_54527, 8), (_54526, 8), (_54525, 8), (_54524, 8), (_54523, 8), (_54522, 8), (_54521, 8), (_54875, 8), (_54874, 8), (_54873, 8), (_54872, 8), (_54871, 8), (_54870, 8), (_54869, 8), (_54868, 8), (_54867, 8), (_54866, 8), (_54865, 8), (_54864, 8), (_54863, 8), (_54862, 8), (_54861, 8), (_54860, 8), (_54859, 8), (_54858, 8), (_54857, 8), (_54856, 8), (_54855, 8), (_54854, 8), (_54853, 8), (_54852, 8), (_54851, 8), (_54850, 8), (_54849, 8), (_54848, 8), (_54847, 8), (_54846, 8), (_54845, 8), (_54844, 8), (_55198, 8), (_55197, 8), (_55196, 8), (_55195, 8), (_55194, 8), (_55193, 8), (_55192, 8), (_55191, 8), (_55190, 8), (_55189, 8), (_55188, 8), (_55187, 8), (_55186, 8), (_55185, 8), (_55184, 8), (_55183, 8), (_55182, 8), (_55181, 8), (_55180, 8), (_55179, 8), (_55178, 8), (_55177, 8), (_55176, 8), (_55175, 8), (_55174, 8), (_55173, 8), (_55172, 8), (_55171, 8), (_55170, 8), (_55169, 8), (_55168, 8), (_55167, 8), (_55521, 8), (_55520, 8), (_55519, 8), (_55518, 8), (_55517, 8), (_55516, 8), (_55515, 8), (_55514, 8), (_55513, 8), (_55512, 8), (_55511, 8), (_55510, 8), (_55509, 8), (_55508, 8), (_55507, 8), (_55506, 8), (_55505, 8), (_55504, 8), (_55503, 8), (_55502, 8), (_55501, 8), (_55500, 8), (_55499, 8), (_55498, 8), (_55497, 8), (_55496, 8), (_55495, 8), (_55494, 8), (_55493, 8), (_55492, 8), (_55491, 8), (_55490, 8), (_55844, 8), (_55843, 8), (_55842, 8), (_55841, 8), (_55840, 8), (_55839, 8), (_55838, 8), (_55837, 8), (_55836, 8), (_55835, 8), (_55834, 8), (_55833, 8), (_55832, 8), (_55831, 8), (_55830, 8), (_55829, 8), (_55828, 8), (_55827, 8), (_55826, 8), (_55825, 8), (_55824, 8), (_55823, 8), (_55822, 8), (_55821, 8), (_55820, 8), (_55819, 8), (_55818, 8), (_55817, 8), (_55816, 8), (_55815, 8), (_55814, 8), (_55813, 8), (_56167, 8), (_56166, 8), (_56165, 8), (_56164, 8), (_56163, 8), (_56162, 8), (_56161, 8), (_56160, 8), (_56159, 8), (_56158, 8), (_56157, 8), (_56156, 8), (_56155, 8), (_56154, 8), (_56153, 8), (_56152, 8), (_56151, 8), (_56150, 8), (_56149, 8), (_56148, 8), (_56147, 8), (_56146, 8), (_56145, 8), (_56144, 8), (_56143, 8), (_56142, 8), (_56141, 8), (_56140, 8), (_56139, 8), (_56138, 8), (_56137, 8), (_56136, 8), (_56490, 8), (_56489, 8), (_56488, 8), (_56487, 8), (_56486, 8), (_56485, 8), (_56484, 8), (_56483, 8), (_56482, 8), (_56481, 8), (_56480, 8), (_56479, 8), (_56478, 8), (_56477, 8), (_56476, 8), (_56475, 8), (_56474, 8), (_56473, 8), (_56472, 8), (_56471, 8), (_56470, 8), (_56469, 8), (_56468, 8), (_56467, 8), (_56466, 8), (_56465, 8), (_56464, 8), (_56463, 8), (_56462, 8), (_56461, 8), (_56460, 8), (_56459, 8), (_56813, 8), (_56812, 8), (_56811, 8), (_56810, 8), (_56809, 8), (_56808, 8), (_56807, 8), (_56806, 8), (_56805, 8), (_56804, 8), (_56803, 8), (_56802, 8), (_56801, 8), (_56800, 8), (_56799, 8), (_56798, 8), (_56797, 8), (_56796, 8), (_56795, 8), (_56794, 8), (_56793, 8), (_56792, 8), (_56791, 8), (_56790, 8), (_56789, 8), (_56788, 8), (_56787, 8), (_56786, 8), (_56785, 8), (_56784, 8), (_56783, 8), (_56782, 8), (_57136, 8), (_57135, 8), (_57134, 8), (_57133, 8), (_57132, 8), (_57131, 8), (_57130, 8), (_57129, 8), (_57128, 8), (_57127, 8), (_57126, 8), (_57125, 8), (_57124, 8), (_57123, 8), (_57122, 8), (_57121, 8), (_57120, 8), (_57119, 8), (_57118, 8), (_57117, 8), (_57116, 8), (_57115, 8), (_57114, 8), (_57113, 8), (_57112, 8), (_57111, 8), (_57110, 8), (_57109, 8), (_57108, 8), (_57107, 8), (_57106, 8), (_57105, 8), (_57459, 8), (_57458, 8), (_57457, 8), (_57456, 8), (_57455, 8), (_57454, 8), (_57453, 8), (_57452, 8), (_57451, 8), (_57450, 8), (_57449, 8), (_57448, 8), (_57447, 8), (_57446, 8), (_57445, 8), (_57444, 8), (_57443, 8), (_57442, 8), (_57441, 8), (_57440, 8), (_57439, 8), (_57438, 8), (_57437, 8), (_57436, 8), (_57435, 8), (_57434, 8), (_57433, 8), (_57432, 8), (_57431, 8), (_57430, 8), (_57429, 8), (_57428, 8), (_57782, 8), (_57781, 8), (_57780, 8), (_57779, 8), (_57778, 8), (_57777, 8), (_57776, 8), (_57775, 8), (_57774, 8), (_57773, 8), (_57772, 8), (_57771, 8), (_57770, 8), (_57769, 8), (_57768, 8), (_57767, 8), (_57766, 8), (_57765, 8), (_57764, 8), (_57763, 8), (_57762, 8), (_57761, 8), (_57760, 8), (_57759, 8), (_57758, 8), (_57757, 8), (_57756, 8), (_57755, 8), (_57754, 8), (_57753, 8), (_57752, 8), (_57751, 8), (_58105, 8), (_58104, 8), (_58103, 8), (_58102, 8), (_58101, 8), (_58100, 8), (_58099, 8), (_58098, 8), (_58097, 8), (_58096, 8), (_58095, 8), (_58094, 8), (_58093, 8), (_58092, 8), (_58091, 8), (_58090, 8), (_58089, 8), (_58088, 8), (_58087, 8), (_58086, 8), (_58085, 8), (_58084, 8), (_58083, 8), (_58082, 8), (_58081, 8), (_58080, 8), (_58079, 8), (_58078, 8), (_58077, 8), (_58076, 8), (_58075, 8), (_58074, 8), (_58428, 8), (_58427, 8), (_58426, 8), (_58425, 8), (_58424, 8), (_58423, 8), (_58422, 8), (_58421, 8), (_58420, 8), (_58419, 8), (_58418, 8), (_58417, 8), (_58416, 8), (_58415, 8), (_58414, 8), (_58413, 8), (_58412, 8), (_58411, 8), (_58410, 8), (_58409, 8), (_58408, 8), (_58407, 8), (_58406, 8), (_58405, 8), (_58404, 8), (_58403, 8), (_58402, 8), (_58401, 8), (_58400, 8), (_58399, 8), (_58398, 8), (_58397, 8), (_58751, 8), (_58750, 8), (_58749, 8), (_58748, 8), (_58747, 8), (_58746, 8), (_58745, 8), (_58744, 8), (_58743, 8), (_58742, 8), (_58741, 8), (_58740, 8), (_58739, 8), (_58738, 8), (_58737, 8), (_58736, 8), (_58735, 8), (_58734, 8), (_58733, 8), (_58732, 8), (_58731, 8), (_58730, 8), (_58729, 8), (_58728, 8), (_58727, 8), (_58726, 8), (_58725, 8), (_58724, 8), (_58723, 8), (_58722, 8), (_58721, 8), (_58720, 8), (_59074, 8), (_59073, 8), (_59072, 8), (_59071, 8), (_59070, 8), (_59069, 8), (_59068, 8), (_59067, 8), (_59066, 8), (_59065, 8), (_59064, 8), (_59063, 8), (_59062, 8), (_59061, 8), (_59060, 8), (_59059, 8), (_59058, 8), (_59057, 8), (_59056, 8), (_59055, 8), (_59054, 8), (_59053, 8), (_59052, 8), (_59051, 8), (_59050, 8), (_59049, 8), (_59048, 8), (_59047, 8), (_59046, 8), (_59045, 8), (_59044, 8), (_59043, 8), (_59397, 8), (_59396, 8), (_59395, 8), (_59394, 8), (_59393, 8), (_59392, 8), (_59391, 8), (_59390, 8), (_59389, 8), (_59388, 8), (_59387, 8), (_59386, 8), (_59385, 8), (_59384, 8), (_59383, 8), (_59382, 8), (_59381, 8), (_59380, 8), (_59379, 8), (_59378, 8), (_59377, 8), (_59376, 8), (_59375, 8), (_59374, 8), (_59373, 8), (_59372, 8), (_59371, 8), (_59370, 8), (_59369, 8), (_59368, 8), (_59367, 8), (_59366, 8), (_59720, 8), (_59719, 8), (_59718, 8), (_59717, 8), (_59716, 8), (_59715, 8), (_59714, 8), (_59713, 8), (_59712, 8), (_59711, 8), (_59710, 8), (_59709, 8), (_59708, 8), (_59707, 8), (_59706, 8), (_59705, 8), (_59704, 8), (_59703, 8), (_59702, 8), (_59701, 8), (_59700, 8), (_59699, 8), (_59698, 8), (_59697, 8), (_59696, 8), (_59695, 8), (_59694, 8), (_59693, 8), (_59692, 8), (_59691, 8), (_59690, 8), (_59689, 8), (_60043, 8), (_60042, 8), (_60041, 8), (_60040, 8), (_60039, 8), (_60038, 8), (_60037, 8), (_60036, 8), (_60035, 8), (_60034, 8), (_60033, 8), (_60032, 8), (_60031, 8), (_60030, 8), (_60029, 8), (_60028, 8), (_60027, 8), (_60026, 8), (_60025, 8), (_60024, 8), (_60023, 8), (_60022, 8), (_60021, 8), (_60020, 8), (_60019, 8), (_60018, 8), (_60017, 8), (_60016, 8), (_60015, 8), (_60014, 8), (_60013, 8), (_60012, 8), (_60366, 8), (_60365, 8), (_60364, 8), (_60363, 8), (_60362, 8), (_60361, 8), (_60360, 8), (_60359, 8), (_60358, 8), (_60357, 8), (_60356, 8), (_60355, 8), (_60354, 8), (_60353, 8), (_60352, 8), (_60351, 8), (_60350, 8), (_60349, 8), (_60348, 8), (_60347, 8), (_60346, 8), (_60345, 8), (_60344, 8), (_60343, 8), (_60342, 8), (_60341, 8), (_60340, 8), (_60339, 8), (_60338, 8), (_60337, 8), (_60336, 8), (_60335, 8), (_60689, 8), (_60688, 8), (_60687, 8), (_60686, 8), (_60685, 8), (_60684, 8), (_60683, 8), (_60682, 8), (_60681, 8), (_60680, 8), (_60679, 8), (_60678, 8), (_60677, 8), (_60676, 8), (_60675, 8), (_60674, 8), (_60673, 8), (_60672, 8), (_60671, 8), (_60670, 8), (_60669, 8), (_60668, 8), (_60667, 8), (_60666, 8), (_60665, 8), (_60664, 8), (_60663, 8), (_60662, 8), (_60661, 8), (_60660, 8), (_60659, 8), (_60658, 8), (_61012, 8), (_61011, 8), (_61010, 8), (_61009, 8), (_61008, 8), (_61007, 8), (_61006, 8), (_61005, 8), (_61004, 8), (_61003, 8), (_61002, 8), (_61001, 8), (_61000, 8), (_60999, 8), (_60998, 8), (_60997, 8), (_60996, 8), (_60995, 8), (_60994, 8), (_60993, 8), (_60992, 8), (_60991, 8), (_60990, 8), (_60989, 8), (_60988, 8), (_60987, 8), (_60986, 8), (_60985, 8), (_60984, 8), (_60983, 8), (_60982, 8), (_60981, 8), (_61335, 8), (_61334, 8), (_61333, 8), (_61332, 8), (_61331, 8), (_61330, 8), (_61329, 8), (_61328, 8), (_61327, 8), (_61326, 8), (_61325, 8), (_61324, 8), (_61323, 8), (_61322, 8), (_61321, 8), (_61320, 8), (_61319, 8), (_61318, 8), (_61317, 8), (_61316, 8), (_61315, 8), (_61314, 8), (_61313, 8), (_61312, 8), (_61311, 8), (_61310, 8), (_61309, 8), (_61308, 8), (_61307, 8), (_61306, 8), (_61305, 8), (_61304, 8), (_61658, 8), (_61657, 8), (_61656, 8), (_61655, 8), (_61654, 8), (_61653, 8), (_61652, 8), (_61651, 8), (_61650, 8), (_61649, 8), (_61648, 8), (_61647, 8), (_61646, 8), (_61645, 8), (_61644, 8), (_61643, 8), (_61642, 8), (_61641, 8), (_61640, 8), (_61639, 8), (_61638, 8), (_61637, 8), (_61636, 8), (_61635, 8), (_61634, 8), (_61633, 8), (_61632, 8), (_61631, 8), (_61630, 8), (_61629, 8), (_61628, 8), (_61627, 8), (_61981, 8), (_61980, 8), (_61979, 8), (_61978, 8), (_61977, 8), (_61976, 8), (_61975, 8), (_61974, 8), (_61973, 8), (_61972, 8), (_61971, 8), (_61970, 8), (_61969, 8), (_61968, 8), (_61967, 8), (_61966, 8), (_61965, 8), (_61964, 8), (_61963, 8), (_61962, 8), (_61961, 8), (_61960, 8), (_61959, 8), (_61958, 8), (_61957, 8), (_61956, 8), (_61955, 8), (_61954, 8), (_61953, 8), (_61952, 8), (_61951, 8), (_61950, 8), (_62304, 8), (_62303, 8), (_62302, 8), (_62301, 8), (_62300, 8), (_62299, 8), (_62298, 8), (_62297, 8), (_62296, 8), (_62295, 8), (_62294, 8), (_62293, 8), (_62292, 8), (_62291, 8), (_62290, 8), (_62289, 8), (_62288, 8), (_62287, 8), (_62286, 8), (_62285, 8), (_62284, 8), (_62283, 8), (_62282, 8), (_62281, 8), (_62280, 8), (_62279, 8), (_62278, 8), (_62277, 8), (_62276, 8), (_62275, 8), (_62274, 8), (_62273, 8), (_62627, 8), (_62626, 8), (_62625, 8), (_62624, 8), (_62623, 8), (_62622, 8), (_62621, 8), (_62620, 8), (_62619, 8), (_62618, 8), (_62617, 8), (_62616, 8), (_62615, 8), (_62614, 8), (_62613, 8), (_62612, 8), (_62611, 8), (_62610, 8), (_62609, 8), (_62608, 8), (_62607, 8), (_62606, 8), (_62605, 8), (_62604, 8), (_62603, 8), (_62602, 8), (_62601, 8), (_62600, 8), (_62599, 8), (_62598, 8), (_62597, 8), (_62596, 8), (_62950, 8), (_62949, 8), (_62948, 8), (_62947, 8), (_62946, 8), (_62945, 8), (_62944, 8), (_62943, 8), (_62942, 8), (_62941, 8), (_62940, 8), (_62939, 8), (_62938, 8), (_62937, 8), (_62936, 8), (_62935, 8), (_62934, 8), (_62933, 8), (_62932, 8), (_62931, 8), (_62930, 8), (_62929, 8), (_62928, 8), (_62927, 8), (_62926, 8), (_62925, 8), (_62924, 8), (_62923, 8), (_62922, 8), (_62921, 8), (_62920, 8), (_62919, 8), (_63273, 8), (_63272, 8), (_63271, 8), (_63270, 8), (_63269, 8), (_63268, 8), (_63267, 8), (_63266, 8), (_63265, 8), (_63264, 8), (_63263, 8), (_63262, 8), (_63261, 8), (_63260, 8), (_63259, 8), (_63258, 8), (_63257, 8), (_63256, 8), (_63255, 8), (_63254, 8), (_63253, 8), (_63252, 8), (_63251, 8), (_63250, 8), (_63249, 8), (_63248, 8), (_63247, 8), (_63246, 8), (_63245, 8), (_63244, 8), (_63243, 8), (_63242, 8), (_63596, 8), (_63595, 8), (_63594, 8), (_63593, 8), (_63592, 8), (_63591, 8), (_63590, 8), (_63589, 8), (_63588, 8), (_63587, 8), (_63586, 8), (_63585, 8), (_63584, 8), (_63583, 8), (_63582, 8), (_63581, 8), (_63580, 8), (_63579, 8), (_63578, 8), (_63577, 8), (_63576, 8), (_63575, 8), (_63574, 8), (_63573, 8), (_63572, 8), (_63571, 8), (_63570, 8), (_63569, 8), (_63568, 8), (_63567, 8), (_63566, 8), (_63565, 8), (_63919, 8), (_63918, 8), (_63917, 8), (_63916, 8), (_63915, 8), (_63914, 8), (_63913, 8), (_63912, 8), (_63911, 8), (_63910, 8), (_63909, 8), (_63908, 8), (_63907, 8), (_63906, 8), (_63905, 8), (_63904, 8), (_63903, 8), (_63902, 8), (_63901, 8), (_63900, 8), (_63899, 8), (_63898, 8), (_63897, 8), (_63896, 8), (_63895, 8), (_63894, 8), (_63893, 8), (_63892, 8), (_63891, 8), (_63890, 8), (_63889, 8), (_63888, 8), (_64242, 8), (_64241, 8), (_64240, 8), (_64239, 8), (_64238, 8), (_64237, 8), (_64236, 8), (_64235, 8), (_64234, 8), (_64233, 8), (_64232, 8), (_64231, 8), (_64230, 8), (_64229, 8), (_64228, 8), (_64227, 8), (_64226, 8), (_64225, 8), (_64224, 8), (_64223, 8), (_64222, 8), (_64221, 8), (_64220, 8), (_64219, 8), (_64218, 8), (_64217, 8), (_64216, 8), (_64215, 8), (_64214, 8), (_64213, 8), (_64212, 8), (_64211, 8), (_64565, 8), (_64564, 8), (_64563, 8), (_64562, 8), (_64561, 8), (_64560, 8), (_64559, 8), (_64558, 8), (_64557, 8), (_64556, 8), (_64555, 8), (_64554, 8), (_64553, 8), (_64552, 8), (_64551, 8), (_64550, 8), (_64549, 8), (_64548, 8), (_64547, 8), (_64546, 8), (_64545, 8), (_64544, 8), (_64543, 8), (_64542, 8), (_64541, 8), (_64540, 8), (_64539, 8), (_64538, 8), (_64537, 8), (_64536, 8), (_64535, 8), (_64534, 8), (_64888, 8), (_64887, 8), (_64886, 8), (_64885, 8), (_64884, 8), (_64883, 8), (_64882, 8), (_64881, 8), (_64880, 8), (_64879, 8), (_64878, 8), (_64877, 8), (_64876, 8), (_64875, 8), (_64874, 8), (_64873, 8), (_64872, 8), (_64871, 8), (_64870, 8), (_64869, 8), (_64868, 8), (_64867, 8), (_64866, 8), (_64865, 8), (_64864, 8), (_64863, 8), (_64862, 8), (_64861, 8), (_64860, 8), (_64859, 8), (_64858, 8), (_64857, 8), (_65211, 8), (_65210, 8), (_65209, 8), (_65208, 8), (_65207, 8), (_65206, 8), (_65205, 8), (_65204, 8), (_65203, 8), (_65202, 8), (_65201, 8), (_65200, 8), (_65199, 8), (_65198, 8), (_65197, 8), (_65196, 8), (_65195, 8), (_65194, 8), (_65193, 8), (_65192, 8), (_65191, 8), (_65190, 8), (_65189, 8), (_65188, 8), (_65187, 8), (_65186, 8), (_65185, 8), (_65184, 8), (_65183, 8), (_65182, 8), (_65181, 8), (_65180, 8), (_65534, 8), (_65533, 8), (_65532, 8), (_65531, 8), (_65530, 8), (_65529, 8), (_65528, 8), (_65527, 8), (_65526, 8), (_65525, 8), (_65524, 8), (_65523, 8), (_65522, 8), (_65521, 8), (_65520, 8), (_65519, 8), (_65518, 8), (_65517, 8), (_65516, 8), (_65515, 8), (_65514, 8), (_65513, 8), (_65512, 8), (_65511, 8), (_65510, 8), (_65509, 8), (_65508, 8), (_65507, 8), (_65506, 8), (_65505, 8), (_65504, 8), (_65503, 8), (_65857, 8), (_65856, 8), (_65855, 8), (_65854, 8), (_65853, 8), (_65852, 8), (_65851, 8), (_65850, 8), (_65849, 8), (_65848, 8), (_65847, 8), (_65846, 8), (_65845, 8), (_65844, 8), (_65843, 8), (_65842, 8), (_65841, 8), (_65840, 8), (_65839, 8), (_65838, 8), (_65837, 8), (_65836, 8), (_65835, 8), (_65834, 8), (_65833, 8), (_65832, 8), (_65831, 8), (_65830, 8), (_65829, 8), (_65828, 8), (_65827, 8), (_65826, 8), (_66180, 8), (_66179, 8), (_66178, 8), (_66177, 8), (_66176, 8), (_66175, 8), (_66174, 8), (_66173, 8), (_66172, 8), (_66171, 8), (_66170, 8), (_66169, 8), (_66168, 8), (_66167, 8), (_66166, 8), (_66165, 8), (_66164, 8), (_66163, 8), (_66162, 8), (_66161, 8), (_66160, 8), (_66159, 8), (_66158, 8), (_66157, 8), (_66156, 8), (_66155, 8), (_66154, 8), (_66153, 8), (_66152, 8), (_66151, 8), (_66150, 8), (_66149, 8), (_66503, 8), (_66502, 8), (_66501, 8), (_66500, 8), (_66499, 8), (_66498, 8), (_66497, 8), (_66496, 8), (_66495, 8), (_66494, 8), (_66493, 8), (_66492, 8), (_66491, 8), (_66490, 8), (_66489, 8), (_66488, 8), (_66487, 8), (_66486, 8), (_66485, 8), (_66484, 8), (_66483, 8), (_66482, 8), (_66481, 8), (_66480, 8), (_66479, 8), (_66478, 8), (_66477, 8), (_66476, 8), (_66475, 8), (_66474, 8), (_66473, 8), (_66472, 8), (_66826, 8), (_66825, 8), (_66824, 8), (_66823, 8), (_66822, 8), (_66821, 8), (_66820, 8), (_66819, 8), (_66818, 8), (_66817, 8), (_66816, 8), (_66815, 8), (_66814, 8), (_66813, 8), (_66812, 8), (_66811, 8), (_66810, 8), (_66809, 8), (_66808, 8), (_66807, 8), (_66806, 8), (_66805, 8), (_66804, 8), (_66803, 8), (_66802, 8), (_66801, 8), (_66800, 8), (_66799, 8), (_66798, 8), (_66797, 8), (_66796, 8), (_66795, 8), (_67149, 8), (_67148, 8), (_67147, 8), (_67146, 8), (_67145, 8), (_67144, 8), (_67143, 8), (_67142, 8), (_67141, 8), (_67140, 8), (_67139, 8), (_67138, 8), (_67137, 8), (_67136, 8), (_67135, 8), (_67134, 8), (_67133, 8), (_67132, 8), (_67131, 8), (_67130, 8), (_67129, 8), (_67128, 8), (_67127, 8), (_67126, 8), (_67125, 8), (_67124, 8), (_67123, 8), (_67122, 8), (_67121, 8), (_67120, 8), (_67119, 8), (_67118, 8), (_67472, 8), (_67471, 8), (_67470, 8), (_67469, 8), (_67468, 8), (_67467, 8), (_67466, 8), (_67465, 8), (_67464, 8), (_67463, 8), (_67462, 8), (_67461, 8), (_67460, 8), (_67459, 8), (_67458, 8), (_67457, 8), (_67456, 8), (_67455, 8), (_67454, 8), (_67453, 8), (_67452, 8), (_67451, 8), (_67450, 8), (_67449, 8), (_67448, 8), (_67447, 8), (_67446, 8), (_67445, 8), (_67444, 8), (_67443, 8), (_67442, 8), (_67441, 8), (_67795, 8), (_67794, 8), (_67793, 8), (_67792, 8), (_67791, 8), (_67790, 8), (_67789, 8), (_67788, 8), (_67787, 8), (_67786, 8), (_67785, 8), (_67784, 8), (_67783, 8), (_67782, 8), (_67781, 8), (_67780, 8), (_67779, 8), (_67778, 8), (_67777, 8), (_67776, 8), (_67775, 8), (_67774, 8), (_67773, 8), (_67772, 8), (_67771, 8), (_67770, 8), (_67769, 8), (_67768, 8), (_67767, 8), (_67766, 8), (_67765, 8), (_67764, 8), (_68118, 8), (_68117, 8), (_68116, 8), (_68115, 8), (_68114, 8), (_68113, 8), (_68112, 8), (_68111, 8), (_68110, 8), (_68109, 8), (_68108, 8), (_68107, 8), (_68106, 8), (_68105, 8), (_68104, 8), (_68103, 8), (_68102, 8), (_68101, 8), (_68100, 8), (_68099, 8), (_68098, 8), (_68097, 8), (_68096, 8), (_68095, 8), (_68094, 8), (_68093, 8), (_68092, 8), (_68091, 8), (_68090, 8), (_68089, 8), (_68088, 8), (_68087, 8), (_68441, 8), (_68440, 8), (_68439, 8), (_68438, 8), (_68437, 8), (_68436, 8), (_68435, 8), (_68434, 8), (_68433, 8), (_68432, 8), (_68431, 8), (_68430, 8), (_68429, 8), (_68428, 8), (_68427, 8), (_68426, 8), (_68425, 8), (_68424, 8), (_68423, 8), (_68422, 8), (_68421, 8), (_68420, 8), (_68419, 8), (_68418, 8), (_68417, 8), (_68416, 8), (_68415, 8), (_68414, 8), (_68413, 8), (_68412, 8), (_68411, 8), (_68410, 8), (_68764, 8), (_68763, 8), (_68762, 8), (_68761, 8), (_68760, 8), (_68759, 8), (_68758, 8), (_68757, 8), (_68756, 8), (_68755, 8), (_68754, 8), (_68753, 8), (_68752, 8), (_68751, 8), (_68750, 8), (_68749, 8), (_68748, 8), (_68747, 8), (_68746, 8), (_68745, 8), (_68744, 8), (_68743, 8), (_68742, 8), (_68741, 8), (_68740, 8), (_68739, 8), (_68738, 8), (_68737, 8), (_68736, 8), (_68735, 8), (_68734, 8), (_68733, 8), (_69087, 8), (_69086, 8), (_69085, 8), (_69084, 8), (_69083, 8), (_69082, 8), (_69081, 8), (_69080, 8), (_69079, 8), (_69078, 8), (_69077, 8), (_69076, 8), (_69075, 8), (_69074, 8), (_69073, 8), (_69072, 8), (_69071, 8), (_69070, 8), (_69069, 8), (_69068, 8), (_69067, 8), (_69066, 8), (_69065, 8), (_69064, 8), (_69063, 8), (_69062, 8), (_69061, 8), (_69060, 8), (_69059, 8), (_69058, 8), (_69057, 8), (_69056, 8), (_69410, 8), (_69409, 8), (_69408, 8), (_69407, 8), (_69406, 8), (_69405, 8), (_69404, 8), (_69403, 8), (_69402, 8), (_69401, 8), (_69400, 8), (_69399, 8), (_69398, 8), (_69397, 8), (_69396, 8), (_69395, 8), (_69394, 8), (_69393, 8), (_69392, 8), (_69391, 8), (_69390, 8), (_69389, 8), (_69388, 8), (_69387, 8), (_69386, 8), (_69385, 8), (_69384, 8), (_69383, 8), (_69382, 8), (_69381, 8), (_69380, 8), (_69379, 8), (_69733, 8), (_69732, 8), (_69731, 8), (_69730, 8), (_69729, 8), (_69728, 8), (_69727, 8), (_69726, 8), (_69725, 8), (_69724, 8), (_69723, 8), (_69722, 8), (_69721, 8), (_69720, 8), (_69719, 8), (_69718, 8), (_69717, 8), (_69716, 8), (_69715, 8), (_69714, 8), (_69713, 8), (_69712, 8), (_69711, 8), (_69710, 8), (_69709, 8), (_69708, 8), (_69707, 8), (_69706, 8), (_69705, 8), (_69704, 8), (_69703, 8), (_69702, 8), (_70056, 8), (_70055, 8), (_70054, 8), (_70053, 8), (_70052, 8), (_70051, 8), (_70050, 8), (_70049, 8), (_70048, 8), (_70047, 8), (_70046, 8), (_70045, 8), (_70044, 8), (_70043, 8), (_70042, 8), (_70041, 8), (_70040, 8), (_70039, 8), (_70038, 8), (_70037, 8), (_70036, 8), (_70035, 8), (_70034, 8), (_70033, 8), (_70032, 8), (_70031, 8), (_70030, 8), (_70029, 8), (_70028, 8), (_70027, 8), (_70026, 8), (_70025, 8), (_70379, 8), (_70378, 8), (_70377, 8), (_70376, 8), (_70375, 8), (_70374, 8), (_70373, 8), (_70372, 8), (_70371, 8), (_70370, 8), (_70369, 8), (_70368, 8), (_70367, 8), (_70366, 8), (_70365, 8), (_70364, 8), (_70363, 8), (_70362, 8), (_70361, 8), (_70360, 8), (_70359, 8), (_70358, 8), (_70357, 8), (_70356, 8), (_70355, 8), (_70354, 8), (_70353, 8), (_70352, 8), (_70351, 8), (_70350, 8), (_70349, 8), (_70348, 8), (_70702, 8), (_70701, 8), (_70700, 8), (_70699, 8), (_70698, 8), (_70697, 8), (_70696, 8), (_70695, 8), (_70694, 8), (_70693, 8), (_70692, 8), (_70691, 8), (_70690, 8), (_70689, 8), (_70688, 8), (_70687, 8), (_70686, 8), (_70685, 8), (_70684, 8), (_70683, 8), (_70682, 8), (_70681, 8), (_70680, 8), (_70679, 8), (_70678, 8), (_70677, 8), (_70676, 8), (_70675, 8), (_70674, 8), (_70673, 8), (_70672, 8), (_70671, 8), (_71025, 8), (_71024, 8), (_71023, 8), (_71022, 8), (_71021, 8), (_71020, 8), (_71019, 8), (_71018, 8), (_71017, 8), (_71016, 8), (_71015, 8), (_71014, 8), (_71013, 8), (_71012, 8), (_71011, 8), (_71010, 8), (_71009, 8), (_71008, 8), (_71007, 8), (_71006, 8), (_71005, 8), (_71004, 8), (_71003, 8), (_71002, 8), (_71001, 8), (_71000, 8), (_70999, 8), (_70998, 8), (_70997, 8), (_70996, 8), (_70995, 8), (_70994, 8), (_71348, 8), (_71347, 8), (_71346, 8), (_71345, 8), (_71344, 8), (_71343, 8), (_71342, 8), (_71341, 8), (_71340, 8), (_71339, 8), (_71338, 8), (_71337, 8), (_71336, 8), (_71335, 8), (_71334, 8), (_71333, 8), (_71332, 8), (_71331, 8), (_71330, 8), (_71329, 8), (_71328, 8), (_71327, 8), (_71326, 8), (_71325, 8), (_71324, 8), (_71323, 8), (_71322, 8), (_71321, 8), (_71320, 8), (_71319, 8), (_71318, 8), (_71317, 8), (_71671, 8), (_71670, 8), (_71669, 8), (_71668, 8), (_71667, 8), (_71666, 8), (_71665, 8), (_71664, 8), (_71663, 8), (_71662, 8), (_71661, 8), (_71660, 8), (_71659, 8), (_71658, 8), (_71657, 8), (_71656, 8), (_71655, 8), (_71654, 8), (_71653, 8), (_71652, 8), (_71651, 8), (_71650, 8), (_71649, 8), (_71648, 8), (_71647, 8), (_71646, 8), (_71645, 8), (_71644, 8), (_71643, 8), (_71642, 8), (_71641, 8), (_71640, 8), (_71994, 8), (_71993, 8), (_71992, 8), (_71991, 8), (_71990, 8), (_71989, 8), (_71988, 8), (_71987, 8), (_71986, 8), (_71985, 8), (_71984, 8), (_71983, 8), (_71982, 8), (_71981, 8), (_71980, 8), (_71979, 8), (_71978, 8), (_71977, 8), (_71976, 8), (_71975, 8), (_71974, 8), (_71973, 8), (_71972, 8), (_71971, 8), (_71970, 8), (_71969, 8), (_71968, 8), (_71967, 8), (_71966, 8), (_71965, 8), (_71964, 8), (_71963, 8), (_72317, 8), (_72316, 8), (_72315, 8), (_72314, 8), (_72313, 8), (_72312, 8), (_72311, 8), (_72310, 8), (_72309, 8), (_72308, 8), (_72307, 8), (_72306, 8), (_72305, 8), (_72304, 8), (_72303, 8), (_72302, 8), (_72301, 8), (_72300, 8), (_72299, 8), (_72298, 8), (_72297, 8), (_72296, 8), (_72295, 8), (_72294, 8), (_72293, 8), (_72292, 8), (_72291, 8), (_72290, 8), (_72289, 8), (_72288, 8), (_72287, 8), (_72286, 8), (_72640, 8), (_72639, 8), (_72638, 8), (_72637, 8), (_72636, 8), (_72635, 8), (_72634, 8), (_72633, 8), (_72632, 8), (_72631, 8), (_72630, 8), (_72629, 8), (_72628, 8), (_72627, 8), (_72626, 8), (_72625, 8), (_72624, 8), (_72623, 8), (_72622, 8), (_72621, 8), (_72620, 8), (_72619, 8), (_72618, 8), (_72617, 8), (_72616, 8), (_72615, 8), (_72614, 8), (_72613, 8), (_72612, 8), (_72611, 8), (_72610, 8), (_72609, 8), (_72963, 8), (_72962, 8), (_72961, 8), (_72960, 8), (_72959, 8), (_72958, 8), (_72957, 8), (_72956, 8), (_72955, 8), (_72954, 8), (_72953, 8), (_72952, 8), (_72951, 8), (_72950, 8), (_72949, 8), (_72948, 8), (_72947, 8), (_72946, 8), (_72945, 8), (_72944, 8), (_72943, 8), (_72942, 8), (_72941, 8), (_72940, 8), (_72939, 8), (_72938, 8), (_72937, 8), (_72936, 8), (_72935, 8), (_72934, 8), (_72933, 8), (_72932, 8), (_73286, 8), (_73285, 8), (_73284, 8), (_73283, 8), (_73282, 8), (_73281, 8), (_73280, 8), (_73279, 8), (_73278, 8), (_73277, 8), (_73276, 8), (_73275, 8), (_73274, 8), (_73273, 8), (_73272, 8), (_73271, 8), (_73270, 8), (_73269, 8), (_73268, 8), (_73267, 8), (_73266, 8), (_73265, 8), (_73264, 8), (_73263, 8), (_73262, 8), (_73261, 8), (_73260, 8), (_73259, 8), (_73258, 8), (_73257, 8), (_73256, 8), (_73255, 8), (_73609, 8), (_73608, 8), (_73607, 8), (_73606, 8), (_73605, 8), (_73604, 8), (_73603, 8), (_73602, 8), (_73601, 8), (_73600, 8), (_73599, 8), (_73598, 8), (_73597, 8), (_73596, 8), (_73595, 8), (_73594, 8), (_73593, 8), (_73592, 8), (_73591, 8), (_73590, 8), (_73589, 8), (_73588, 8), (_73587, 8), (_73586, 8), (_73585, 8), (_73584, 8), (_73583, 8), (_73582, 8), (_73581, 8), (_73580, 8), (_73579, 8), (_73578, 8), (_73932, 8), (_73931, 8), (_73930, 8), (_73929, 8), (_73928, 8), (_73927, 8), (_73926, 8), (_73925, 8), (_73924, 8), (_73923, 8), (_73922, 8), (_73921, 8), (_73920, 8), (_73919, 8), (_73918, 8), (_73917, 8), (_73916, 8), (_73915, 8), (_73914, 8), (_73913, 8), (_73912, 8), (_73911, 8), (_73910, 8), (_73909, 8), (_73908, 8), (_73907, 8), (_73906, 8), (_73905, 8), (_73904, 8), (_73903, 8), (_73902, 8), (_73901, 8), (_74255, 8), (_74254, 8), (_74253, 8), (_74252, 8), (_74251, 8), (_74250, 8), (_74249, 8), (_74248, 8), (_74247, 8), (_74246, 8), (_74245, 8), (_74244, 8), (_74243, 8), (_74242, 8), (_74241, 8), (_74240, 8), (_74239, 8), (_74238, 8), (_74237, 8), (_74236, 8), (_74235, 8), (_74234, 8), (_74233, 8), (_74232, 8), (_74231, 8), (_74230, 8), (_74229, 8), (_74228, 8), (_74227, 8), (_74226, 8), (_74225, 8), (_74224, 8), (_74578, 8), (_74577, 8), (_74576, 8), (_74575, 8), (_74574, 8), (_74573, 8), (_74572, 8), (_74571, 8), (_74570, 8), (_74569, 8), (_74568, 8), (_74567, 8), (_74566, 8), (_74565, 8), (_74564, 8), (_74563, 8), (_74562, 8), (_74561, 8), (_74560, 8), (_74559, 8), (_74558, 8), (_74557, 8), (_74556, 8), (_74555, 8), (_74554, 8), (_74553, 8), (_74552, 8), (_74551, 8), (_74550, 8), (_74549, 8), (_74548, 8), (_74547, 8), (_74901, 8), (_74900, 8), (_74899, 8), (_74898, 8), (_74897, 8), (_74896, 8), (_74895, 8), (_74894, 8), (_74893, 8), (_74892, 8), (_74891, 8), (_74890, 8), (_74889, 8), (_74888, 8), (_74887, 8), (_74886, 8), (_74885, 8), (_74884, 8), (_74883, 8), (_74882, 8), (_74881, 8), (_74880, 8), (_74879, 8), (_74878, 8), (_74877, 8), (_74876, 8), (_74875, 8), (_74874, 8), (_74873, 8), (_74872, 8), (_74871, 8), (_74870, 8), (_75224, 8), (_75223, 8), (_75222, 8), (_75221, 8), (_75220, 8), (_75219, 8), (_75218, 8), (_75217, 8), (_75216, 8), (_75215, 8), (_75214, 8), (_75213, 8), (_75212, 8), (_75211, 8), (_75210, 8), (_75209, 8), (_75208, 8), (_75207, 8), (_75206, 8), (_75205, 8), (_75204, 8), (_75203, 8), (_75202, 8), (_75201, 8), (_75200, 8), (_75199, 8), (_75198, 8), (_75197, 8), (_75196, 8), (_75195, 8), (_75194, 8), (_75193, 8), (_75547, 8), (_75546, 8), (_75545, 8), (_75544, 8), (_75543, 8), (_75542, 8), (_75541, 8), (_75540, 8), (_75539, 8), (_75538, 8), (_75537, 8), (_75536, 8), (_75535, 8), (_75534, 8), (_75533, 8), (_75532, 8), (_75531, 8), (_75530, 8), (_75529, 8), (_75528, 8), (_75527, 8), (_75526, 8), (_75525, 8), (_75524, 8), (_75523, 8), (_75522, 8), (_75521, 8), (_75520, 8), (_75519, 8), (_75518, 8), (_75517, 8), (_75516, 8), (_75870, 8), (_75869, 8), (_75868, 8), (_75867, 8), (_75866, 8), (_75865, 8), (_75864, 8), (_75863, 8), (_75862, 8), (_75861, 8), (_75860, 8), (_75859, 8), (_75858, 8), (_75857, 8), (_75856, 8), (_75855, 8), (_75854, 8), (_75853, 8), (_75852, 8), (_75851, 8), (_75850, 8), (_75849, 8), (_75848, 8), (_75847, 8), (_75846, 8), (_75845, 8), (_75844, 8), (_75843, 8), (_75842, 8), (_75841, 8), (_75840, 8), (_75839, 8), (_76193, 8), (_76192, 8), (_76191, 8), (_76190, 8), (_76189, 8), (_76188, 8), (_76187, 8), (_76186, 8), (_76185, 8), (_76184, 8), (_76183, 8), (_76182, 8), (_76181, 8), (_76180, 8), (_76179, 8), (_76178, 8), (_76177, 8), (_76176, 8), (_76175, 8), (_76174, 8), (_76173, 8), (_76172, 8), (_76171, 8), (_76170, 8), (_76169, 8), (_76168, 8), (_76167, 8), (_76166, 8), (_76165, 8), (_76164, 8), (_76163, 8), (_76162, 8), (_76516, 8), (_76515, 8), (_76514, 8), (_76513, 8), (_76512, 8), (_76511, 8), (_76510, 8), (_76509, 8), (_76508, 8), (_76507, 8), (_76506, 8), (_76505, 8), (_76504, 8), (_76503, 8), (_76502, 8), (_76501, 8), (_76500, 8), (_76499, 8), (_76498, 8), (_76497, 8), (_76496, 8), (_76495, 8), (_76494, 8), (_76493, 8), (_76492, 8), (_76491, 8), (_76490, 8), (_76489, 8), (_76488, 8), (_76487, 8), (_76486, 8), (_76485, 8), (_76839, 8), (_76838, 8), (_76837, 8), (_76836, 8), (_76835, 8), (_76834, 8), (_76833, 8), (_76832, 8), (_76831, 8), (_76830, 8), (_76829, 8), (_76828, 8), (_76827, 8), (_76826, 8), (_76825, 8), (_76824, 8), (_76823, 8), (_76822, 8), (_76821, 8), (_76820, 8), (_76819, 8), (_76818, 8), (_76817, 8), (_76816, 8), (_76815, 8), (_76814, 8), (_76813, 8), (_76812, 8), (_76811, 8), (_76810, 8), (_76809, 8), (_76808, 8), (_77162, 8), (_77161, 8), (_77160, 8), (_77159, 8), (_77158, 8), (_77157, 8), (_77156, 8), (_77155, 8), (_77154, 8), (_77153, 8), (_77152, 8), (_77151, 8), (_77150, 8), (_77149, 8), (_77148, 8), (_77147, 8), (_77146, 8), (_77145, 8), (_77144, 8), (_77143, 8), (_77142, 8), (_77141, 8), (_77140, 8), (_77139, 8), (_77138, 8), (_77137, 8), (_77136, 8), (_77135, 8), (_77134, 8), (_77133, 8), (_77132, 8), (_77131, 8), (_77485, 8), (_77484, 8), (_77483, 8), (_77482, 8), (_77481, 8), (_77480, 8), (_77479, 8), (_77478, 8), (_77477, 8), (_77476, 8), (_77475, 8), (_77474, 8), (_77473, 8), (_77472, 8), (_77471, 8), (_77470, 8), (_77469, 8), (_77468, 8), (_77467, 8), (_77466, 8), (_77465, 8), (_77464, 8), (_77463, 8), (_77462, 8), (_77461, 8), (_77460, 8), (_77459, 8), (_77458, 8), (_77457, 8), (_77456, 8), (_77455, 8), (_77454, 8), (_77808, 8), (_77807, 8), (_77806, 8), (_77805, 8), (_77804, 8), (_77803, 8), (_77802, 8), (_77801, 8), (_77800, 8), (_77799, 8), (_77798, 8), (_77797, 8), (_77796, 8), (_77795, 8), (_77794, 8), (_77793, 8), (_77792, 8), (_77791, 8), (_77790, 8), (_77789, 8), (_77788, 8), (_77787, 8), (_77786, 8), (_77785, 8), (_77784, 8), (_77783, 8), (_77782, 8), (_77781, 8), (_77780, 8), (_77779, 8), (_77778, 8), (_77777, 8), (_78131, 8), (_78130, 8), (_78129, 8), (_78128, 8), (_78127, 8), (_78126, 8), (_78125, 8), (_78124, 8), (_78123, 8), (_78122, 8), (_78121, 8), (_78120, 8), (_78119, 8), (_78118, 8), (_78117, 8), (_78116, 8), (_78115, 8), (_78114, 8), (_78113, 8), (_78112, 8), (_78111, 8), (_78110, 8), (_78109, 8), (_78108, 8), (_78107, 8), (_78106, 8), (_78105, 8), (_78104, 8), (_78103, 8), (_78102, 8), (_78101, 8), (_78100, 8), (_78454, 8), (_78453, 8), (_78452, 8), (_78451, 8), (_78450, 8), (_78449, 8), (_78448, 8), (_78447, 8), (_78446, 8), (_78445, 8), (_78444, 8), (_78443, 8), (_78442, 8), (_78441, 8), (_78440, 8), (_78439, 8), (_78438, 8), (_78437, 8), (_78436, 8), (_78435, 8), (_78434, 8), (_78433, 8), (_78432, 8), (_78431, 8), (_78430, 8), (_78429, 8), (_78428, 8), (_78427, 8), (_78426, 8), (_78425, 8), (_78424, 8), (_78423, 8), (_78777, 8), (_78776, 8), (_78775, 8), (_78774, 8), (_78773, 8), (_78772, 8), (_78771, 8), (_78770, 8), (_78769, 8), (_78768, 8), (_78767, 8), (_78766, 8), (_78765, 8), (_78764, 8), (_78763, 8), (_78762, 8), (_78761, 8), (_78760, 8), (_78759, 8), (_78758, 8), (_78757, 8), (_78756, 8), (_78755, 8), (_78754, 8), (_78753, 8), (_78752, 8), (_78751, 8), (_78750, 8), (_78749, 8), (_78748, 8), (_78747, 8), (_78746, 8), (_79100, 8), (_79099, 8), (_79098, 8), (_79097, 8), (_79096, 8), (_79095, 8), (_79094, 8), (_79093, 8), (_79092, 8), (_79091, 8), (_79090, 8), (_79089, 8), (_79088, 8), (_79087, 8), (_79086, 8), (_79085, 8), (_79084, 8), (_79083, 8), (_79082, 8), (_79081, 8), (_79080, 8), (_79079, 8), (_79078, 8), (_79077, 8), (_79076, 8), (_79075, 8), (_79074, 8), (_79073, 8), (_79072, 8), (_79071, 8), (_79070, 8), (_79069, 8), (_79423, 8), (_79422, 8), (_79421, 8), (_79420, 8), (_79419, 8), (_79418, 8), (_79417, 8), (_79416, 8), (_79415, 8), (_79414, 8), (_79413, 8), (_79412, 8), (_79411, 8), (_79410, 8), (_79409, 8), (_79408, 8), (_79407, 8), (_79406, 8), (_79405, 8), (_79404, 8), (_79403, 8), (_79402, 8), (_79401, 8), (_79400, 8), (_79399, 8), (_79398, 8), (_79397, 8), (_79396, 8), (_79395, 8), (_79394, 8), (_79393, 8), (_79392, 8), (_79746, 8), (_79745, 8), (_79744, 8), (_79743, 8), (_79742, 8), (_79741, 8), (_79740, 8), (_79739, 8), (_79738, 8), (_79737, 8), (_79736, 8), (_79735, 8), (_79734, 8), (_79733, 8), (_79732, 8), (_79731, 8), (_79730, 8), (_79729, 8), (_79728, 8), (_79727, 8), (_79726, 8), (_79725, 8), (_79724, 8), (_79723, 8), (_79722, 8), (_79721, 8), (_79720, 8), (_79719, 8), (_79718, 8), (_79717, 8), (_79716, 8), (_79715, 8), (_80069, 8), (_80068, 8), (_80067, 8), (_80066, 8), (_80065, 8), (_80064, 8), (_80063, 8), (_80062, 8), (_80061, 8), (_80060, 8), (_80059, 8), (_80058, 8), (_80057, 8), (_80056, 8), (_80055, 8), (_80054, 8), (_80053, 8), (_80052, 8), (_80051, 8), (_80050, 8), (_80049, 8), (_80048, 8), (_80047, 8), (_80046, 8), (_80045, 8), (_80044, 8), (_80043, 8), (_80042, 8), (_80041, 8), (_80040, 8), (_80039, 8), (_80038, 8), (_80392, 8), (_80391, 8), (_80390, 8), (_80389, 8), (_80388, 8), (_80387, 8), (_80386, 8), (_80385, 8), (_80384, 8), (_80383, 8), (_80382, 8), (_80381, 8), (_80380, 8), (_80379, 8), (_80378, 8), (_80377, 8), (_80376, 8), (_80375, 8), (_80374, 8), (_80373, 8), (_80372, 8), (_80371, 8), (_80370, 8), (_80369, 8), (_80368, 8), (_80367, 8), (_80366, 8), (_80365, 8), (_80364, 8), (_80363, 8), (_80362, 8), (_80361, 8), (_80715, 8), (_80714, 8), (_80713, 8), (_80712, 8), (_80711, 8), (_80710, 8), (_80709, 8), (_80708, 8), (_80707, 8), (_80706, 8), (_80705, 8), (_80704, 8), (_80703, 8), (_80702, 8), (_80701, 8), (_80700, 8), (_80699, 8), (_80698, 8), (_80697, 8), (_80696, 8), (_80695, 8), (_80694, 8), (_80693, 8), (_80692, 8), (_80691, 8), (_80690, 8), (_80689, 8), (_80688, 8), (_80687, 8), (_80686, 8), (_80685, 8), (_80684, 8), (_81038, 8), (_81037, 8), (_81036, 8), (_81035, 8), (_81034, 8), (_81033, 8), (_81032, 8), (_81031, 8), (_81030, 8), (_81029, 8), (_81028, 8), (_81027, 8), (_81026, 8), (_81025, 8), (_81024, 8), (_81023, 8), (_81022, 8), (_81021, 8), (_81020, 8), (_81019, 8), (_81018, 8), (_81017, 8), (_81016, 8), (_81015, 8), (_81014, 8), (_81013, 8), (_81012, 8), (_81011, 8), (_81010, 8), (_81009, 8), (_81008, 8), (_81007, 8), (_81361, 8), (_81360, 8), (_81359, 8), (_81358, 8), (_81357, 8), (_81356, 8), (_81355, 8), (_81354, 8), (_81353, 8), (_81352, 8), (_81351, 8), (_81350, 8), (_81349, 8), (_81348, 8), (_81347, 8), (_81346, 8), (_81345, 8), (_81344, 8), (_81343, 8), (_81342, 8), (_81341, 8), (_81340, 8), (_81339, 8), (_81338, 8), (_81337, 8), (_81336, 8), (_81335, 8), (_81334, 8), (_81333, 8), (_81332, 8), (_81331, 8), (_81330, 8), (_81684, 8), (_81683, 8), (_81682, 8), (_81681, 8), (_81680, 8), (_81679, 8), (_81678, 8), (_81677, 8), (_81676, 8), (_81675, 8), (_81674, 8), (_81673, 8), (_81672, 8), (_81671, 8), (_81670, 8), (_81669, 8), (_81668, 8), (_81667, 8), (_81666, 8), (_81665, 8), (_81664, 8), (_81663, 8), (_81662, 8), (_81661, 8), (_81660, 8), (_81659, 8), (_81658, 8), (_81657, 8), (_81656, 8), (_81655, 8), (_81654, 8), (_81653, 8), (_82007, 8), (_82006, 8), (_82005, 8), (_82004, 8), (_82003, 8), (_82002, 8), (_82001, 8), (_82000, 8), (_81999, 8), (_81998, 8), (_81997, 8), (_81996, 8), (_81995, 8), (_81994, 8), (_81993, 8), (_81992, 8), (_81991, 8), (_81990, 8), (_81989, 8), (_81988, 8), (_81987, 8), (_81986, 8), (_81985, 8), (_81984, 8), (_81983, 8), (_81982, 8), (_81981, 8), (_81980, 8), (_81979, 8), (_81978, 8), (_81977, 8), (_81976, 8), (_82330, 8), (_82329, 8), (_82328, 8), (_82327, 8), (_82326, 8), (_82325, 8), (_82324, 8), (_82323, 8), (_82322, 8), (_82321, 8), (_82320, 8), (_82319, 8), (_82318, 8), (_82317, 8), (_82316, 8), (_82315, 8), (_82314, 8), (_82313, 8), (_82312, 8), (_82311, 8), (_82310, 8), (_82309, 8), (_82308, 8), (_82307, 8), (_82306, 8), (_82305, 8), (_82304, 8), (_82303, 8), (_82302, 8), (_82301, 8), (_82300, 8), (_82299, 8), (_82653, 8), (_82652, 8), (_82651, 8), (_82650, 8), (_82649, 8), (_82648, 8), (_82647, 8), (_82646, 8), (_82645, 8), (_82644, 8), (_82643, 8), (_82642, 8), (_82641, 8), (_82640, 8), (_82639, 8), (_82638, 8), (_82637, 8), (_82636, 8), (_82635, 8), (_82634, 8), (_82633, 8), (_82632, 8), (_82631, 8), (_82630, 8), (_82629, 8), (_82628, 8), (_82627, 8), (_82626, 8), (_82625, 8), (_82624, 8), (_82623, 8), (_82622, 8)] [_82945, _82946, _82947, _82948, _82949, _82950, _82951, _82952, _82953, _82954, _82955, _82956, _82957, _82958, _82959, _82960, _82961, _82962, _82963, _82964, _82965, _82966, _82967, _82968, _82969, _82970, _82971, _82972, _82973, _82974, _82975, _82976]", + "BLACKBOX::BLAKE2S [(_288, 8), (_287, 8), (_286, 8), (_285, 8), (_284, 8), (_283, 8), (_282, 8), (_281, 8), (_280, 8), (_279, 8), (_278, 8), (_277, 8), (_276, 8), (_275, 8), (_274, 8), (_273, 8), (_272, 8), (_271, 8), (_270, 8), (_269, 8), (_268, 8), (_267, 8), (_266, 8), (_265, 8), (_264, 8), (_263, 8), (_262, 8), (_261, 8), (_260, 8), (_259, 8), (_258, 8), (_257, 8), (_611, 8), (_610, 8), (_609, 8), (_608, 8), (_607, 8), (_606, 8), (_605, 8), (_604, 8), (_603, 8), (_602, 8), (_601, 8), (_600, 8), (_599, 8), (_598, 8), (_597, 8), (_596, 8), (_595, 8), (_594, 8), (_593, 8), (_592, 8), (_591, 8), (_590, 8), (_589, 8), (_588, 8), (_587, 8), (_586, 8), (_585, 8), (_584, 8), (_583, 8), (_582, 8), (_581, 8), (_580, 8), (_934, 8), (_933, 8), (_932, 8), (_931, 8), (_930, 8), (_929, 8), (_928, 8), (_927, 8), (_926, 8), (_925, 8), (_924, 8), (_923, 8), (_922, 8), (_921, 8), (_920, 8), (_919, 8), (_918, 8), (_917, 8), (_916, 8), (_915, 8), (_914, 8), (_913, 8), (_912, 8), (_911, 8), (_910, 8), (_909, 8), (_908, 8), (_907, 8), (_906, 8), (_905, 8), (_904, 8), (_903, 8), (_1257, 8), (_1256, 8), (_1255, 8), (_1254, 8), (_1253, 8), (_1252, 8), (_1251, 8), (_1250, 8), (_1249, 8), (_1248, 8), (_1247, 8), (_1246, 8), (_1245, 8), (_1244, 8), (_1243, 8), (_1242, 8), (_1241, 8), (_1240, 8), (_1239, 8), (_1238, 8), (_1237, 8), (_1236, 8), (_1235, 8), (_1234, 8), (_1233, 8), (_1232, 8), (_1231, 8), (_1230, 8), (_1229, 8), (_1228, 8), (_1227, 8), (_1226, 8), (_1580, 8), (_1579, 8), (_1578, 8), (_1577, 8), (_1576, 8), (_1575, 8), (_1574, 8), (_1573, 8), (_1572, 8), (_1571, 8), (_1570, 8), (_1569, 8), (_1568, 8), (_1567, 8), (_1566, 8), (_1565, 8), (_1564, 8), (_1563, 8), (_1562, 8), (_1561, 8), (_1560, 8), (_1559, 8), (_1558, 8), (_1557, 8), (_1556, 8), (_1555, 8), (_1554, 8), (_1553, 8), (_1552, 8), (_1551, 8), (_1550, 8), (_1549, 8), (_1903, 8), (_1902, 8), (_1901, 8), (_1900, 8), (_1899, 8), (_1898, 8), (_1897, 8), (_1896, 8), (_1895, 8), (_1894, 8), (_1893, 8), (_1892, 8), (_1891, 8), (_1890, 8), (_1889, 8), (_1888, 8), (_1887, 8), (_1886, 8), (_1885, 8), (_1884, 8), (_1883, 8), (_1882, 8), (_1881, 8), (_1880, 8), (_1879, 8), (_1878, 8), (_1877, 8), (_1876, 8), (_1875, 8), (_1874, 8), (_1873, 8), (_1872, 8), (_2226, 8), (_2225, 8), (_2224, 8), (_2223, 8), (_2222, 8), (_2221, 8), (_2220, 8), (_2219, 8), (_2218, 8), (_2217, 8), (_2216, 8), (_2215, 8), (_2214, 8), (_2213, 8), (_2212, 8), (_2211, 8), (_2210, 8), (_2209, 8), (_2208, 8), (_2207, 8), (_2206, 8), (_2205, 8), (_2204, 8), (_2203, 8), (_2202, 8), (_2201, 8), (_2200, 8), (_2199, 8), (_2198, 8), (_2197, 8), (_2196, 8), (_2195, 8), (_2549, 8), (_2548, 8), (_2547, 8), (_2546, 8), (_2545, 8), (_2544, 8), (_2543, 8), (_2542, 8), (_2541, 8), (_2540, 8), (_2539, 8), (_2538, 8), (_2537, 8), (_2536, 8), (_2535, 8), (_2534, 8), (_2533, 8), (_2532, 8), (_2531, 8), (_2530, 8), (_2529, 8), (_2528, 8), (_2527, 8), (_2526, 8), (_2525, 8), (_2524, 8), (_2523, 8), (_2522, 8), (_2521, 8), (_2520, 8), (_2519, 8), (_2518, 8), (_2872, 8), (_2871, 8), (_2870, 8), (_2869, 8), (_2868, 8), (_2867, 8), (_2866, 8), (_2865, 8), (_2864, 8), (_2863, 8), (_2862, 8), (_2861, 8), (_2860, 8), (_2859, 8), (_2858, 8), (_2857, 8), (_2856, 8), (_2855, 8), (_2854, 8), (_2853, 8), (_2852, 8), (_2851, 8), (_2850, 8), (_2849, 8), (_2848, 8), (_2847, 8), (_2846, 8), (_2845, 8), (_2844, 8), (_2843, 8), (_2842, 8), (_2841, 8), (_3195, 8), (_3194, 8), (_3193, 8), (_3192, 8), (_3191, 8), (_3190, 8), (_3189, 8), (_3188, 8), (_3187, 8), (_3186, 8), (_3185, 8), (_3184, 8), (_3183, 8), (_3182, 8), (_3181, 8), (_3180, 8), (_3179, 8), (_3178, 8), (_3177, 8), (_3176, 8), (_3175, 8), (_3174, 8), (_3173, 8), (_3172, 8), (_3171, 8), (_3170, 8), (_3169, 8), (_3168, 8), (_3167, 8), (_3166, 8), (_3165, 8), (_3164, 8), (_3518, 8), (_3517, 8), (_3516, 8), (_3515, 8), (_3514, 8), (_3513, 8), (_3512, 8), (_3511, 8), (_3510, 8), (_3509, 8), (_3508, 8), (_3507, 8), (_3506, 8), (_3505, 8), (_3504, 8), (_3503, 8), (_3502, 8), (_3501, 8), (_3500, 8), (_3499, 8), (_3498, 8), (_3497, 8), (_3496, 8), (_3495, 8), (_3494, 8), (_3493, 8), (_3492, 8), (_3491, 8), (_3490, 8), (_3489, 8), (_3488, 8), (_3487, 8), (_3841, 8), (_3840, 8), (_3839, 8), (_3838, 8), (_3837, 8), (_3836, 8), (_3835, 8), (_3834, 8), (_3833, 8), (_3832, 8), (_3831, 8), (_3830, 8), (_3829, 8), (_3828, 8), (_3827, 8), (_3826, 8), (_3825, 8), (_3824, 8), (_3823, 8), (_3822, 8), (_3821, 8), (_3820, 8), (_3819, 8), (_3818, 8), (_3817, 8), (_3816, 8), (_3815, 8), (_3814, 8), (_3813, 8), (_3812, 8), (_3811, 8), (_3810, 8), (_4164, 8), (_4163, 8), (_4162, 8), (_4161, 8), (_4160, 8), (_4159, 8), (_4158, 8), (_4157, 8), (_4156, 8), (_4155, 8), (_4154, 8), (_4153, 8), (_4152, 8), (_4151, 8), (_4150, 8), (_4149, 8), (_4148, 8), (_4147, 8), (_4146, 8), (_4145, 8), (_4144, 8), (_4143, 8), (_4142, 8), (_4141, 8), (_4140, 8), (_4139, 8), (_4138, 8), (_4137, 8), (_4136, 8), (_4135, 8), (_4134, 8), (_4133, 8), (_4487, 8), (_4486, 8), (_4485, 8), (_4484, 8), (_4483, 8), (_4482, 8), (_4481, 8), (_4480, 8), (_4479, 8), (_4478, 8), (_4477, 8), (_4476, 8), (_4475, 8), (_4474, 8), (_4473, 8), (_4472, 8), (_4471, 8), (_4470, 8), (_4469, 8), (_4468, 8), (_4467, 8), (_4466, 8), (_4465, 8), (_4464, 8), (_4463, 8), (_4462, 8), (_4461, 8), (_4460, 8), (_4459, 8), (_4458, 8), (_4457, 8), (_4456, 8), (_4810, 8), (_4809, 8), (_4808, 8), (_4807, 8), (_4806, 8), (_4805, 8), (_4804, 8), (_4803, 8), (_4802, 8), (_4801, 8), (_4800, 8), (_4799, 8), (_4798, 8), (_4797, 8), (_4796, 8), (_4795, 8), (_4794, 8), (_4793, 8), (_4792, 8), (_4791, 8), (_4790, 8), (_4789, 8), (_4788, 8), (_4787, 8), (_4786, 8), (_4785, 8), (_4784, 8), (_4783, 8), (_4782, 8), (_4781, 8), (_4780, 8), (_4779, 8), (_5133, 8), (_5132, 8), (_5131, 8), (_5130, 8), (_5129, 8), (_5128, 8), (_5127, 8), (_5126, 8), (_5125, 8), (_5124, 8), (_5123, 8), (_5122, 8), (_5121, 8), (_5120, 8), (_5119, 8), (_5118, 8), (_5117, 8), (_5116, 8), (_5115, 8), (_5114, 8), (_5113, 8), (_5112, 8), (_5111, 8), (_5110, 8), (_5109, 8), (_5108, 8), (_5107, 8), (_5106, 8), (_5105, 8), (_5104, 8), (_5103, 8), (_5102, 8), (_5456, 8), (_5455, 8), (_5454, 8), (_5453, 8), (_5452, 8), (_5451, 8), (_5450, 8), (_5449, 8), (_5448, 8), (_5447, 8), (_5446, 8), (_5445, 8), (_5444, 8), (_5443, 8), (_5442, 8), (_5441, 8), (_5440, 8), (_5439, 8), (_5438, 8), (_5437, 8), (_5436, 8), (_5435, 8), (_5434, 8), (_5433, 8), (_5432, 8), (_5431, 8), (_5430, 8), (_5429, 8), (_5428, 8), (_5427, 8), (_5426, 8), (_5425, 8), (_5779, 8), (_5778, 8), (_5777, 8), (_5776, 8), (_5775, 8), (_5774, 8), (_5773, 8), (_5772, 8), (_5771, 8), (_5770, 8), (_5769, 8), (_5768, 8), (_5767, 8), (_5766, 8), (_5765, 8), (_5764, 8), (_5763, 8), (_5762, 8), (_5761, 8), (_5760, 8), (_5759, 8), (_5758, 8), (_5757, 8), (_5756, 8), (_5755, 8), (_5754, 8), (_5753, 8), (_5752, 8), (_5751, 8), (_5750, 8), (_5749, 8), (_5748, 8), (_6102, 8), (_6101, 8), (_6100, 8), (_6099, 8), (_6098, 8), (_6097, 8), (_6096, 8), (_6095, 8), (_6094, 8), (_6093, 8), (_6092, 8), (_6091, 8), (_6090, 8), (_6089, 8), (_6088, 8), (_6087, 8), (_6086, 8), (_6085, 8), (_6084, 8), (_6083, 8), (_6082, 8), (_6081, 8), (_6080, 8), (_6079, 8), (_6078, 8), (_6077, 8), (_6076, 8), (_6075, 8), (_6074, 8), (_6073, 8), (_6072, 8), (_6071, 8), (_6425, 8), (_6424, 8), (_6423, 8), (_6422, 8), (_6421, 8), (_6420, 8), (_6419, 8), (_6418, 8), (_6417, 8), (_6416, 8), (_6415, 8), (_6414, 8), (_6413, 8), (_6412, 8), (_6411, 8), (_6410, 8), (_6409, 8), (_6408, 8), (_6407, 8), (_6406, 8), (_6405, 8), (_6404, 8), (_6403, 8), (_6402, 8), (_6401, 8), (_6400, 8), (_6399, 8), (_6398, 8), (_6397, 8), (_6396, 8), (_6395, 8), (_6394, 8), (_6748, 8), (_6747, 8), (_6746, 8), (_6745, 8), (_6744, 8), (_6743, 8), (_6742, 8), (_6741, 8), (_6740, 8), (_6739, 8), (_6738, 8), (_6737, 8), (_6736, 8), (_6735, 8), (_6734, 8), (_6733, 8), (_6732, 8), (_6731, 8), (_6730, 8), (_6729, 8), (_6728, 8), (_6727, 8), (_6726, 8), (_6725, 8), (_6724, 8), (_6723, 8), (_6722, 8), (_6721, 8), (_6720, 8), (_6719, 8), (_6718, 8), (_6717, 8), (_7071, 8), (_7070, 8), (_7069, 8), (_7068, 8), (_7067, 8), (_7066, 8), (_7065, 8), (_7064, 8), (_7063, 8), (_7062, 8), (_7061, 8), (_7060, 8), (_7059, 8), (_7058, 8), (_7057, 8), (_7056, 8), (_7055, 8), (_7054, 8), (_7053, 8), (_7052, 8), (_7051, 8), (_7050, 8), (_7049, 8), (_7048, 8), (_7047, 8), (_7046, 8), (_7045, 8), (_7044, 8), (_7043, 8), (_7042, 8), (_7041, 8), (_7040, 8), (_7394, 8), (_7393, 8), (_7392, 8), (_7391, 8), (_7390, 8), (_7389, 8), (_7388, 8), (_7387, 8), (_7386, 8), (_7385, 8), (_7384, 8), (_7383, 8), (_7382, 8), (_7381, 8), (_7380, 8), (_7379, 8), (_7378, 8), (_7377, 8), (_7376, 8), (_7375, 8), (_7374, 8), (_7373, 8), (_7372, 8), (_7371, 8), (_7370, 8), (_7369, 8), (_7368, 8), (_7367, 8), (_7366, 8), (_7365, 8), (_7364, 8), (_7363, 8), (_7717, 8), (_7716, 8), (_7715, 8), (_7714, 8), (_7713, 8), (_7712, 8), (_7711, 8), (_7710, 8), (_7709, 8), (_7708, 8), (_7707, 8), (_7706, 8), (_7705, 8), (_7704, 8), (_7703, 8), (_7702, 8), (_7701, 8), (_7700, 8), (_7699, 8), (_7698, 8), (_7697, 8), (_7696, 8), (_7695, 8), (_7694, 8), (_7693, 8), (_7692, 8), (_7691, 8), (_7690, 8), (_7689, 8), (_7688, 8), (_7687, 8), (_7686, 8), (_8040, 8), (_8039, 8), (_8038, 8), (_8037, 8), (_8036, 8), (_8035, 8), (_8034, 8), (_8033, 8), (_8032, 8), (_8031, 8), (_8030, 8), (_8029, 8), (_8028, 8), (_8027, 8), (_8026, 8), (_8025, 8), (_8024, 8), (_8023, 8), (_8022, 8), (_8021, 8), (_8020, 8), (_8019, 8), (_8018, 8), (_8017, 8), (_8016, 8), (_8015, 8), (_8014, 8), (_8013, 8), (_8012, 8), (_8011, 8), (_8010, 8), (_8009, 8), (_8363, 8), (_8362, 8), (_8361, 8), (_8360, 8), (_8359, 8), (_8358, 8), (_8357, 8), (_8356, 8), (_8355, 8), (_8354, 8), (_8353, 8), (_8352, 8), (_8351, 8), (_8350, 8), (_8349, 8), (_8348, 8), (_8347, 8), (_8346, 8), (_8345, 8), (_8344, 8), (_8343, 8), (_8342, 8), (_8341, 8), (_8340, 8), (_8339, 8), (_8338, 8), (_8337, 8), (_8336, 8), (_8335, 8), (_8334, 8), (_8333, 8), (_8332, 8), (_8686, 8), (_8685, 8), (_8684, 8), (_8683, 8), (_8682, 8), (_8681, 8), (_8680, 8), (_8679, 8), (_8678, 8), (_8677, 8), (_8676, 8), (_8675, 8), (_8674, 8), (_8673, 8), (_8672, 8), (_8671, 8), (_8670, 8), (_8669, 8), (_8668, 8), (_8667, 8), (_8666, 8), (_8665, 8), (_8664, 8), (_8663, 8), (_8662, 8), (_8661, 8), (_8660, 8), (_8659, 8), (_8658, 8), (_8657, 8), (_8656, 8), (_8655, 8), (_9009, 8), (_9008, 8), (_9007, 8), (_9006, 8), (_9005, 8), (_9004, 8), (_9003, 8), (_9002, 8), (_9001, 8), (_9000, 8), (_8999, 8), (_8998, 8), (_8997, 8), (_8996, 8), (_8995, 8), (_8994, 8), (_8993, 8), (_8992, 8), (_8991, 8), (_8990, 8), (_8989, 8), (_8988, 8), (_8987, 8), (_8986, 8), (_8985, 8), (_8984, 8), (_8983, 8), (_8982, 8), (_8981, 8), (_8980, 8), (_8979, 8), (_8978, 8), (_9332, 8), (_9331, 8), (_9330, 8), (_9329, 8), (_9328, 8), (_9327, 8), (_9326, 8), (_9325, 8), (_9324, 8), (_9323, 8), (_9322, 8), (_9321, 8), (_9320, 8), (_9319, 8), (_9318, 8), (_9317, 8), (_9316, 8), (_9315, 8), (_9314, 8), (_9313, 8), (_9312, 8), (_9311, 8), (_9310, 8), (_9309, 8), (_9308, 8), (_9307, 8), (_9306, 8), (_9305, 8), (_9304, 8), (_9303, 8), (_9302, 8), (_9301, 8), (_9655, 8), (_9654, 8), (_9653, 8), (_9652, 8), (_9651, 8), (_9650, 8), (_9649, 8), (_9648, 8), (_9647, 8), (_9646, 8), (_9645, 8), (_9644, 8), (_9643, 8), (_9642, 8), (_9641, 8), (_9640, 8), (_9639, 8), (_9638, 8), (_9637, 8), (_9636, 8), (_9635, 8), (_9634, 8), (_9633, 8), (_9632, 8), (_9631, 8), (_9630, 8), (_9629, 8), (_9628, 8), (_9627, 8), (_9626, 8), (_9625, 8), (_9624, 8), (_9978, 8), (_9977, 8), (_9976, 8), (_9975, 8), (_9974, 8), (_9973, 8), (_9972, 8), (_9971, 8), (_9970, 8), (_9969, 8), (_9968, 8), (_9967, 8), (_9966, 8), (_9965, 8), (_9964, 8), (_9963, 8), (_9962, 8), (_9961, 8), (_9960, 8), (_9959, 8), (_9958, 8), (_9957, 8), (_9956, 8), (_9955, 8), (_9954, 8), (_9953, 8), (_9952, 8), (_9951, 8), (_9950, 8), (_9949, 8), (_9948, 8), (_9947, 8), (_10301, 8), (_10300, 8), (_10299, 8), (_10298, 8), (_10297, 8), (_10296, 8), (_10295, 8), (_10294, 8), (_10293, 8), (_10292, 8), (_10291, 8), (_10290, 8), (_10289, 8), (_10288, 8), (_10287, 8), (_10286, 8), (_10285, 8), (_10284, 8), (_10283, 8), (_10282, 8), (_10281, 8), (_10280, 8), (_10279, 8), (_10278, 8), (_10277, 8), (_10276, 8), (_10275, 8), (_10274, 8), (_10273, 8), (_10272, 8), (_10271, 8), (_10270, 8), (_10624, 8), (_10623, 8), (_10622, 8), (_10621, 8), (_10620, 8), (_10619, 8), (_10618, 8), (_10617, 8), (_10616, 8), (_10615, 8), (_10614, 8), (_10613, 8), (_10612, 8), (_10611, 8), (_10610, 8), (_10609, 8), (_10608, 8), (_10607, 8), (_10606, 8), (_10605, 8), (_10604, 8), (_10603, 8), (_10602, 8), (_10601, 8), (_10600, 8), (_10599, 8), (_10598, 8), (_10597, 8), (_10596, 8), (_10595, 8), (_10594, 8), (_10593, 8), (_10947, 8), (_10946, 8), (_10945, 8), (_10944, 8), (_10943, 8), (_10942, 8), (_10941, 8), (_10940, 8), (_10939, 8), (_10938, 8), (_10937, 8), (_10936, 8), (_10935, 8), (_10934, 8), (_10933, 8), (_10932, 8), (_10931, 8), (_10930, 8), (_10929, 8), (_10928, 8), (_10927, 8), (_10926, 8), (_10925, 8), (_10924, 8), (_10923, 8), (_10922, 8), (_10921, 8), (_10920, 8), (_10919, 8), (_10918, 8), (_10917, 8), (_10916, 8), (_11270, 8), (_11269, 8), (_11268, 8), (_11267, 8), (_11266, 8), (_11265, 8), (_11264, 8), (_11263, 8), (_11262, 8), (_11261, 8), (_11260, 8), (_11259, 8), (_11258, 8), (_11257, 8), (_11256, 8), (_11255, 8), (_11254, 8), (_11253, 8), (_11252, 8), (_11251, 8), (_11250, 8), (_11249, 8), (_11248, 8), (_11247, 8), (_11246, 8), (_11245, 8), (_11244, 8), (_11243, 8), (_11242, 8), (_11241, 8), (_11240, 8), (_11239, 8), (_11593, 8), (_11592, 8), (_11591, 8), (_11590, 8), (_11589, 8), (_11588, 8), (_11587, 8), (_11586, 8), (_11585, 8), (_11584, 8), (_11583, 8), (_11582, 8), (_11581, 8), (_11580, 8), (_11579, 8), (_11578, 8), (_11577, 8), (_11576, 8), (_11575, 8), (_11574, 8), (_11573, 8), (_11572, 8), (_11571, 8), (_11570, 8), (_11569, 8), (_11568, 8), (_11567, 8), (_11566, 8), (_11565, 8), (_11564, 8), (_11563, 8), (_11562, 8), (_11916, 8), (_11915, 8), (_11914, 8), (_11913, 8), (_11912, 8), (_11911, 8), (_11910, 8), (_11909, 8), (_11908, 8), (_11907, 8), (_11906, 8), (_11905, 8), (_11904, 8), (_11903, 8), (_11902, 8), (_11901, 8), (_11900, 8), (_11899, 8), (_11898, 8), (_11897, 8), (_11896, 8), (_11895, 8), (_11894, 8), (_11893, 8), (_11892, 8), (_11891, 8), (_11890, 8), (_11889, 8), (_11888, 8), (_11887, 8), (_11886, 8), (_11885, 8), (_12239, 8), (_12238, 8), (_12237, 8), (_12236, 8), (_12235, 8), (_12234, 8), (_12233, 8), (_12232, 8), (_12231, 8), (_12230, 8), (_12229, 8), (_12228, 8), (_12227, 8), (_12226, 8), (_12225, 8), (_12224, 8), (_12223, 8), (_12222, 8), (_12221, 8), (_12220, 8), (_12219, 8), (_12218, 8), (_12217, 8), (_12216, 8), (_12215, 8), (_12214, 8), (_12213, 8), (_12212, 8), (_12211, 8), (_12210, 8), (_12209, 8), (_12208, 8), (_12562, 8), (_12561, 8), (_12560, 8), (_12559, 8), (_12558, 8), (_12557, 8), (_12556, 8), (_12555, 8), (_12554, 8), (_12553, 8), (_12552, 8), (_12551, 8), (_12550, 8), (_12549, 8), (_12548, 8), (_12547, 8), (_12546, 8), (_12545, 8), (_12544, 8), (_12543, 8), (_12542, 8), (_12541, 8), (_12540, 8), (_12539, 8), (_12538, 8), (_12537, 8), (_12536, 8), (_12535, 8), (_12534, 8), (_12533, 8), (_12532, 8), (_12531, 8), (_12885, 8), (_12884, 8), (_12883, 8), (_12882, 8), (_12881, 8), (_12880, 8), (_12879, 8), (_12878, 8), (_12877, 8), (_12876, 8), (_12875, 8), (_12874, 8), (_12873, 8), (_12872, 8), (_12871, 8), (_12870, 8), (_12869, 8), (_12868, 8), (_12867, 8), (_12866, 8), (_12865, 8), (_12864, 8), (_12863, 8), (_12862, 8), (_12861, 8), (_12860, 8), (_12859, 8), (_12858, 8), (_12857, 8), (_12856, 8), (_12855, 8), (_12854, 8), (_13208, 8), (_13207, 8), (_13206, 8), (_13205, 8), (_13204, 8), (_13203, 8), (_13202, 8), (_13201, 8), (_13200, 8), (_13199, 8), (_13198, 8), (_13197, 8), (_13196, 8), (_13195, 8), (_13194, 8), (_13193, 8), (_13192, 8), (_13191, 8), (_13190, 8), (_13189, 8), (_13188, 8), (_13187, 8), (_13186, 8), (_13185, 8), (_13184, 8), (_13183, 8), (_13182, 8), (_13181, 8), (_13180, 8), (_13179, 8), (_13178, 8), (_13177, 8), (_13531, 8), (_13530, 8), (_13529, 8), (_13528, 8), (_13527, 8), (_13526, 8), (_13525, 8), (_13524, 8), (_13523, 8), (_13522, 8), (_13521, 8), (_13520, 8), (_13519, 8), (_13518, 8), (_13517, 8), (_13516, 8), (_13515, 8), (_13514, 8), (_13513, 8), (_13512, 8), (_13511, 8), (_13510, 8), (_13509, 8), (_13508, 8), (_13507, 8), (_13506, 8), (_13505, 8), (_13504, 8), (_13503, 8), (_13502, 8), (_13501, 8), (_13500, 8), (_13854, 8), (_13853, 8), (_13852, 8), (_13851, 8), (_13850, 8), (_13849, 8), (_13848, 8), (_13847, 8), (_13846, 8), (_13845, 8), (_13844, 8), (_13843, 8), (_13842, 8), (_13841, 8), (_13840, 8), (_13839, 8), (_13838, 8), (_13837, 8), (_13836, 8), (_13835, 8), (_13834, 8), (_13833, 8), (_13832, 8), (_13831, 8), (_13830, 8), (_13829, 8), (_13828, 8), (_13827, 8), (_13826, 8), (_13825, 8), (_13824, 8), (_13823, 8), (_14177, 8), (_14176, 8), (_14175, 8), (_14174, 8), (_14173, 8), (_14172, 8), (_14171, 8), (_14170, 8), (_14169, 8), (_14168, 8), (_14167, 8), (_14166, 8), (_14165, 8), (_14164, 8), (_14163, 8), (_14162, 8), (_14161, 8), (_14160, 8), (_14159, 8), (_14158, 8), (_14157, 8), (_14156, 8), (_14155, 8), (_14154, 8), (_14153, 8), (_14152, 8), (_14151, 8), (_14150, 8), (_14149, 8), (_14148, 8), (_14147, 8), (_14146, 8), (_14500, 8), (_14499, 8), (_14498, 8), (_14497, 8), (_14496, 8), (_14495, 8), (_14494, 8), (_14493, 8), (_14492, 8), (_14491, 8), (_14490, 8), (_14489, 8), (_14488, 8), (_14487, 8), (_14486, 8), (_14485, 8), (_14484, 8), (_14483, 8), (_14482, 8), (_14481, 8), (_14480, 8), (_14479, 8), (_14478, 8), (_14477, 8), (_14476, 8), (_14475, 8), (_14474, 8), (_14473, 8), (_14472, 8), (_14471, 8), (_14470, 8), (_14469, 8), (_14823, 8), (_14822, 8), (_14821, 8), (_14820, 8), (_14819, 8), (_14818, 8), (_14817, 8), (_14816, 8), (_14815, 8), (_14814, 8), (_14813, 8), (_14812, 8), (_14811, 8), (_14810, 8), (_14809, 8), (_14808, 8), (_14807, 8), (_14806, 8), (_14805, 8), (_14804, 8), (_14803, 8), (_14802, 8), (_14801, 8), (_14800, 8), (_14799, 8), (_14798, 8), (_14797, 8), (_14796, 8), (_14795, 8), (_14794, 8), (_14793, 8), (_14792, 8), (_15146, 8), (_15145, 8), (_15144, 8), (_15143, 8), (_15142, 8), (_15141, 8), (_15140, 8), (_15139, 8), (_15138, 8), (_15137, 8), (_15136, 8), (_15135, 8), (_15134, 8), (_15133, 8), (_15132, 8), (_15131, 8), (_15130, 8), (_15129, 8), (_15128, 8), (_15127, 8), (_15126, 8), (_15125, 8), (_15124, 8), (_15123, 8), (_15122, 8), (_15121, 8), (_15120, 8), (_15119, 8), (_15118, 8), (_15117, 8), (_15116, 8), (_15115, 8), (_15469, 8), (_15468, 8), (_15467, 8), (_15466, 8), (_15465, 8), (_15464, 8), (_15463, 8), (_15462, 8), (_15461, 8), (_15460, 8), (_15459, 8), (_15458, 8), (_15457, 8), (_15456, 8), (_15455, 8), (_15454, 8), (_15453, 8), (_15452, 8), (_15451, 8), (_15450, 8), (_15449, 8), (_15448, 8), (_15447, 8), (_15446, 8), (_15445, 8), (_15444, 8), (_15443, 8), (_15442, 8), (_15441, 8), (_15440, 8), (_15439, 8), (_15438, 8), (_15792, 8), (_15791, 8), (_15790, 8), (_15789, 8), (_15788, 8), (_15787, 8), (_15786, 8), (_15785, 8), (_15784, 8), (_15783, 8), (_15782, 8), (_15781, 8), (_15780, 8), (_15779, 8), (_15778, 8), (_15777, 8), (_15776, 8), (_15775, 8), (_15774, 8), (_15773, 8), (_15772, 8), (_15771, 8), (_15770, 8), (_15769, 8), (_15768, 8), (_15767, 8), (_15766, 8), (_15765, 8), (_15764, 8), (_15763, 8), (_15762, 8), (_15761, 8), (_16115, 8), (_16114, 8), (_16113, 8), (_16112, 8), (_16111, 8), (_16110, 8), (_16109, 8), (_16108, 8), (_16107, 8), (_16106, 8), (_16105, 8), (_16104, 8), (_16103, 8), (_16102, 8), (_16101, 8), (_16100, 8), (_16099, 8), (_16098, 8), (_16097, 8), (_16096, 8), (_16095, 8), (_16094, 8), (_16093, 8), (_16092, 8), (_16091, 8), (_16090, 8), (_16089, 8), (_16088, 8), (_16087, 8), (_16086, 8), (_16085, 8), (_16084, 8), (_16438, 8), (_16437, 8), (_16436, 8), (_16435, 8), (_16434, 8), (_16433, 8), (_16432, 8), (_16431, 8), (_16430, 8), (_16429, 8), (_16428, 8), (_16427, 8), (_16426, 8), (_16425, 8), (_16424, 8), (_16423, 8), (_16422, 8), (_16421, 8), (_16420, 8), (_16419, 8), (_16418, 8), (_16417, 8), (_16416, 8), (_16415, 8), (_16414, 8), (_16413, 8), (_16412, 8), (_16411, 8), (_16410, 8), (_16409, 8), (_16408, 8), (_16407, 8), (_16761, 8), (_16760, 8), (_16759, 8), (_16758, 8), (_16757, 8), (_16756, 8), (_16755, 8), (_16754, 8), (_16753, 8), (_16752, 8), (_16751, 8), (_16750, 8), (_16749, 8), (_16748, 8), (_16747, 8), (_16746, 8), (_16745, 8), (_16744, 8), (_16743, 8), (_16742, 8), (_16741, 8), (_16740, 8), (_16739, 8), (_16738, 8), (_16737, 8), (_16736, 8), (_16735, 8), (_16734, 8), (_16733, 8), (_16732, 8), (_16731, 8), (_16730, 8), (_17084, 8), (_17083, 8), (_17082, 8), (_17081, 8), (_17080, 8), (_17079, 8), (_17078, 8), (_17077, 8), (_17076, 8), (_17075, 8), (_17074, 8), (_17073, 8), (_17072, 8), (_17071, 8), (_17070, 8), (_17069, 8), (_17068, 8), (_17067, 8), (_17066, 8), (_17065, 8), (_17064, 8), (_17063, 8), (_17062, 8), (_17061, 8), (_17060, 8), (_17059, 8), (_17058, 8), (_17057, 8), (_17056, 8), (_17055, 8), (_17054, 8), (_17053, 8), (_17407, 8), (_17406, 8), (_17405, 8), (_17404, 8), (_17403, 8), (_17402, 8), (_17401, 8), (_17400, 8), (_17399, 8), (_17398, 8), (_17397, 8), (_17396, 8), (_17395, 8), (_17394, 8), (_17393, 8), (_17392, 8), (_17391, 8), (_17390, 8), (_17389, 8), (_17388, 8), (_17387, 8), (_17386, 8), (_17385, 8), (_17384, 8), (_17383, 8), (_17382, 8), (_17381, 8), (_17380, 8), (_17379, 8), (_17378, 8), (_17377, 8), (_17376, 8), (_17730, 8), (_17729, 8), (_17728, 8), (_17727, 8), (_17726, 8), (_17725, 8), (_17724, 8), (_17723, 8), (_17722, 8), (_17721, 8), (_17720, 8), (_17719, 8), (_17718, 8), (_17717, 8), (_17716, 8), (_17715, 8), (_17714, 8), (_17713, 8), (_17712, 8), (_17711, 8), (_17710, 8), (_17709, 8), (_17708, 8), (_17707, 8), (_17706, 8), (_17705, 8), (_17704, 8), (_17703, 8), (_17702, 8), (_17701, 8), (_17700, 8), (_17699, 8), (_18053, 8), (_18052, 8), (_18051, 8), (_18050, 8), (_18049, 8), (_18048, 8), (_18047, 8), (_18046, 8), (_18045, 8), (_18044, 8), (_18043, 8), (_18042, 8), (_18041, 8), (_18040, 8), (_18039, 8), (_18038, 8), (_18037, 8), (_18036, 8), (_18035, 8), (_18034, 8), (_18033, 8), (_18032, 8), (_18031, 8), (_18030, 8), (_18029, 8), (_18028, 8), (_18027, 8), (_18026, 8), (_18025, 8), (_18024, 8), (_18023, 8), (_18022, 8), (_18376, 8), (_18375, 8), (_18374, 8), (_18373, 8), (_18372, 8), (_18371, 8), (_18370, 8), (_18369, 8), (_18368, 8), (_18367, 8), (_18366, 8), (_18365, 8), (_18364, 8), (_18363, 8), (_18362, 8), (_18361, 8), (_18360, 8), (_18359, 8), (_18358, 8), (_18357, 8), (_18356, 8), (_18355, 8), (_18354, 8), (_18353, 8), (_18352, 8), (_18351, 8), (_18350, 8), (_18349, 8), (_18348, 8), (_18347, 8), (_18346, 8), (_18345, 8), (_18699, 8), (_18698, 8), (_18697, 8), (_18696, 8), (_18695, 8), (_18694, 8), (_18693, 8), (_18692, 8), (_18691, 8), (_18690, 8), (_18689, 8), (_18688, 8), (_18687, 8), (_18686, 8), (_18685, 8), (_18684, 8), (_18683, 8), (_18682, 8), (_18681, 8), (_18680, 8), (_18679, 8), (_18678, 8), (_18677, 8), (_18676, 8), (_18675, 8), (_18674, 8), (_18673, 8), (_18672, 8), (_18671, 8), (_18670, 8), (_18669, 8), (_18668, 8), (_19022, 8), (_19021, 8), (_19020, 8), (_19019, 8), (_19018, 8), (_19017, 8), (_19016, 8), (_19015, 8), (_19014, 8), (_19013, 8), (_19012, 8), (_19011, 8), (_19010, 8), (_19009, 8), (_19008, 8), (_19007, 8), (_19006, 8), (_19005, 8), (_19004, 8), (_19003, 8), (_19002, 8), (_19001, 8), (_19000, 8), (_18999, 8), (_18998, 8), (_18997, 8), (_18996, 8), (_18995, 8), (_18994, 8), (_18993, 8), (_18992, 8), (_18991, 8), (_19345, 8), (_19344, 8), (_19343, 8), (_19342, 8), (_19341, 8), (_19340, 8), (_19339, 8), (_19338, 8), (_19337, 8), (_19336, 8), (_19335, 8), (_19334, 8), (_19333, 8), (_19332, 8), (_19331, 8), (_19330, 8), (_19329, 8), (_19328, 8), (_19327, 8), (_19326, 8), (_19325, 8), (_19324, 8), (_19323, 8), (_19322, 8), (_19321, 8), (_19320, 8), (_19319, 8), (_19318, 8), (_19317, 8), (_19316, 8), (_19315, 8), (_19314, 8), (_19668, 8), (_19667, 8), (_19666, 8), (_19665, 8), (_19664, 8), (_19663, 8), (_19662, 8), (_19661, 8), (_19660, 8), (_19659, 8), (_19658, 8), (_19657, 8), (_19656, 8), (_19655, 8), (_19654, 8), (_19653, 8), (_19652, 8), (_19651, 8), (_19650, 8), (_19649, 8), (_19648, 8), (_19647, 8), (_19646, 8), (_19645, 8), (_19644, 8), (_19643, 8), (_19642, 8), (_19641, 8), (_19640, 8), (_19639, 8), (_19638, 8), (_19637, 8), (_19991, 8), (_19990, 8), (_19989, 8), (_19988, 8), (_19987, 8), (_19986, 8), (_19985, 8), (_19984, 8), (_19983, 8), (_19982, 8), (_19981, 8), (_19980, 8), (_19979, 8), (_19978, 8), (_19977, 8), (_19976, 8), (_19975, 8), (_19974, 8), (_19973, 8), (_19972, 8), (_19971, 8), (_19970, 8), (_19969, 8), (_19968, 8), (_19967, 8), (_19966, 8), (_19965, 8), (_19964, 8), (_19963, 8), (_19962, 8), (_19961, 8), (_19960, 8), (_20314, 8), (_20313, 8), (_20312, 8), (_20311, 8), (_20310, 8), (_20309, 8), (_20308, 8), (_20307, 8), (_20306, 8), (_20305, 8), (_20304, 8), (_20303, 8), (_20302, 8), (_20301, 8), (_20300, 8), (_20299, 8), (_20298, 8), (_20297, 8), (_20296, 8), (_20295, 8), (_20294, 8), (_20293, 8), (_20292, 8), (_20291, 8), (_20290, 8), (_20289, 8), (_20288, 8), (_20287, 8), (_20286, 8), (_20285, 8), (_20284, 8), (_20283, 8), (_20637, 8), (_20636, 8), (_20635, 8), (_20634, 8), (_20633, 8), (_20632, 8), (_20631, 8), (_20630, 8), (_20629, 8), (_20628, 8), (_20627, 8), (_20626, 8), (_20625, 8), (_20624, 8), (_20623, 8), (_20622, 8), (_20621, 8), (_20620, 8), (_20619, 8), (_20618, 8), (_20617, 8), (_20616, 8), (_20615, 8), (_20614, 8), (_20613, 8), (_20612, 8), (_20611, 8), (_20610, 8), (_20609, 8), (_20608, 8), (_20607, 8), (_20606, 8), (_20960, 8), (_20959, 8), (_20958, 8), (_20957, 8), (_20956, 8), (_20955, 8), (_20954, 8), (_20953, 8), (_20952, 8), (_20951, 8), (_20950, 8), (_20949, 8), (_20948, 8), (_20947, 8), (_20946, 8), (_20945, 8), (_20944, 8), (_20943, 8), (_20942, 8), (_20941, 8), (_20940, 8), (_20939, 8), (_20938, 8), (_20937, 8), (_20936, 8), (_20935, 8), (_20934, 8), (_20933, 8), (_20932, 8), (_20931, 8), (_20930, 8), (_20929, 8), (_21283, 8), (_21282, 8), (_21281, 8), (_21280, 8), (_21279, 8), (_21278, 8), (_21277, 8), (_21276, 8), (_21275, 8), (_21274, 8), (_21273, 8), (_21272, 8), (_21271, 8), (_21270, 8), (_21269, 8), (_21268, 8), (_21267, 8), (_21266, 8), (_21265, 8), (_21264, 8), (_21263, 8), (_21262, 8), (_21261, 8), (_21260, 8), (_21259, 8), (_21258, 8), (_21257, 8), (_21256, 8), (_21255, 8), (_21254, 8), (_21253, 8), (_21252, 8), (_21606, 8), (_21605, 8), (_21604, 8), (_21603, 8), (_21602, 8), (_21601, 8), (_21600, 8), (_21599, 8), (_21598, 8), (_21597, 8), (_21596, 8), (_21595, 8), (_21594, 8), (_21593, 8), (_21592, 8), (_21591, 8), (_21590, 8), (_21589, 8), (_21588, 8), (_21587, 8), (_21586, 8), (_21585, 8), (_21584, 8), (_21583, 8), (_21582, 8), (_21581, 8), (_21580, 8), (_21579, 8), (_21578, 8), (_21577, 8), (_21576, 8), (_21575, 8), (_21929, 8), (_21928, 8), (_21927, 8), (_21926, 8), (_21925, 8), (_21924, 8), (_21923, 8), (_21922, 8), (_21921, 8), (_21920, 8), (_21919, 8), (_21918, 8), (_21917, 8), (_21916, 8), (_21915, 8), (_21914, 8), (_21913, 8), (_21912, 8), (_21911, 8), (_21910, 8), (_21909, 8), (_21908, 8), (_21907, 8), (_21906, 8), (_21905, 8), (_21904, 8), (_21903, 8), (_21902, 8), (_21901, 8), (_21900, 8), (_21899, 8), (_21898, 8), (_22252, 8), (_22251, 8), (_22250, 8), (_22249, 8), (_22248, 8), (_22247, 8), (_22246, 8), (_22245, 8), (_22244, 8), (_22243, 8), (_22242, 8), (_22241, 8), (_22240, 8), (_22239, 8), (_22238, 8), (_22237, 8), (_22236, 8), (_22235, 8), (_22234, 8), (_22233, 8), (_22232, 8), (_22231, 8), (_22230, 8), (_22229, 8), (_22228, 8), (_22227, 8), (_22226, 8), (_22225, 8), (_22224, 8), (_22223, 8), (_22222, 8), (_22221, 8), (_22575, 8), (_22574, 8), (_22573, 8), (_22572, 8), (_22571, 8), (_22570, 8), (_22569, 8), (_22568, 8), (_22567, 8), (_22566, 8), (_22565, 8), (_22564, 8), (_22563, 8), (_22562, 8), (_22561, 8), (_22560, 8), (_22559, 8), (_22558, 8), (_22557, 8), (_22556, 8), (_22555, 8), (_22554, 8), (_22553, 8), (_22552, 8), (_22551, 8), (_22550, 8), (_22549, 8), (_22548, 8), (_22547, 8), (_22546, 8), (_22545, 8), (_22544, 8), (_22898, 8), (_22897, 8), (_22896, 8), (_22895, 8), (_22894, 8), (_22893, 8), (_22892, 8), (_22891, 8), (_22890, 8), (_22889, 8), (_22888, 8), (_22887, 8), (_22886, 8), (_22885, 8), (_22884, 8), (_22883, 8), (_22882, 8), (_22881, 8), (_22880, 8), (_22879, 8), (_22878, 8), (_22877, 8), (_22876, 8), (_22875, 8), (_22874, 8), (_22873, 8), (_22872, 8), (_22871, 8), (_22870, 8), (_22869, 8), (_22868, 8), (_22867, 8), (_23221, 8), (_23220, 8), (_23219, 8), (_23218, 8), (_23217, 8), (_23216, 8), (_23215, 8), (_23214, 8), (_23213, 8), (_23212, 8), (_23211, 8), (_23210, 8), (_23209, 8), (_23208, 8), (_23207, 8), (_23206, 8), (_23205, 8), (_23204, 8), (_23203, 8), (_23202, 8), (_23201, 8), (_23200, 8), (_23199, 8), (_23198, 8), (_23197, 8), (_23196, 8), (_23195, 8), (_23194, 8), (_23193, 8), (_23192, 8), (_23191, 8), (_23190, 8), (_23544, 8), (_23543, 8), (_23542, 8), (_23541, 8), (_23540, 8), (_23539, 8), (_23538, 8), (_23537, 8), (_23536, 8), (_23535, 8), (_23534, 8), (_23533, 8), (_23532, 8), (_23531, 8), (_23530, 8), (_23529, 8), (_23528, 8), (_23527, 8), (_23526, 8), (_23525, 8), (_23524, 8), (_23523, 8), (_23522, 8), (_23521, 8), (_23520, 8), (_23519, 8), (_23518, 8), (_23517, 8), (_23516, 8), (_23515, 8), (_23514, 8), (_23513, 8), (_23867, 8), (_23866, 8), (_23865, 8), (_23864, 8), (_23863, 8), (_23862, 8), (_23861, 8), (_23860, 8), (_23859, 8), (_23858, 8), (_23857, 8), (_23856, 8), (_23855, 8), (_23854, 8), (_23853, 8), (_23852, 8), (_23851, 8), (_23850, 8), (_23849, 8), (_23848, 8), (_23847, 8), (_23846, 8), (_23845, 8), (_23844, 8), (_23843, 8), (_23842, 8), (_23841, 8), (_23840, 8), (_23839, 8), (_23838, 8), (_23837, 8), (_23836, 8), (_24190, 8), (_24189, 8), (_24188, 8), (_24187, 8), (_24186, 8), (_24185, 8), (_24184, 8), (_24183, 8), (_24182, 8), (_24181, 8), (_24180, 8), (_24179, 8), (_24178, 8), (_24177, 8), (_24176, 8), (_24175, 8), (_24174, 8), (_24173, 8), (_24172, 8), (_24171, 8), (_24170, 8), (_24169, 8), (_24168, 8), (_24167, 8), (_24166, 8), (_24165, 8), (_24164, 8), (_24163, 8), (_24162, 8), (_24161, 8), (_24160, 8), (_24159, 8), (_24513, 8), (_24512, 8), (_24511, 8), (_24510, 8), (_24509, 8), (_24508, 8), (_24507, 8), (_24506, 8), (_24505, 8), (_24504, 8), (_24503, 8), (_24502, 8), (_24501, 8), (_24500, 8), (_24499, 8), (_24498, 8), (_24497, 8), (_24496, 8), (_24495, 8), (_24494, 8), (_24493, 8), (_24492, 8), (_24491, 8), (_24490, 8), (_24489, 8), (_24488, 8), (_24487, 8), (_24486, 8), (_24485, 8), (_24484, 8), (_24483, 8), (_24482, 8), (_24836, 8), (_24835, 8), (_24834, 8), (_24833, 8), (_24832, 8), (_24831, 8), (_24830, 8), (_24829, 8), (_24828, 8), (_24827, 8), (_24826, 8), (_24825, 8), (_24824, 8), (_24823, 8), (_24822, 8), (_24821, 8), (_24820, 8), (_24819, 8), (_24818, 8), (_24817, 8), (_24816, 8), (_24815, 8), (_24814, 8), (_24813, 8), (_24812, 8), (_24811, 8), (_24810, 8), (_24809, 8), (_24808, 8), (_24807, 8), (_24806, 8), (_24805, 8), (_25159, 8), (_25158, 8), (_25157, 8), (_25156, 8), (_25155, 8), (_25154, 8), (_25153, 8), (_25152, 8), (_25151, 8), (_25150, 8), (_25149, 8), (_25148, 8), (_25147, 8), (_25146, 8), (_25145, 8), (_25144, 8), (_25143, 8), (_25142, 8), (_25141, 8), (_25140, 8), (_25139, 8), (_25138, 8), (_25137, 8), (_25136, 8), (_25135, 8), (_25134, 8), (_25133, 8), (_25132, 8), (_25131, 8), (_25130, 8), (_25129, 8), (_25128, 8), (_25482, 8), (_25481, 8), (_25480, 8), (_25479, 8), (_25478, 8), (_25477, 8), (_25476, 8), (_25475, 8), (_25474, 8), (_25473, 8), (_25472, 8), (_25471, 8), (_25470, 8), (_25469, 8), (_25468, 8), (_25467, 8), (_25466, 8), (_25465, 8), (_25464, 8), (_25463, 8), (_25462, 8), (_25461, 8), (_25460, 8), (_25459, 8), (_25458, 8), (_25457, 8), (_25456, 8), (_25455, 8), (_25454, 8), (_25453, 8), (_25452, 8), (_25451, 8), (_25805, 8), (_25804, 8), (_25803, 8), (_25802, 8), (_25801, 8), (_25800, 8), (_25799, 8), (_25798, 8), (_25797, 8), (_25796, 8), (_25795, 8), (_25794, 8), (_25793, 8), (_25792, 8), (_25791, 8), (_25790, 8), (_25789, 8), (_25788, 8), (_25787, 8), (_25786, 8), (_25785, 8), (_25784, 8), (_25783, 8), (_25782, 8), (_25781, 8), (_25780, 8), (_25779, 8), (_25778, 8), (_25777, 8), (_25776, 8), (_25775, 8), (_25774, 8), (_26128, 8), (_26127, 8), (_26126, 8), (_26125, 8), (_26124, 8), (_26123, 8), (_26122, 8), (_26121, 8), (_26120, 8), (_26119, 8), (_26118, 8), (_26117, 8), (_26116, 8), (_26115, 8), (_26114, 8), (_26113, 8), (_26112, 8), (_26111, 8), (_26110, 8), (_26109, 8), (_26108, 8), (_26107, 8), (_26106, 8), (_26105, 8), (_26104, 8), (_26103, 8), (_26102, 8), (_26101, 8), (_26100, 8), (_26099, 8), (_26098, 8), (_26097, 8), (_26451, 8), (_26450, 8), (_26449, 8), (_26448, 8), (_26447, 8), (_26446, 8), (_26445, 8), (_26444, 8), (_26443, 8), (_26442, 8), (_26441, 8), (_26440, 8), (_26439, 8), (_26438, 8), (_26437, 8), (_26436, 8), (_26435, 8), (_26434, 8), (_26433, 8), (_26432, 8), (_26431, 8), (_26430, 8), (_26429, 8), (_26428, 8), (_26427, 8), (_26426, 8), (_26425, 8), (_26424, 8), (_26423, 8), (_26422, 8), (_26421, 8), (_26420, 8), (_26774, 8), (_26773, 8), (_26772, 8), (_26771, 8), (_26770, 8), (_26769, 8), (_26768, 8), (_26767, 8), (_26766, 8), (_26765, 8), (_26764, 8), (_26763, 8), (_26762, 8), (_26761, 8), (_26760, 8), (_26759, 8), (_26758, 8), (_26757, 8), (_26756, 8), (_26755, 8), (_26754, 8), (_26753, 8), (_26752, 8), (_26751, 8), (_26750, 8), (_26749, 8), (_26748, 8), (_26747, 8), (_26746, 8), (_26745, 8), (_26744, 8), (_26743, 8), (_27097, 8), (_27096, 8), (_27095, 8), (_27094, 8), (_27093, 8), (_27092, 8), (_27091, 8), (_27090, 8), (_27089, 8), (_27088, 8), (_27087, 8), (_27086, 8), (_27085, 8), (_27084, 8), (_27083, 8), (_27082, 8), (_27081, 8), (_27080, 8), (_27079, 8), (_27078, 8), (_27077, 8), (_27076, 8), (_27075, 8), (_27074, 8), (_27073, 8), (_27072, 8), (_27071, 8), (_27070, 8), (_27069, 8), (_27068, 8), (_27067, 8), (_27066, 8), (_27420, 8), (_27419, 8), (_27418, 8), (_27417, 8), (_27416, 8), (_27415, 8), (_27414, 8), (_27413, 8), (_27412, 8), (_27411, 8), (_27410, 8), (_27409, 8), (_27408, 8), (_27407, 8), (_27406, 8), (_27405, 8), (_27404, 8), (_27403, 8), (_27402, 8), (_27401, 8), (_27400, 8), (_27399, 8), (_27398, 8), (_27397, 8), (_27396, 8), (_27395, 8), (_27394, 8), (_27393, 8), (_27392, 8), (_27391, 8), (_27390, 8), (_27389, 8), (_27743, 8), (_27742, 8), (_27741, 8), (_27740, 8), (_27739, 8), (_27738, 8), (_27737, 8), (_27736, 8), (_27735, 8), (_27734, 8), (_27733, 8), (_27732, 8), (_27731, 8), (_27730, 8), (_27729, 8), (_27728, 8), (_27727, 8), (_27726, 8), (_27725, 8), (_27724, 8), (_27723, 8), (_27722, 8), (_27721, 8), (_27720, 8), (_27719, 8), (_27718, 8), (_27717, 8), (_27716, 8), (_27715, 8), (_27714, 8), (_27713, 8), (_27712, 8), (_28066, 8), (_28065, 8), (_28064, 8), (_28063, 8), (_28062, 8), (_28061, 8), (_28060, 8), (_28059, 8), (_28058, 8), (_28057, 8), (_28056, 8), (_28055, 8), (_28054, 8), (_28053, 8), (_28052, 8), (_28051, 8), (_28050, 8), (_28049, 8), (_28048, 8), (_28047, 8), (_28046, 8), (_28045, 8), (_28044, 8), (_28043, 8), (_28042, 8), (_28041, 8), (_28040, 8), (_28039, 8), (_28038, 8), (_28037, 8), (_28036, 8), (_28035, 8), (_28389, 8), (_28388, 8), (_28387, 8), (_28386, 8), (_28385, 8), (_28384, 8), (_28383, 8), (_28382, 8), (_28381, 8), (_28380, 8), (_28379, 8), (_28378, 8), (_28377, 8), (_28376, 8), (_28375, 8), (_28374, 8), (_28373, 8), (_28372, 8), (_28371, 8), (_28370, 8), (_28369, 8), (_28368, 8), (_28367, 8), (_28366, 8), (_28365, 8), (_28364, 8), (_28363, 8), (_28362, 8), (_28361, 8), (_28360, 8), (_28359, 8), (_28358, 8), (_28712, 8), (_28711, 8), (_28710, 8), (_28709, 8), (_28708, 8), (_28707, 8), (_28706, 8), (_28705, 8), (_28704, 8), (_28703, 8), (_28702, 8), (_28701, 8), (_28700, 8), (_28699, 8), (_28698, 8), (_28697, 8), (_28696, 8), (_28695, 8), (_28694, 8), (_28693, 8), (_28692, 8), (_28691, 8), (_28690, 8), (_28689, 8), (_28688, 8), (_28687, 8), (_28686, 8), (_28685, 8), (_28684, 8), (_28683, 8), (_28682, 8), (_28681, 8), (_29035, 8), (_29034, 8), (_29033, 8), (_29032, 8), (_29031, 8), (_29030, 8), (_29029, 8), (_29028, 8), (_29027, 8), (_29026, 8), (_29025, 8), (_29024, 8), (_29023, 8), (_29022, 8), (_29021, 8), (_29020, 8), (_29019, 8), (_29018, 8), (_29017, 8), (_29016, 8), (_29015, 8), (_29014, 8), (_29013, 8), (_29012, 8), (_29011, 8), (_29010, 8), (_29009, 8), (_29008, 8), (_29007, 8), (_29006, 8), (_29005, 8), (_29004, 8), (_29358, 8), (_29357, 8), (_29356, 8), (_29355, 8), (_29354, 8), (_29353, 8), (_29352, 8), (_29351, 8), (_29350, 8), (_29349, 8), (_29348, 8), (_29347, 8), (_29346, 8), (_29345, 8), (_29344, 8), (_29343, 8), (_29342, 8), (_29341, 8), (_29340, 8), (_29339, 8), (_29338, 8), (_29337, 8), (_29336, 8), (_29335, 8), (_29334, 8), (_29333, 8), (_29332, 8), (_29331, 8), (_29330, 8), (_29329, 8), (_29328, 8), (_29327, 8), (_29681, 8), (_29680, 8), (_29679, 8), (_29678, 8), (_29677, 8), (_29676, 8), (_29675, 8), (_29674, 8), (_29673, 8), (_29672, 8), (_29671, 8), (_29670, 8), (_29669, 8), (_29668, 8), (_29667, 8), (_29666, 8), (_29665, 8), (_29664, 8), (_29663, 8), (_29662, 8), (_29661, 8), (_29660, 8), (_29659, 8), (_29658, 8), (_29657, 8), (_29656, 8), (_29655, 8), (_29654, 8), (_29653, 8), (_29652, 8), (_29651, 8), (_29650, 8), (_30004, 8), (_30003, 8), (_30002, 8), (_30001, 8), (_30000, 8), (_29999, 8), (_29998, 8), (_29997, 8), (_29996, 8), (_29995, 8), (_29994, 8), (_29993, 8), (_29992, 8), (_29991, 8), (_29990, 8), (_29989, 8), (_29988, 8), (_29987, 8), (_29986, 8), (_29985, 8), (_29984, 8), (_29983, 8), (_29982, 8), (_29981, 8), (_29980, 8), (_29979, 8), (_29978, 8), (_29977, 8), (_29976, 8), (_29975, 8), (_29974, 8), (_29973, 8), (_30327, 8), (_30326, 8), (_30325, 8), (_30324, 8), (_30323, 8), (_30322, 8), (_30321, 8), (_30320, 8), (_30319, 8), (_30318, 8), (_30317, 8), (_30316, 8), (_30315, 8), (_30314, 8), (_30313, 8), (_30312, 8), (_30311, 8), (_30310, 8), (_30309, 8), (_30308, 8), (_30307, 8), (_30306, 8), (_30305, 8), (_30304, 8), (_30303, 8), (_30302, 8), (_30301, 8), (_30300, 8), (_30299, 8), (_30298, 8), (_30297, 8), (_30296, 8), (_30650, 8), (_30649, 8), (_30648, 8), (_30647, 8), (_30646, 8), (_30645, 8), (_30644, 8), (_30643, 8), (_30642, 8), (_30641, 8), (_30640, 8), (_30639, 8), (_30638, 8), (_30637, 8), (_30636, 8), (_30635, 8), (_30634, 8), (_30633, 8), (_30632, 8), (_30631, 8), (_30630, 8), (_30629, 8), (_30628, 8), (_30627, 8), (_30626, 8), (_30625, 8), (_30624, 8), (_30623, 8), (_30622, 8), (_30621, 8), (_30620, 8), (_30619, 8), (_30973, 8), (_30972, 8), (_30971, 8), (_30970, 8), (_30969, 8), (_30968, 8), (_30967, 8), (_30966, 8), (_30965, 8), (_30964, 8), (_30963, 8), (_30962, 8), (_30961, 8), (_30960, 8), (_30959, 8), (_30958, 8), (_30957, 8), (_30956, 8), (_30955, 8), (_30954, 8), (_30953, 8), (_30952, 8), (_30951, 8), (_30950, 8), (_30949, 8), (_30948, 8), (_30947, 8), (_30946, 8), (_30945, 8), (_30944, 8), (_30943, 8), (_30942, 8), (_31296, 8), (_31295, 8), (_31294, 8), (_31293, 8), (_31292, 8), (_31291, 8), (_31290, 8), (_31289, 8), (_31288, 8), (_31287, 8), (_31286, 8), (_31285, 8), (_31284, 8), (_31283, 8), (_31282, 8), (_31281, 8), (_31280, 8), (_31279, 8), (_31278, 8), (_31277, 8), (_31276, 8), (_31275, 8), (_31274, 8), (_31273, 8), (_31272, 8), (_31271, 8), (_31270, 8), (_31269, 8), (_31268, 8), (_31267, 8), (_31266, 8), (_31265, 8), (_31619, 8), (_31618, 8), (_31617, 8), (_31616, 8), (_31615, 8), (_31614, 8), (_31613, 8), (_31612, 8), (_31611, 8), (_31610, 8), (_31609, 8), (_31608, 8), (_31607, 8), (_31606, 8), (_31605, 8), (_31604, 8), (_31603, 8), (_31602, 8), (_31601, 8), (_31600, 8), (_31599, 8), (_31598, 8), (_31597, 8), (_31596, 8), (_31595, 8), (_31594, 8), (_31593, 8), (_31592, 8), (_31591, 8), (_31590, 8), (_31589, 8), (_31588, 8), (_31942, 8), (_31941, 8), (_31940, 8), (_31939, 8), (_31938, 8), (_31937, 8), (_31936, 8), (_31935, 8), (_31934, 8), (_31933, 8), (_31932, 8), (_31931, 8), (_31930, 8), (_31929, 8), (_31928, 8), (_31927, 8), (_31926, 8), (_31925, 8), (_31924, 8), (_31923, 8), (_31922, 8), (_31921, 8), (_31920, 8), (_31919, 8), (_31918, 8), (_31917, 8), (_31916, 8), (_31915, 8), (_31914, 8), (_31913, 8), (_31912, 8), (_31911, 8), (_32265, 8), (_32264, 8), (_32263, 8), (_32262, 8), (_32261, 8), (_32260, 8), (_32259, 8), (_32258, 8), (_32257, 8), (_32256, 8), (_32255, 8), (_32254, 8), (_32253, 8), (_32252, 8), (_32251, 8), (_32250, 8), (_32249, 8), (_32248, 8), (_32247, 8), (_32246, 8), (_32245, 8), (_32244, 8), (_32243, 8), (_32242, 8), (_32241, 8), (_32240, 8), (_32239, 8), (_32238, 8), (_32237, 8), (_32236, 8), (_32235, 8), (_32234, 8), (_32588, 8), (_32587, 8), (_32586, 8), (_32585, 8), (_32584, 8), (_32583, 8), (_32582, 8), (_32581, 8), (_32580, 8), (_32579, 8), (_32578, 8), (_32577, 8), (_32576, 8), (_32575, 8), (_32574, 8), (_32573, 8), (_32572, 8), (_32571, 8), (_32570, 8), (_32569, 8), (_32568, 8), (_32567, 8), (_32566, 8), (_32565, 8), (_32564, 8), (_32563, 8), (_32562, 8), (_32561, 8), (_32560, 8), (_32559, 8), (_32558, 8), (_32557, 8), (_32911, 8), (_32910, 8), (_32909, 8), (_32908, 8), (_32907, 8), (_32906, 8), (_32905, 8), (_32904, 8), (_32903, 8), (_32902, 8), (_32901, 8), (_32900, 8), (_32899, 8), (_32898, 8), (_32897, 8), (_32896, 8), (_32895, 8), (_32894, 8), (_32893, 8), (_32892, 8), (_32891, 8), (_32890, 8), (_32889, 8), (_32888, 8), (_32887, 8), (_32886, 8), (_32885, 8), (_32884, 8), (_32883, 8), (_32882, 8), (_32881, 8), (_32880, 8), (_33234, 8), (_33233, 8), (_33232, 8), (_33231, 8), (_33230, 8), (_33229, 8), (_33228, 8), (_33227, 8), (_33226, 8), (_33225, 8), (_33224, 8), (_33223, 8), (_33222, 8), (_33221, 8), (_33220, 8), (_33219, 8), (_33218, 8), (_33217, 8), (_33216, 8), (_33215, 8), (_33214, 8), (_33213, 8), (_33212, 8), (_33211, 8), (_33210, 8), (_33209, 8), (_33208, 8), (_33207, 8), (_33206, 8), (_33205, 8), (_33204, 8), (_33203, 8), (_33557, 8), (_33556, 8), (_33555, 8), (_33554, 8), (_33553, 8), (_33552, 8), (_33551, 8), (_33550, 8), (_33549, 8), (_33548, 8), (_33547, 8), (_33546, 8), (_33545, 8), (_33544, 8), (_33543, 8), (_33542, 8), (_33541, 8), (_33540, 8), (_33539, 8), (_33538, 8), (_33537, 8), (_33536, 8), (_33535, 8), (_33534, 8), (_33533, 8), (_33532, 8), (_33531, 8), (_33530, 8), (_33529, 8), (_33528, 8), (_33527, 8), (_33526, 8), (_33880, 8), (_33879, 8), (_33878, 8), (_33877, 8), (_33876, 8), (_33875, 8), (_33874, 8), (_33873, 8), (_33872, 8), (_33871, 8), (_33870, 8), (_33869, 8), (_33868, 8), (_33867, 8), (_33866, 8), (_33865, 8), (_33864, 8), (_33863, 8), (_33862, 8), (_33861, 8), (_33860, 8), (_33859, 8), (_33858, 8), (_33857, 8), (_33856, 8), (_33855, 8), (_33854, 8), (_33853, 8), (_33852, 8), (_33851, 8), (_33850, 8), (_33849, 8), (_34203, 8), (_34202, 8), (_34201, 8), (_34200, 8), (_34199, 8), (_34198, 8), (_34197, 8), (_34196, 8), (_34195, 8), (_34194, 8), (_34193, 8), (_34192, 8), (_34191, 8), (_34190, 8), (_34189, 8), (_34188, 8), (_34187, 8), (_34186, 8), (_34185, 8), (_34184, 8), (_34183, 8), (_34182, 8), (_34181, 8), (_34180, 8), (_34179, 8), (_34178, 8), (_34177, 8), (_34176, 8), (_34175, 8), (_34174, 8), (_34173, 8), (_34172, 8), (_34526, 8), (_34525, 8), (_34524, 8), (_34523, 8), (_34522, 8), (_34521, 8), (_34520, 8), (_34519, 8), (_34518, 8), (_34517, 8), (_34516, 8), (_34515, 8), (_34514, 8), (_34513, 8), (_34512, 8), (_34511, 8), (_34510, 8), (_34509, 8), (_34508, 8), (_34507, 8), (_34506, 8), (_34505, 8), (_34504, 8), (_34503, 8), (_34502, 8), (_34501, 8), (_34500, 8), (_34499, 8), (_34498, 8), (_34497, 8), (_34496, 8), (_34495, 8), (_34849, 8), (_34848, 8), (_34847, 8), (_34846, 8), (_34845, 8), (_34844, 8), (_34843, 8), (_34842, 8), (_34841, 8), (_34840, 8), (_34839, 8), (_34838, 8), (_34837, 8), (_34836, 8), (_34835, 8), (_34834, 8), (_34833, 8), (_34832, 8), (_34831, 8), (_34830, 8), (_34829, 8), (_34828, 8), (_34827, 8), (_34826, 8), (_34825, 8), (_34824, 8), (_34823, 8), (_34822, 8), (_34821, 8), (_34820, 8), (_34819, 8), (_34818, 8), (_35172, 8), (_35171, 8), (_35170, 8), (_35169, 8), (_35168, 8), (_35167, 8), (_35166, 8), (_35165, 8), (_35164, 8), (_35163, 8), (_35162, 8), (_35161, 8), (_35160, 8), (_35159, 8), (_35158, 8), (_35157, 8), (_35156, 8), (_35155, 8), (_35154, 8), (_35153, 8), (_35152, 8), (_35151, 8), (_35150, 8), (_35149, 8), (_35148, 8), (_35147, 8), (_35146, 8), (_35145, 8), (_35144, 8), (_35143, 8), (_35142, 8), (_35141, 8), (_35495, 8), (_35494, 8), (_35493, 8), (_35492, 8), (_35491, 8), (_35490, 8), (_35489, 8), (_35488, 8), (_35487, 8), (_35486, 8), (_35485, 8), (_35484, 8), (_35483, 8), (_35482, 8), (_35481, 8), (_35480, 8), (_35479, 8), (_35478, 8), (_35477, 8), (_35476, 8), (_35475, 8), (_35474, 8), (_35473, 8), (_35472, 8), (_35471, 8), (_35470, 8), (_35469, 8), (_35468, 8), (_35467, 8), (_35466, 8), (_35465, 8), (_35464, 8), (_35818, 8), (_35817, 8), (_35816, 8), (_35815, 8), (_35814, 8), (_35813, 8), (_35812, 8), (_35811, 8), (_35810, 8), (_35809, 8), (_35808, 8), (_35807, 8), (_35806, 8), (_35805, 8), (_35804, 8), (_35803, 8), (_35802, 8), (_35801, 8), (_35800, 8), (_35799, 8), (_35798, 8), (_35797, 8), (_35796, 8), (_35795, 8), (_35794, 8), (_35793, 8), (_35792, 8), (_35791, 8), (_35790, 8), (_35789, 8), (_35788, 8), (_35787, 8), (_36141, 8), (_36140, 8), (_36139, 8), (_36138, 8), (_36137, 8), (_36136, 8), (_36135, 8), (_36134, 8), (_36133, 8), (_36132, 8), (_36131, 8), (_36130, 8), (_36129, 8), (_36128, 8), (_36127, 8), (_36126, 8), (_36125, 8), (_36124, 8), (_36123, 8), (_36122, 8), (_36121, 8), (_36120, 8), (_36119, 8), (_36118, 8), (_36117, 8), (_36116, 8), (_36115, 8), (_36114, 8), (_36113, 8), (_36112, 8), (_36111, 8), (_36110, 8), (_36464, 8), (_36463, 8), (_36462, 8), (_36461, 8), (_36460, 8), (_36459, 8), (_36458, 8), (_36457, 8), (_36456, 8), (_36455, 8), (_36454, 8), (_36453, 8), (_36452, 8), (_36451, 8), (_36450, 8), (_36449, 8), (_36448, 8), (_36447, 8), (_36446, 8), (_36445, 8), (_36444, 8), (_36443, 8), (_36442, 8), (_36441, 8), (_36440, 8), (_36439, 8), (_36438, 8), (_36437, 8), (_36436, 8), (_36435, 8), (_36434, 8), (_36433, 8), (_36787, 8), (_36786, 8), (_36785, 8), (_36784, 8), (_36783, 8), (_36782, 8), (_36781, 8), (_36780, 8), (_36779, 8), (_36778, 8), (_36777, 8), (_36776, 8), (_36775, 8), (_36774, 8), (_36773, 8), (_36772, 8), (_36771, 8), (_36770, 8), (_36769, 8), (_36768, 8), (_36767, 8), (_36766, 8), (_36765, 8), (_36764, 8), (_36763, 8), (_36762, 8), (_36761, 8), (_36760, 8), (_36759, 8), (_36758, 8), (_36757, 8), (_36756, 8), (_37110, 8), (_37109, 8), (_37108, 8), (_37107, 8), (_37106, 8), (_37105, 8), (_37104, 8), (_37103, 8), (_37102, 8), (_37101, 8), (_37100, 8), (_37099, 8), (_37098, 8), (_37097, 8), (_37096, 8), (_37095, 8), (_37094, 8), (_37093, 8), (_37092, 8), (_37091, 8), (_37090, 8), (_37089, 8), (_37088, 8), (_37087, 8), (_37086, 8), (_37085, 8), (_37084, 8), (_37083, 8), (_37082, 8), (_37081, 8), (_37080, 8), (_37079, 8), (_37433, 8), (_37432, 8), (_37431, 8), (_37430, 8), (_37429, 8), (_37428, 8), (_37427, 8), (_37426, 8), (_37425, 8), (_37424, 8), (_37423, 8), (_37422, 8), (_37421, 8), (_37420, 8), (_37419, 8), (_37418, 8), (_37417, 8), (_37416, 8), (_37415, 8), (_37414, 8), (_37413, 8), (_37412, 8), (_37411, 8), (_37410, 8), (_37409, 8), (_37408, 8), (_37407, 8), (_37406, 8), (_37405, 8), (_37404, 8), (_37403, 8), (_37402, 8), (_37756, 8), (_37755, 8), (_37754, 8), (_37753, 8), (_37752, 8), (_37751, 8), (_37750, 8), (_37749, 8), (_37748, 8), (_37747, 8), (_37746, 8), (_37745, 8), (_37744, 8), (_37743, 8), (_37742, 8), (_37741, 8), (_37740, 8), (_37739, 8), (_37738, 8), (_37737, 8), (_37736, 8), (_37735, 8), (_37734, 8), (_37733, 8), (_37732, 8), (_37731, 8), (_37730, 8), (_37729, 8), (_37728, 8), (_37727, 8), (_37726, 8), (_37725, 8), (_38079, 8), (_38078, 8), (_38077, 8), (_38076, 8), (_38075, 8), (_38074, 8), (_38073, 8), (_38072, 8), (_38071, 8), (_38070, 8), (_38069, 8), (_38068, 8), (_38067, 8), (_38066, 8), (_38065, 8), (_38064, 8), (_38063, 8), (_38062, 8), (_38061, 8), (_38060, 8), (_38059, 8), (_38058, 8), (_38057, 8), (_38056, 8), (_38055, 8), (_38054, 8), (_38053, 8), (_38052, 8), (_38051, 8), (_38050, 8), (_38049, 8), (_38048, 8), (_38402, 8), (_38401, 8), (_38400, 8), (_38399, 8), (_38398, 8), (_38397, 8), (_38396, 8), (_38395, 8), (_38394, 8), (_38393, 8), (_38392, 8), (_38391, 8), (_38390, 8), (_38389, 8), (_38388, 8), (_38387, 8), (_38386, 8), (_38385, 8), (_38384, 8), (_38383, 8), (_38382, 8), (_38381, 8), (_38380, 8), (_38379, 8), (_38378, 8), (_38377, 8), (_38376, 8), (_38375, 8), (_38374, 8), (_38373, 8), (_38372, 8), (_38371, 8), (_38725, 8), (_38724, 8), (_38723, 8), (_38722, 8), (_38721, 8), (_38720, 8), (_38719, 8), (_38718, 8), (_38717, 8), (_38716, 8), (_38715, 8), (_38714, 8), (_38713, 8), (_38712, 8), (_38711, 8), (_38710, 8), (_38709, 8), (_38708, 8), (_38707, 8), (_38706, 8), (_38705, 8), (_38704, 8), (_38703, 8), (_38702, 8), (_38701, 8), (_38700, 8), (_38699, 8), (_38698, 8), (_38697, 8), (_38696, 8), (_38695, 8), (_38694, 8), (_39048, 8), (_39047, 8), (_39046, 8), (_39045, 8), (_39044, 8), (_39043, 8), (_39042, 8), (_39041, 8), (_39040, 8), (_39039, 8), (_39038, 8), (_39037, 8), (_39036, 8), (_39035, 8), (_39034, 8), (_39033, 8), (_39032, 8), (_39031, 8), (_39030, 8), (_39029, 8), (_39028, 8), (_39027, 8), (_39026, 8), (_39025, 8), (_39024, 8), (_39023, 8), (_39022, 8), (_39021, 8), (_39020, 8), (_39019, 8), (_39018, 8), (_39017, 8), (_39371, 8), (_39370, 8), (_39369, 8), (_39368, 8), (_39367, 8), (_39366, 8), (_39365, 8), (_39364, 8), (_39363, 8), (_39362, 8), (_39361, 8), (_39360, 8), (_39359, 8), (_39358, 8), (_39357, 8), (_39356, 8), (_39355, 8), (_39354, 8), (_39353, 8), (_39352, 8), (_39351, 8), (_39350, 8), (_39349, 8), (_39348, 8), (_39347, 8), (_39346, 8), (_39345, 8), (_39344, 8), (_39343, 8), (_39342, 8), (_39341, 8), (_39340, 8), (_39694, 8), (_39693, 8), (_39692, 8), (_39691, 8), (_39690, 8), (_39689, 8), (_39688, 8), (_39687, 8), (_39686, 8), (_39685, 8), (_39684, 8), (_39683, 8), (_39682, 8), (_39681, 8), (_39680, 8), (_39679, 8), (_39678, 8), (_39677, 8), (_39676, 8), (_39675, 8), (_39674, 8), (_39673, 8), (_39672, 8), (_39671, 8), (_39670, 8), (_39669, 8), (_39668, 8), (_39667, 8), (_39666, 8), (_39665, 8), (_39664, 8), (_39663, 8), (_40017, 8), (_40016, 8), (_40015, 8), (_40014, 8), (_40013, 8), (_40012, 8), (_40011, 8), (_40010, 8), (_40009, 8), (_40008, 8), (_40007, 8), (_40006, 8), (_40005, 8), (_40004, 8), (_40003, 8), (_40002, 8), (_40001, 8), (_40000, 8), (_39999, 8), (_39998, 8), (_39997, 8), (_39996, 8), (_39995, 8), (_39994, 8), (_39993, 8), (_39992, 8), (_39991, 8), (_39990, 8), (_39989, 8), (_39988, 8), (_39987, 8), (_39986, 8), (_40340, 8), (_40339, 8), (_40338, 8), (_40337, 8), (_40336, 8), (_40335, 8), (_40334, 8), (_40333, 8), (_40332, 8), (_40331, 8), (_40330, 8), (_40329, 8), (_40328, 8), (_40327, 8), (_40326, 8), (_40325, 8), (_40324, 8), (_40323, 8), (_40322, 8), (_40321, 8), (_40320, 8), (_40319, 8), (_40318, 8), (_40317, 8), (_40316, 8), (_40315, 8), (_40314, 8), (_40313, 8), (_40312, 8), (_40311, 8), (_40310, 8), (_40309, 8), (_40663, 8), (_40662, 8), (_40661, 8), (_40660, 8), (_40659, 8), (_40658, 8), (_40657, 8), (_40656, 8), (_40655, 8), (_40654, 8), (_40653, 8), (_40652, 8), (_40651, 8), (_40650, 8), (_40649, 8), (_40648, 8), (_40647, 8), (_40646, 8), (_40645, 8), (_40644, 8), (_40643, 8), (_40642, 8), (_40641, 8), (_40640, 8), (_40639, 8), (_40638, 8), (_40637, 8), (_40636, 8), (_40635, 8), (_40634, 8), (_40633, 8), (_40632, 8), (_40986, 8), (_40985, 8), (_40984, 8), (_40983, 8), (_40982, 8), (_40981, 8), (_40980, 8), (_40979, 8), (_40978, 8), (_40977, 8), (_40976, 8), (_40975, 8), (_40974, 8), (_40973, 8), (_40972, 8), (_40971, 8), (_40970, 8), (_40969, 8), (_40968, 8), (_40967, 8), (_40966, 8), (_40965, 8), (_40964, 8), (_40963, 8), (_40962, 8), (_40961, 8), (_40960, 8), (_40959, 8), (_40958, 8), (_40957, 8), (_40956, 8), (_40955, 8), (_41309, 8), (_41308, 8), (_41307, 8), (_41306, 8), (_41305, 8), (_41304, 8), (_41303, 8), (_41302, 8), (_41301, 8), (_41300, 8), (_41299, 8), (_41298, 8), (_41297, 8), (_41296, 8), (_41295, 8), (_41294, 8), (_41293, 8), (_41292, 8), (_41291, 8), (_41290, 8), (_41289, 8), (_41288, 8), (_41287, 8), (_41286, 8), (_41285, 8), (_41284, 8), (_41283, 8), (_41282, 8), (_41281, 8), (_41280, 8), (_41279, 8), (_41278, 8), (_41632, 8), (_41631, 8), (_41630, 8), (_41629, 8), (_41628, 8), (_41627, 8), (_41626, 8), (_41625, 8), (_41624, 8), (_41623, 8), (_41622, 8), (_41621, 8), (_41620, 8), (_41619, 8), (_41618, 8), (_41617, 8), (_41616, 8), (_41615, 8), (_41614, 8), (_41613, 8), (_41612, 8), (_41611, 8), (_41610, 8), (_41609, 8), (_41608, 8), (_41607, 8), (_41606, 8), (_41605, 8), (_41604, 8), (_41603, 8), (_41602, 8), (_41601, 8), (_41955, 8), (_41954, 8), (_41953, 8), (_41952, 8), (_41951, 8), (_41950, 8), (_41949, 8), (_41948, 8), (_41947, 8), (_41946, 8), (_41945, 8), (_41944, 8), (_41943, 8), (_41942, 8), (_41941, 8), (_41940, 8), (_41939, 8), (_41938, 8), (_41937, 8), (_41936, 8), (_41935, 8), (_41934, 8), (_41933, 8), (_41932, 8), (_41931, 8), (_41930, 8), (_41929, 8), (_41928, 8), (_41927, 8), (_41926, 8), (_41925, 8), (_41924, 8), (_42278, 8), (_42277, 8), (_42276, 8), (_42275, 8), (_42274, 8), (_42273, 8), (_42272, 8), (_42271, 8), (_42270, 8), (_42269, 8), (_42268, 8), (_42267, 8), (_42266, 8), (_42265, 8), (_42264, 8), (_42263, 8), (_42262, 8), (_42261, 8), (_42260, 8), (_42259, 8), (_42258, 8), (_42257, 8), (_42256, 8), (_42255, 8), (_42254, 8), (_42253, 8), (_42252, 8), (_42251, 8), (_42250, 8), (_42249, 8), (_42248, 8), (_42247, 8), (_42601, 8), (_42600, 8), (_42599, 8), (_42598, 8), (_42597, 8), (_42596, 8), (_42595, 8), (_42594, 8), (_42593, 8), (_42592, 8), (_42591, 8), (_42590, 8), (_42589, 8), (_42588, 8), (_42587, 8), (_42586, 8), (_42585, 8), (_42584, 8), (_42583, 8), (_42582, 8), (_42581, 8), (_42580, 8), (_42579, 8), (_42578, 8), (_42577, 8), (_42576, 8), (_42575, 8), (_42574, 8), (_42573, 8), (_42572, 8), (_42571, 8), (_42570, 8), (_42924, 8), (_42923, 8), (_42922, 8), (_42921, 8), (_42920, 8), (_42919, 8), (_42918, 8), (_42917, 8), (_42916, 8), (_42915, 8), (_42914, 8), (_42913, 8), (_42912, 8), (_42911, 8), (_42910, 8), (_42909, 8), (_42908, 8), (_42907, 8), (_42906, 8), (_42905, 8), (_42904, 8), (_42903, 8), (_42902, 8), (_42901, 8), (_42900, 8), (_42899, 8), (_42898, 8), (_42897, 8), (_42896, 8), (_42895, 8), (_42894, 8), (_42893, 8), (_43247, 8), (_43246, 8), (_43245, 8), (_43244, 8), (_43243, 8), (_43242, 8), (_43241, 8), (_43240, 8), (_43239, 8), (_43238, 8), (_43237, 8), (_43236, 8), (_43235, 8), (_43234, 8), (_43233, 8), (_43232, 8), (_43231, 8), (_43230, 8), (_43229, 8), (_43228, 8), (_43227, 8), (_43226, 8), (_43225, 8), (_43224, 8), (_43223, 8), (_43222, 8), (_43221, 8), (_43220, 8), (_43219, 8), (_43218, 8), (_43217, 8), (_43216, 8), (_43570, 8), (_43569, 8), (_43568, 8), (_43567, 8), (_43566, 8), (_43565, 8), (_43564, 8), (_43563, 8), (_43562, 8), (_43561, 8), (_43560, 8), (_43559, 8), (_43558, 8), (_43557, 8), (_43556, 8), (_43555, 8), (_43554, 8), (_43553, 8), (_43552, 8), (_43551, 8), (_43550, 8), (_43549, 8), (_43548, 8), (_43547, 8), (_43546, 8), (_43545, 8), (_43544, 8), (_43543, 8), (_43542, 8), (_43541, 8), (_43540, 8), (_43539, 8), (_43893, 8), (_43892, 8), (_43891, 8), (_43890, 8), (_43889, 8), (_43888, 8), (_43887, 8), (_43886, 8), (_43885, 8), (_43884, 8), (_43883, 8), (_43882, 8), (_43881, 8), (_43880, 8), (_43879, 8), (_43878, 8), (_43877, 8), (_43876, 8), (_43875, 8), (_43874, 8), (_43873, 8), (_43872, 8), (_43871, 8), (_43870, 8), (_43869, 8), (_43868, 8), (_43867, 8), (_43866, 8), (_43865, 8), (_43864, 8), (_43863, 8), (_43862, 8), (_44216, 8), (_44215, 8), (_44214, 8), (_44213, 8), (_44212, 8), (_44211, 8), (_44210, 8), (_44209, 8), (_44208, 8), (_44207, 8), (_44206, 8), (_44205, 8), (_44204, 8), (_44203, 8), (_44202, 8), (_44201, 8), (_44200, 8), (_44199, 8), (_44198, 8), (_44197, 8), (_44196, 8), (_44195, 8), (_44194, 8), (_44193, 8), (_44192, 8), (_44191, 8), (_44190, 8), (_44189, 8), (_44188, 8), (_44187, 8), (_44186, 8), (_44185, 8), (_44539, 8), (_44538, 8), (_44537, 8), (_44536, 8), (_44535, 8), (_44534, 8), (_44533, 8), (_44532, 8), (_44531, 8), (_44530, 8), (_44529, 8), (_44528, 8), (_44527, 8), (_44526, 8), (_44525, 8), (_44524, 8), (_44523, 8), (_44522, 8), (_44521, 8), (_44520, 8), (_44519, 8), (_44518, 8), (_44517, 8), (_44516, 8), (_44515, 8), (_44514, 8), (_44513, 8), (_44512, 8), (_44511, 8), (_44510, 8), (_44509, 8), (_44508, 8), (_44862, 8), (_44861, 8), (_44860, 8), (_44859, 8), (_44858, 8), (_44857, 8), (_44856, 8), (_44855, 8), (_44854, 8), (_44853, 8), (_44852, 8), (_44851, 8), (_44850, 8), (_44849, 8), (_44848, 8), (_44847, 8), (_44846, 8), (_44845, 8), (_44844, 8), (_44843, 8), (_44842, 8), (_44841, 8), (_44840, 8), (_44839, 8), (_44838, 8), (_44837, 8), (_44836, 8), (_44835, 8), (_44834, 8), (_44833, 8), (_44832, 8), (_44831, 8), (_45185, 8), (_45184, 8), (_45183, 8), (_45182, 8), (_45181, 8), (_45180, 8), (_45179, 8), (_45178, 8), (_45177, 8), (_45176, 8), (_45175, 8), (_45174, 8), (_45173, 8), (_45172, 8), (_45171, 8), (_45170, 8), (_45169, 8), (_45168, 8), (_45167, 8), (_45166, 8), (_45165, 8), (_45164, 8), (_45163, 8), (_45162, 8), (_45161, 8), (_45160, 8), (_45159, 8), (_45158, 8), (_45157, 8), (_45156, 8), (_45155, 8), (_45154, 8), (_45508, 8), (_45507, 8), (_45506, 8), (_45505, 8), (_45504, 8), (_45503, 8), (_45502, 8), (_45501, 8), (_45500, 8), (_45499, 8), (_45498, 8), (_45497, 8), (_45496, 8), (_45495, 8), (_45494, 8), (_45493, 8), (_45492, 8), (_45491, 8), (_45490, 8), (_45489, 8), (_45488, 8), (_45487, 8), (_45486, 8), (_45485, 8), (_45484, 8), (_45483, 8), (_45482, 8), (_45481, 8), (_45480, 8), (_45479, 8), (_45478, 8), (_45477, 8), (_45831, 8), (_45830, 8), (_45829, 8), (_45828, 8), (_45827, 8), (_45826, 8), (_45825, 8), (_45824, 8), (_45823, 8), (_45822, 8), (_45821, 8), (_45820, 8), (_45819, 8), (_45818, 8), (_45817, 8), (_45816, 8), (_45815, 8), (_45814, 8), (_45813, 8), (_45812, 8), (_45811, 8), (_45810, 8), (_45809, 8), (_45808, 8), (_45807, 8), (_45806, 8), (_45805, 8), (_45804, 8), (_45803, 8), (_45802, 8), (_45801, 8), (_45800, 8), (_46154, 8), (_46153, 8), (_46152, 8), (_46151, 8), (_46150, 8), (_46149, 8), (_46148, 8), (_46147, 8), (_46146, 8), (_46145, 8), (_46144, 8), (_46143, 8), (_46142, 8), (_46141, 8), (_46140, 8), (_46139, 8), (_46138, 8), (_46137, 8), (_46136, 8), (_46135, 8), (_46134, 8), (_46133, 8), (_46132, 8), (_46131, 8), (_46130, 8), (_46129, 8), (_46128, 8), (_46127, 8), (_46126, 8), (_46125, 8), (_46124, 8), (_46123, 8), (_46477, 8), (_46476, 8), (_46475, 8), (_46474, 8), (_46473, 8), (_46472, 8), (_46471, 8), (_46470, 8), (_46469, 8), (_46468, 8), (_46467, 8), (_46466, 8), (_46465, 8), (_46464, 8), (_46463, 8), (_46462, 8), (_46461, 8), (_46460, 8), (_46459, 8), (_46458, 8), (_46457, 8), (_46456, 8), (_46455, 8), (_46454, 8), (_46453, 8), (_46452, 8), (_46451, 8), (_46450, 8), (_46449, 8), (_46448, 8), (_46447, 8), (_46446, 8), (_46800, 8), (_46799, 8), (_46798, 8), (_46797, 8), (_46796, 8), (_46795, 8), (_46794, 8), (_46793, 8), (_46792, 8), (_46791, 8), (_46790, 8), (_46789, 8), (_46788, 8), (_46787, 8), (_46786, 8), (_46785, 8), (_46784, 8), (_46783, 8), (_46782, 8), (_46781, 8), (_46780, 8), (_46779, 8), (_46778, 8), (_46777, 8), (_46776, 8), (_46775, 8), (_46774, 8), (_46773, 8), (_46772, 8), (_46771, 8), (_46770, 8), (_46769, 8), (_47123, 8), (_47122, 8), (_47121, 8), (_47120, 8), (_47119, 8), (_47118, 8), (_47117, 8), (_47116, 8), (_47115, 8), (_47114, 8), (_47113, 8), (_47112, 8), (_47111, 8), (_47110, 8), (_47109, 8), (_47108, 8), (_47107, 8), (_47106, 8), (_47105, 8), (_47104, 8), (_47103, 8), (_47102, 8), (_47101, 8), (_47100, 8), (_47099, 8), (_47098, 8), (_47097, 8), (_47096, 8), (_47095, 8), (_47094, 8), (_47093, 8), (_47092, 8), (_47446, 8), (_47445, 8), (_47444, 8), (_47443, 8), (_47442, 8), (_47441, 8), (_47440, 8), (_47439, 8), (_47438, 8), (_47437, 8), (_47436, 8), (_47435, 8), (_47434, 8), (_47433, 8), (_47432, 8), (_47431, 8), (_47430, 8), (_47429, 8), (_47428, 8), (_47427, 8), (_47426, 8), (_47425, 8), (_47424, 8), (_47423, 8), (_47422, 8), (_47421, 8), (_47420, 8), (_47419, 8), (_47418, 8), (_47417, 8), (_47416, 8), (_47415, 8), (_47769, 8), (_47768, 8), (_47767, 8), (_47766, 8), (_47765, 8), (_47764, 8), (_47763, 8), (_47762, 8), (_47761, 8), (_47760, 8), (_47759, 8), (_47758, 8), (_47757, 8), (_47756, 8), (_47755, 8), (_47754, 8), (_47753, 8), (_47752, 8), (_47751, 8), (_47750, 8), (_47749, 8), (_47748, 8), (_47747, 8), (_47746, 8), (_47745, 8), (_47744, 8), (_47743, 8), (_47742, 8), (_47741, 8), (_47740, 8), (_47739, 8), (_47738, 8), (_48092, 8), (_48091, 8), (_48090, 8), (_48089, 8), (_48088, 8), (_48087, 8), (_48086, 8), (_48085, 8), (_48084, 8), (_48083, 8), (_48082, 8), (_48081, 8), (_48080, 8), (_48079, 8), (_48078, 8), (_48077, 8), (_48076, 8), (_48075, 8), (_48074, 8), (_48073, 8), (_48072, 8), (_48071, 8), (_48070, 8), (_48069, 8), (_48068, 8), (_48067, 8), (_48066, 8), (_48065, 8), (_48064, 8), (_48063, 8), (_48062, 8), (_48061, 8), (_48415, 8), (_48414, 8), (_48413, 8), (_48412, 8), (_48411, 8), (_48410, 8), (_48409, 8), (_48408, 8), (_48407, 8), (_48406, 8), (_48405, 8), (_48404, 8), (_48403, 8), (_48402, 8), (_48401, 8), (_48400, 8), (_48399, 8), (_48398, 8), (_48397, 8), (_48396, 8), (_48395, 8), (_48394, 8), (_48393, 8), (_48392, 8), (_48391, 8), (_48390, 8), (_48389, 8), (_48388, 8), (_48387, 8), (_48386, 8), (_48385, 8), (_48384, 8), (_48738, 8), (_48737, 8), (_48736, 8), (_48735, 8), (_48734, 8), (_48733, 8), (_48732, 8), (_48731, 8), (_48730, 8), (_48729, 8), (_48728, 8), (_48727, 8), (_48726, 8), (_48725, 8), (_48724, 8), (_48723, 8), (_48722, 8), (_48721, 8), (_48720, 8), (_48719, 8), (_48718, 8), (_48717, 8), (_48716, 8), (_48715, 8), (_48714, 8), (_48713, 8), (_48712, 8), (_48711, 8), (_48710, 8), (_48709, 8), (_48708, 8), (_48707, 8), (_49061, 8), (_49060, 8), (_49059, 8), (_49058, 8), (_49057, 8), (_49056, 8), (_49055, 8), (_49054, 8), (_49053, 8), (_49052, 8), (_49051, 8), (_49050, 8), (_49049, 8), (_49048, 8), (_49047, 8), (_49046, 8), (_49045, 8), (_49044, 8), (_49043, 8), (_49042, 8), (_49041, 8), (_49040, 8), (_49039, 8), (_49038, 8), (_49037, 8), (_49036, 8), (_49035, 8), (_49034, 8), (_49033, 8), (_49032, 8), (_49031, 8), (_49030, 8), (_49384, 8), (_49383, 8), (_49382, 8), (_49381, 8), (_49380, 8), (_49379, 8), (_49378, 8), (_49377, 8), (_49376, 8), (_49375, 8), (_49374, 8), (_49373, 8), (_49372, 8), (_49371, 8), (_49370, 8), (_49369, 8), (_49368, 8), (_49367, 8), (_49366, 8), (_49365, 8), (_49364, 8), (_49363, 8), (_49362, 8), (_49361, 8), (_49360, 8), (_49359, 8), (_49358, 8), (_49357, 8), (_49356, 8), (_49355, 8), (_49354, 8), (_49353, 8), (_49707, 8), (_49706, 8), (_49705, 8), (_49704, 8), (_49703, 8), (_49702, 8), (_49701, 8), (_49700, 8), (_49699, 8), (_49698, 8), (_49697, 8), (_49696, 8), (_49695, 8), (_49694, 8), (_49693, 8), (_49692, 8), (_49691, 8), (_49690, 8), (_49689, 8), (_49688, 8), (_49687, 8), (_49686, 8), (_49685, 8), (_49684, 8), (_49683, 8), (_49682, 8), (_49681, 8), (_49680, 8), (_49679, 8), (_49678, 8), (_49677, 8), (_49676, 8), (_50030, 8), (_50029, 8), (_50028, 8), (_50027, 8), (_50026, 8), (_50025, 8), (_50024, 8), (_50023, 8), (_50022, 8), (_50021, 8), (_50020, 8), (_50019, 8), (_50018, 8), (_50017, 8), (_50016, 8), (_50015, 8), (_50014, 8), (_50013, 8), (_50012, 8), (_50011, 8), (_50010, 8), (_50009, 8), (_50008, 8), (_50007, 8), (_50006, 8), (_50005, 8), (_50004, 8), (_50003, 8), (_50002, 8), (_50001, 8), (_50000, 8), (_49999, 8), (_50353, 8), (_50352, 8), (_50351, 8), (_50350, 8), (_50349, 8), (_50348, 8), (_50347, 8), (_50346, 8), (_50345, 8), (_50344, 8), (_50343, 8), (_50342, 8), (_50341, 8), (_50340, 8), (_50339, 8), (_50338, 8), (_50337, 8), (_50336, 8), (_50335, 8), (_50334, 8), (_50333, 8), (_50332, 8), (_50331, 8), (_50330, 8), (_50329, 8), (_50328, 8), (_50327, 8), (_50326, 8), (_50325, 8), (_50324, 8), (_50323, 8), (_50322, 8), (_50676, 8), (_50675, 8), (_50674, 8), (_50673, 8), (_50672, 8), (_50671, 8), (_50670, 8), (_50669, 8), (_50668, 8), (_50667, 8), (_50666, 8), (_50665, 8), (_50664, 8), (_50663, 8), (_50662, 8), (_50661, 8), (_50660, 8), (_50659, 8), (_50658, 8), (_50657, 8), (_50656, 8), (_50655, 8), (_50654, 8), (_50653, 8), (_50652, 8), (_50651, 8), (_50650, 8), (_50649, 8), (_50648, 8), (_50647, 8), (_50646, 8), (_50645, 8), (_50999, 8), (_50998, 8), (_50997, 8), (_50996, 8), (_50995, 8), (_50994, 8), (_50993, 8), (_50992, 8), (_50991, 8), (_50990, 8), (_50989, 8), (_50988, 8), (_50987, 8), (_50986, 8), (_50985, 8), (_50984, 8), (_50983, 8), (_50982, 8), (_50981, 8), (_50980, 8), (_50979, 8), (_50978, 8), (_50977, 8), (_50976, 8), (_50975, 8), (_50974, 8), (_50973, 8), (_50972, 8), (_50971, 8), (_50970, 8), (_50969, 8), (_50968, 8), (_51322, 8), (_51321, 8), (_51320, 8), (_51319, 8), (_51318, 8), (_51317, 8), (_51316, 8), (_51315, 8), (_51314, 8), (_51313, 8), (_51312, 8), (_51311, 8), (_51310, 8), (_51309, 8), (_51308, 8), (_51307, 8), (_51306, 8), (_51305, 8), (_51304, 8), (_51303, 8), (_51302, 8), (_51301, 8), (_51300, 8), (_51299, 8), (_51298, 8), (_51297, 8), (_51296, 8), (_51295, 8), (_51294, 8), (_51293, 8), (_51292, 8), (_51291, 8), (_51645, 8), (_51644, 8), (_51643, 8), (_51642, 8), (_51641, 8), (_51640, 8), (_51639, 8), (_51638, 8), (_51637, 8), (_51636, 8), (_51635, 8), (_51634, 8), (_51633, 8), (_51632, 8), (_51631, 8), (_51630, 8), (_51629, 8), (_51628, 8), (_51627, 8), (_51626, 8), (_51625, 8), (_51624, 8), (_51623, 8), (_51622, 8), (_51621, 8), (_51620, 8), (_51619, 8), (_51618, 8), (_51617, 8), (_51616, 8), (_51615, 8), (_51614, 8), (_51968, 8), (_51967, 8), (_51966, 8), (_51965, 8), (_51964, 8), (_51963, 8), (_51962, 8), (_51961, 8), (_51960, 8), (_51959, 8), (_51958, 8), (_51957, 8), (_51956, 8), (_51955, 8), (_51954, 8), (_51953, 8), (_51952, 8), (_51951, 8), (_51950, 8), (_51949, 8), (_51948, 8), (_51947, 8), (_51946, 8), (_51945, 8), (_51944, 8), (_51943, 8), (_51942, 8), (_51941, 8), (_51940, 8), (_51939, 8), (_51938, 8), (_51937, 8), (_52291, 8), (_52290, 8), (_52289, 8), (_52288, 8), (_52287, 8), (_52286, 8), (_52285, 8), (_52284, 8), (_52283, 8), (_52282, 8), (_52281, 8), (_52280, 8), (_52279, 8), (_52278, 8), (_52277, 8), (_52276, 8), (_52275, 8), (_52274, 8), (_52273, 8), (_52272, 8), (_52271, 8), (_52270, 8), (_52269, 8), (_52268, 8), (_52267, 8), (_52266, 8), (_52265, 8), (_52264, 8), (_52263, 8), (_52262, 8), (_52261, 8), (_52260, 8), (_52614, 8), (_52613, 8), (_52612, 8), (_52611, 8), (_52610, 8), (_52609, 8), (_52608, 8), (_52607, 8), (_52606, 8), (_52605, 8), (_52604, 8), (_52603, 8), (_52602, 8), (_52601, 8), (_52600, 8), (_52599, 8), (_52598, 8), (_52597, 8), (_52596, 8), (_52595, 8), (_52594, 8), (_52593, 8), (_52592, 8), (_52591, 8), (_52590, 8), (_52589, 8), (_52588, 8), (_52587, 8), (_52586, 8), (_52585, 8), (_52584, 8), (_52583, 8), (_52937, 8), (_52936, 8), (_52935, 8), (_52934, 8), (_52933, 8), (_52932, 8), (_52931, 8), (_52930, 8), (_52929, 8), (_52928, 8), (_52927, 8), (_52926, 8), (_52925, 8), (_52924, 8), (_52923, 8), (_52922, 8), (_52921, 8), (_52920, 8), (_52919, 8), (_52918, 8), (_52917, 8), (_52916, 8), (_52915, 8), (_52914, 8), (_52913, 8), (_52912, 8), (_52911, 8), (_52910, 8), (_52909, 8), (_52908, 8), (_52907, 8), (_52906, 8), (_53260, 8), (_53259, 8), (_53258, 8), (_53257, 8), (_53256, 8), (_53255, 8), (_53254, 8), (_53253, 8), (_53252, 8), (_53251, 8), (_53250, 8), (_53249, 8), (_53248, 8), (_53247, 8), (_53246, 8), (_53245, 8), (_53244, 8), (_53243, 8), (_53242, 8), (_53241, 8), (_53240, 8), (_53239, 8), (_53238, 8), (_53237, 8), (_53236, 8), (_53235, 8), (_53234, 8), (_53233, 8), (_53232, 8), (_53231, 8), (_53230, 8), (_53229, 8), (_53583, 8), (_53582, 8), (_53581, 8), (_53580, 8), (_53579, 8), (_53578, 8), (_53577, 8), (_53576, 8), (_53575, 8), (_53574, 8), (_53573, 8), (_53572, 8), (_53571, 8), (_53570, 8), (_53569, 8), (_53568, 8), (_53567, 8), (_53566, 8), (_53565, 8), (_53564, 8), (_53563, 8), (_53562, 8), (_53561, 8), (_53560, 8), (_53559, 8), (_53558, 8), (_53557, 8), (_53556, 8), (_53555, 8), (_53554, 8), (_53553, 8), (_53552, 8), (_53906, 8), (_53905, 8), (_53904, 8), (_53903, 8), (_53902, 8), (_53901, 8), (_53900, 8), (_53899, 8), (_53898, 8), (_53897, 8), (_53896, 8), (_53895, 8), (_53894, 8), (_53893, 8), (_53892, 8), (_53891, 8), (_53890, 8), (_53889, 8), (_53888, 8), (_53887, 8), (_53886, 8), (_53885, 8), (_53884, 8), (_53883, 8), (_53882, 8), (_53881, 8), (_53880, 8), (_53879, 8), (_53878, 8), (_53877, 8), (_53876, 8), (_53875, 8), (_54229, 8), (_54228, 8), (_54227, 8), (_54226, 8), (_54225, 8), (_54224, 8), (_54223, 8), (_54222, 8), (_54221, 8), (_54220, 8), (_54219, 8), (_54218, 8), (_54217, 8), (_54216, 8), (_54215, 8), (_54214, 8), (_54213, 8), (_54212, 8), (_54211, 8), (_54210, 8), (_54209, 8), (_54208, 8), (_54207, 8), (_54206, 8), (_54205, 8), (_54204, 8), (_54203, 8), (_54202, 8), (_54201, 8), (_54200, 8), (_54199, 8), (_54198, 8), (_54552, 8), (_54551, 8), (_54550, 8), (_54549, 8), (_54548, 8), (_54547, 8), (_54546, 8), (_54545, 8), (_54544, 8), (_54543, 8), (_54542, 8), (_54541, 8), (_54540, 8), (_54539, 8), (_54538, 8), (_54537, 8), (_54536, 8), (_54535, 8), (_54534, 8), (_54533, 8), (_54532, 8), (_54531, 8), (_54530, 8), (_54529, 8), (_54528, 8), (_54527, 8), (_54526, 8), (_54525, 8), (_54524, 8), (_54523, 8), (_54522, 8), (_54521, 8), (_54875, 8), (_54874, 8), (_54873, 8), (_54872, 8), (_54871, 8), (_54870, 8), (_54869, 8), (_54868, 8), (_54867, 8), (_54866, 8), (_54865, 8), (_54864, 8), (_54863, 8), (_54862, 8), (_54861, 8), (_54860, 8), (_54859, 8), (_54858, 8), (_54857, 8), (_54856, 8), (_54855, 8), (_54854, 8), (_54853, 8), (_54852, 8), (_54851, 8), (_54850, 8), (_54849, 8), (_54848, 8), (_54847, 8), (_54846, 8), (_54845, 8), (_54844, 8), (_55198, 8), (_55197, 8), (_55196, 8), (_55195, 8), (_55194, 8), (_55193, 8), (_55192, 8), (_55191, 8), (_55190, 8), (_55189, 8), (_55188, 8), (_55187, 8), (_55186, 8), (_55185, 8), (_55184, 8), (_55183, 8), (_55182, 8), (_55181, 8), (_55180, 8), (_55179, 8), (_55178, 8), (_55177, 8), (_55176, 8), (_55175, 8), (_55174, 8), (_55173, 8), (_55172, 8), (_55171, 8), (_55170, 8), (_55169, 8), (_55168, 8), (_55167, 8), (_55521, 8), (_55520, 8), (_55519, 8), (_55518, 8), (_55517, 8), (_55516, 8), (_55515, 8), (_55514, 8), (_55513, 8), (_55512, 8), (_55511, 8), (_55510, 8), (_55509, 8), (_55508, 8), (_55507, 8), (_55506, 8), (_55505, 8), (_55504, 8), (_55503, 8), (_55502, 8), (_55501, 8), (_55500, 8), (_55499, 8), (_55498, 8), (_55497, 8), (_55496, 8), (_55495, 8), (_55494, 8), (_55493, 8), (_55492, 8), (_55491, 8), (_55490, 8), (_55844, 8), (_55843, 8), (_55842, 8), (_55841, 8), (_55840, 8), (_55839, 8), (_55838, 8), (_55837, 8), (_55836, 8), (_55835, 8), (_55834, 8), (_55833, 8), (_55832, 8), (_55831, 8), (_55830, 8), (_55829, 8), (_55828, 8), (_55827, 8), (_55826, 8), (_55825, 8), (_55824, 8), (_55823, 8), (_55822, 8), (_55821, 8), (_55820, 8), (_55819, 8), (_55818, 8), (_55817, 8), (_55816, 8), (_55815, 8), (_55814, 8), (_55813, 8), (_56167, 8), (_56166, 8), (_56165, 8), (_56164, 8), (_56163, 8), (_56162, 8), (_56161, 8), (_56160, 8), (_56159, 8), (_56158, 8), (_56157, 8), (_56156, 8), (_56155, 8), (_56154, 8), (_56153, 8), (_56152, 8), (_56151, 8), (_56150, 8), (_56149, 8), (_56148, 8), (_56147, 8), (_56146, 8), (_56145, 8), (_56144, 8), (_56143, 8), (_56142, 8), (_56141, 8), (_56140, 8), (_56139, 8), (_56138, 8), (_56137, 8), (_56136, 8), (_56490, 8), (_56489, 8), (_56488, 8), (_56487, 8), (_56486, 8), (_56485, 8), (_56484, 8), (_56483, 8), (_56482, 8), (_56481, 8), (_56480, 8), (_56479, 8), (_56478, 8), (_56477, 8), (_56476, 8), (_56475, 8), (_56474, 8), (_56473, 8), (_56472, 8), (_56471, 8), (_56470, 8), (_56469, 8), (_56468, 8), (_56467, 8), (_56466, 8), (_56465, 8), (_56464, 8), (_56463, 8), (_56462, 8), (_56461, 8), (_56460, 8), (_56459, 8), (_56813, 8), (_56812, 8), (_56811, 8), (_56810, 8), (_56809, 8), (_56808, 8), (_56807, 8), (_56806, 8), (_56805, 8), (_56804, 8), (_56803, 8), (_56802, 8), (_56801, 8), (_56800, 8), (_56799, 8), (_56798, 8), (_56797, 8), (_56796, 8), (_56795, 8), (_56794, 8), (_56793, 8), (_56792, 8), (_56791, 8), (_56790, 8), (_56789, 8), (_56788, 8), (_56787, 8), (_56786, 8), (_56785, 8), (_56784, 8), (_56783, 8), (_56782, 8), (_57136, 8), (_57135, 8), (_57134, 8), (_57133, 8), (_57132, 8), (_57131, 8), (_57130, 8), (_57129, 8), (_57128, 8), (_57127, 8), (_57126, 8), (_57125, 8), (_57124, 8), (_57123, 8), (_57122, 8), (_57121, 8), (_57120, 8), (_57119, 8), (_57118, 8), (_57117, 8), (_57116, 8), (_57115, 8), (_57114, 8), (_57113, 8), (_57112, 8), (_57111, 8), (_57110, 8), (_57109, 8), (_57108, 8), (_57107, 8), (_57106, 8), (_57105, 8), (_57459, 8), (_57458, 8), (_57457, 8), (_57456, 8), (_57455, 8), (_57454, 8), (_57453, 8), (_57452, 8), (_57451, 8), (_57450, 8), (_57449, 8), (_57448, 8), (_57447, 8), (_57446, 8), (_57445, 8), (_57444, 8), (_57443, 8), (_57442, 8), (_57441, 8), (_57440, 8), (_57439, 8), (_57438, 8), (_57437, 8), (_57436, 8), (_57435, 8), (_57434, 8), (_57433, 8), (_57432, 8), (_57431, 8), (_57430, 8), (_57429, 8), (_57428, 8), (_57782, 8), (_57781, 8), (_57780, 8), (_57779, 8), (_57778, 8), (_57777, 8), (_57776, 8), (_57775, 8), (_57774, 8), (_57773, 8), (_57772, 8), (_57771, 8), (_57770, 8), (_57769, 8), (_57768, 8), (_57767, 8), (_57766, 8), (_57765, 8), (_57764, 8), (_57763, 8), (_57762, 8), (_57761, 8), (_57760, 8), (_57759, 8), (_57758, 8), (_57757, 8), (_57756, 8), (_57755, 8), (_57754, 8), (_57753, 8), (_57752, 8), (_57751, 8), (_58105, 8), (_58104, 8), (_58103, 8), (_58102, 8), (_58101, 8), (_58100, 8), (_58099, 8), (_58098, 8), (_58097, 8), (_58096, 8), (_58095, 8), (_58094, 8), (_58093, 8), (_58092, 8), (_58091, 8), (_58090, 8), (_58089, 8), (_58088, 8), (_58087, 8), (_58086, 8), (_58085, 8), (_58084, 8), (_58083, 8), (_58082, 8), (_58081, 8), (_58080, 8), (_58079, 8), (_58078, 8), (_58077, 8), (_58076, 8), (_58075, 8), (_58074, 8), (_58428, 8), (_58427, 8), (_58426, 8), (_58425, 8), (_58424, 8), (_58423, 8), (_58422, 8), (_58421, 8), (_58420, 8), (_58419, 8), (_58418, 8), (_58417, 8), (_58416, 8), (_58415, 8), (_58414, 8), (_58413, 8), (_58412, 8), (_58411, 8), (_58410, 8), (_58409, 8), (_58408, 8), (_58407, 8), (_58406, 8), (_58405, 8), (_58404, 8), (_58403, 8), (_58402, 8), (_58401, 8), (_58400, 8), (_58399, 8), (_58398, 8), (_58397, 8), (_58751, 8), (_58750, 8), (_58749, 8), (_58748, 8), (_58747, 8), (_58746, 8), (_58745, 8), (_58744, 8), (_58743, 8), (_58742, 8), (_58741, 8), (_58740, 8), (_58739, 8), (_58738, 8), (_58737, 8), (_58736, 8), (_58735, 8), (_58734, 8), (_58733, 8), (_58732, 8), (_58731, 8), (_58730, 8), (_58729, 8), (_58728, 8), (_58727, 8), (_58726, 8), (_58725, 8), (_58724, 8), (_58723, 8), (_58722, 8), (_58721, 8), (_58720, 8), (_59074, 8), (_59073, 8), (_59072, 8), (_59071, 8), (_59070, 8), (_59069, 8), (_59068, 8), (_59067, 8), (_59066, 8), (_59065, 8), (_59064, 8), (_59063, 8), (_59062, 8), (_59061, 8), (_59060, 8), (_59059, 8), (_59058, 8), (_59057, 8), (_59056, 8), (_59055, 8), (_59054, 8), (_59053, 8), (_59052, 8), (_59051, 8), (_59050, 8), (_59049, 8), (_59048, 8), (_59047, 8), (_59046, 8), (_59045, 8), (_59044, 8), (_59043, 8), (_59397, 8), (_59396, 8), (_59395, 8), (_59394, 8), (_59393, 8), (_59392, 8), (_59391, 8), (_59390, 8), (_59389, 8), (_59388, 8), (_59387, 8), (_59386, 8), (_59385, 8), (_59384, 8), (_59383, 8), (_59382, 8), (_59381, 8), (_59380, 8), (_59379, 8), (_59378, 8), (_59377, 8), (_59376, 8), (_59375, 8), (_59374, 8), (_59373, 8), (_59372, 8), (_59371, 8), (_59370, 8), (_59369, 8), (_59368, 8), (_59367, 8), (_59366, 8), (_59720, 8), (_59719, 8), (_59718, 8), (_59717, 8), (_59716, 8), (_59715, 8), (_59714, 8), (_59713, 8), (_59712, 8), (_59711, 8), (_59710, 8), (_59709, 8), (_59708, 8), (_59707, 8), (_59706, 8), (_59705, 8), (_59704, 8), (_59703, 8), (_59702, 8), (_59701, 8), (_59700, 8), (_59699, 8), (_59698, 8), (_59697, 8), (_59696, 8), (_59695, 8), (_59694, 8), (_59693, 8), (_59692, 8), (_59691, 8), (_59690, 8), (_59689, 8), (_60043, 8), (_60042, 8), (_60041, 8), (_60040, 8), (_60039, 8), (_60038, 8), (_60037, 8), (_60036, 8), (_60035, 8), (_60034, 8), (_60033, 8), (_60032, 8), (_60031, 8), (_60030, 8), (_60029, 8), (_60028, 8), (_60027, 8), (_60026, 8), (_60025, 8), (_60024, 8), (_60023, 8), (_60022, 8), (_60021, 8), (_60020, 8), (_60019, 8), (_60018, 8), (_60017, 8), (_60016, 8), (_60015, 8), (_60014, 8), (_60013, 8), (_60012, 8), (_60366, 8), (_60365, 8), (_60364, 8), (_60363, 8), (_60362, 8), (_60361, 8), (_60360, 8), (_60359, 8), (_60358, 8), (_60357, 8), (_60356, 8), (_60355, 8), (_60354, 8), (_60353, 8), (_60352, 8), (_60351, 8), (_60350, 8), (_60349, 8), (_60348, 8), (_60347, 8), (_60346, 8), (_60345, 8), (_60344, 8), (_60343, 8), (_60342, 8), (_60341, 8), (_60340, 8), (_60339, 8), (_60338, 8), (_60337, 8), (_60336, 8), (_60335, 8), (_60689, 8), (_60688, 8), (_60687, 8), (_60686, 8), (_60685, 8), (_60684, 8), (_60683, 8), (_60682, 8), (_60681, 8), (_60680, 8), (_60679, 8), (_60678, 8), (_60677, 8), (_60676, 8), (_60675, 8), (_60674, 8), (_60673, 8), (_60672, 8), (_60671, 8), (_60670, 8), (_60669, 8), (_60668, 8), (_60667, 8), (_60666, 8), (_60665, 8), (_60664, 8), (_60663, 8), (_60662, 8), (_60661, 8), (_60660, 8), (_60659, 8), (_60658, 8), (_61012, 8), (_61011, 8), (_61010, 8), (_61009, 8), (_61008, 8), (_61007, 8), (_61006, 8), (_61005, 8), (_61004, 8), (_61003, 8), (_61002, 8), (_61001, 8), (_61000, 8), (_60999, 8), (_60998, 8), (_60997, 8), (_60996, 8), (_60995, 8), (_60994, 8), (_60993, 8), (_60992, 8), (_60991, 8), (_60990, 8), (_60989, 8), (_60988, 8), (_60987, 8), (_60986, 8), (_60985, 8), (_60984, 8), (_60983, 8), (_60982, 8), (_60981, 8), (_61335, 8), (_61334, 8), (_61333, 8), (_61332, 8), (_61331, 8), (_61330, 8), (_61329, 8), (_61328, 8), (_61327, 8), (_61326, 8), (_61325, 8), (_61324, 8), (_61323, 8), (_61322, 8), (_61321, 8), (_61320, 8), (_61319, 8), (_61318, 8), (_61317, 8), (_61316, 8), (_61315, 8), (_61314, 8), (_61313, 8), (_61312, 8), (_61311, 8), (_61310, 8), (_61309, 8), (_61308, 8), (_61307, 8), (_61306, 8), (_61305, 8), (_61304, 8), (_61658, 8), (_61657, 8), (_61656, 8), (_61655, 8), (_61654, 8), (_61653, 8), (_61652, 8), (_61651, 8), (_61650, 8), (_61649, 8), (_61648, 8), (_61647, 8), (_61646, 8), (_61645, 8), (_61644, 8), (_61643, 8), (_61642, 8), (_61641, 8), (_61640, 8), (_61639, 8), (_61638, 8), (_61637, 8), (_61636, 8), (_61635, 8), (_61634, 8), (_61633, 8), (_61632, 8), (_61631, 8), (_61630, 8), (_61629, 8), (_61628, 8), (_61627, 8), (_61981, 8), (_61980, 8), (_61979, 8), (_61978, 8), (_61977, 8), (_61976, 8), (_61975, 8), (_61974, 8), (_61973, 8), (_61972, 8), (_61971, 8), (_61970, 8), (_61969, 8), (_61968, 8), (_61967, 8), (_61966, 8), (_61965, 8), (_61964, 8), (_61963, 8), (_61962, 8), (_61961, 8), (_61960, 8), (_61959, 8), (_61958, 8), (_61957, 8), (_61956, 8), (_61955, 8), (_61954, 8), (_61953, 8), (_61952, 8), (_61951, 8), (_61950, 8), (_62304, 8), (_62303, 8), (_62302, 8), (_62301, 8), (_62300, 8), (_62299, 8), (_62298, 8), (_62297, 8), (_62296, 8), (_62295, 8), (_62294, 8), (_62293, 8), (_62292, 8), (_62291, 8), (_62290, 8), (_62289, 8), (_62288, 8), (_62287, 8), (_62286, 8), (_62285, 8), (_62284, 8), (_62283, 8), (_62282, 8), (_62281, 8), (_62280, 8), (_62279, 8), (_62278, 8), (_62277, 8), (_62276, 8), (_62275, 8), (_62274, 8), (_62273, 8), (_62627, 8), (_62626, 8), (_62625, 8), (_62624, 8), (_62623, 8), (_62622, 8), (_62621, 8), (_62620, 8), (_62619, 8), (_62618, 8), (_62617, 8), (_62616, 8), (_62615, 8), (_62614, 8), (_62613, 8), (_62612, 8), (_62611, 8), (_62610, 8), (_62609, 8), (_62608, 8), (_62607, 8), (_62606, 8), (_62605, 8), (_62604, 8), (_62603, 8), (_62602, 8), (_62601, 8), (_62600, 8), (_62599, 8), (_62598, 8), (_62597, 8), (_62596, 8), (_62950, 8), (_62949, 8), (_62948, 8), (_62947, 8), (_62946, 8), (_62945, 8), (_62944, 8), (_62943, 8), (_62942, 8), (_62941, 8), (_62940, 8), (_62939, 8), (_62938, 8), (_62937, 8), (_62936, 8), (_62935, 8), (_62934, 8), (_62933, 8), (_62932, 8), (_62931, 8), (_62930, 8), (_62929, 8), (_62928, 8), (_62927, 8), (_62926, 8), (_62925, 8), (_62924, 8), (_62923, 8), (_62922, 8), (_62921, 8), (_62920, 8), (_62919, 8), (_63273, 8), (_63272, 8), (_63271, 8), (_63270, 8), (_63269, 8), (_63268, 8), (_63267, 8), (_63266, 8), (_63265, 8), (_63264, 8), (_63263, 8), (_63262, 8), (_63261, 8), (_63260, 8), (_63259, 8), (_63258, 8), (_63257, 8), (_63256, 8), (_63255, 8), (_63254, 8), (_63253, 8), (_63252, 8), (_63251, 8), (_63250, 8), (_63249, 8), (_63248, 8), (_63247, 8), (_63246, 8), (_63245, 8), (_63244, 8), (_63243, 8), (_63242, 8), (_63596, 8), (_63595, 8), (_63594, 8), (_63593, 8), (_63592, 8), (_63591, 8), (_63590, 8), (_63589, 8), (_63588, 8), (_63587, 8), (_63586, 8), (_63585, 8), (_63584, 8), (_63583, 8), (_63582, 8), (_63581, 8), (_63580, 8), (_63579, 8), (_63578, 8), (_63577, 8), (_63576, 8), (_63575, 8), (_63574, 8), (_63573, 8), (_63572, 8), (_63571, 8), (_63570, 8), (_63569, 8), (_63568, 8), (_63567, 8), (_63566, 8), (_63565, 8), (_63919, 8), (_63918, 8), (_63917, 8), (_63916, 8), (_63915, 8), (_63914, 8), (_63913, 8), (_63912, 8), (_63911, 8), (_63910, 8), (_63909, 8), (_63908, 8), (_63907, 8), (_63906, 8), (_63905, 8), (_63904, 8), (_63903, 8), (_63902, 8), (_63901, 8), (_63900, 8), (_63899, 8), (_63898, 8), (_63897, 8), (_63896, 8), (_63895, 8), (_63894, 8), (_63893, 8), (_63892, 8), (_63891, 8), (_63890, 8), (_63889, 8), (_63888, 8), (_64242, 8), (_64241, 8), (_64240, 8), (_64239, 8), (_64238, 8), (_64237, 8), (_64236, 8), (_64235, 8), (_64234, 8), (_64233, 8), (_64232, 8), (_64231, 8), (_64230, 8), (_64229, 8), (_64228, 8), (_64227, 8), (_64226, 8), (_64225, 8), (_64224, 8), (_64223, 8), (_64222, 8), (_64221, 8), (_64220, 8), (_64219, 8), (_64218, 8), (_64217, 8), (_64216, 8), (_64215, 8), (_64214, 8), (_64213, 8), (_64212, 8), (_64211, 8), (_64565, 8), (_64564, 8), (_64563, 8), (_64562, 8), (_64561, 8), (_64560, 8), (_64559, 8), (_64558, 8), (_64557, 8), (_64556, 8), (_64555, 8), (_64554, 8), (_64553, 8), (_64552, 8), (_64551, 8), (_64550, 8), (_64549, 8), (_64548, 8), (_64547, 8), (_64546, 8), (_64545, 8), (_64544, 8), (_64543, 8), (_64542, 8), (_64541, 8), (_64540, 8), (_64539, 8), (_64538, 8), (_64537, 8), (_64536, 8), (_64535, 8), (_64534, 8), (_64888, 8), (_64887, 8), (_64886, 8), (_64885, 8), (_64884, 8), (_64883, 8), (_64882, 8), (_64881, 8), (_64880, 8), (_64879, 8), (_64878, 8), (_64877, 8), (_64876, 8), (_64875, 8), (_64874, 8), (_64873, 8), (_64872, 8), (_64871, 8), (_64870, 8), (_64869, 8), (_64868, 8), (_64867, 8), (_64866, 8), (_64865, 8), (_64864, 8), (_64863, 8), (_64862, 8), (_64861, 8), (_64860, 8), (_64859, 8), (_64858, 8), (_64857, 8), (_65211, 8), (_65210, 8), (_65209, 8), (_65208, 8), (_65207, 8), (_65206, 8), (_65205, 8), (_65204, 8), (_65203, 8), (_65202, 8), (_65201, 8), (_65200, 8), (_65199, 8), (_65198, 8), (_65197, 8), (_65196, 8), (_65195, 8), (_65194, 8), (_65193, 8), (_65192, 8), (_65191, 8), (_65190, 8), (_65189, 8), (_65188, 8), (_65187, 8), (_65186, 8), (_65185, 8), (_65184, 8), (_65183, 8), (_65182, 8), (_65181, 8), (_65180, 8), (_65534, 8), (_65533, 8), (_65532, 8), (_65531, 8), (_65530, 8), (_65529, 8), (_65528, 8), (_65527, 8), (_65526, 8), (_65525, 8), (_65524, 8), (_65523, 8), (_65522, 8), (_65521, 8), (_65520, 8), (_65519, 8), (_65518, 8), (_65517, 8), (_65516, 8), (_65515, 8), (_65514, 8), (_65513, 8), (_65512, 8), (_65511, 8), (_65510, 8), (_65509, 8), (_65508, 8), (_65507, 8), (_65506, 8), (_65505, 8), (_65504, 8), (_65503, 8), (_65857, 8), (_65856, 8), (_65855, 8), (_65854, 8), (_65853, 8), (_65852, 8), (_65851, 8), (_65850, 8), (_65849, 8), (_65848, 8), (_65847, 8), (_65846, 8), (_65845, 8), (_65844, 8), (_65843, 8), (_65842, 8), (_65841, 8), (_65840, 8), (_65839, 8), (_65838, 8), (_65837, 8), (_65836, 8), (_65835, 8), (_65834, 8), (_65833, 8), (_65832, 8), (_65831, 8), (_65830, 8), (_65829, 8), (_65828, 8), (_65827, 8), (_65826, 8), (_66180, 8), (_66179, 8), (_66178, 8), (_66177, 8), (_66176, 8), (_66175, 8), (_66174, 8), (_66173, 8), (_66172, 8), (_66171, 8), (_66170, 8), (_66169, 8), (_66168, 8), (_66167, 8), (_66166, 8), (_66165, 8), (_66164, 8), (_66163, 8), (_66162, 8), (_66161, 8), (_66160, 8), (_66159, 8), (_66158, 8), (_66157, 8), (_66156, 8), (_66155, 8), (_66154, 8), (_66153, 8), (_66152, 8), (_66151, 8), (_66150, 8), (_66149, 8), (_66503, 8), (_66502, 8), (_66501, 8), (_66500, 8), (_66499, 8), (_66498, 8), (_66497, 8), (_66496, 8), (_66495, 8), (_66494, 8), (_66493, 8), (_66492, 8), (_66491, 8), (_66490, 8), (_66489, 8), (_66488, 8), (_66487, 8), (_66486, 8), (_66485, 8), (_66484, 8), (_66483, 8), (_66482, 8), (_66481, 8), (_66480, 8), (_66479, 8), (_66478, 8), (_66477, 8), (_66476, 8), (_66475, 8), (_66474, 8), (_66473, 8), (_66472, 8), (_66826, 8), (_66825, 8), (_66824, 8), (_66823, 8), (_66822, 8), (_66821, 8), (_66820, 8), (_66819, 8), (_66818, 8), (_66817, 8), (_66816, 8), (_66815, 8), (_66814, 8), (_66813, 8), (_66812, 8), (_66811, 8), (_66810, 8), (_66809, 8), (_66808, 8), (_66807, 8), (_66806, 8), (_66805, 8), (_66804, 8), (_66803, 8), (_66802, 8), (_66801, 8), (_66800, 8), (_66799, 8), (_66798, 8), (_66797, 8), (_66796, 8), (_66795, 8), (_67149, 8), (_67148, 8), (_67147, 8), (_67146, 8), (_67145, 8), (_67144, 8), (_67143, 8), (_67142, 8), (_67141, 8), (_67140, 8), (_67139, 8), (_67138, 8), (_67137, 8), (_67136, 8), (_67135, 8), (_67134, 8), (_67133, 8), (_67132, 8), (_67131, 8), (_67130, 8), (_67129, 8), (_67128, 8), (_67127, 8), (_67126, 8), (_67125, 8), (_67124, 8), (_67123, 8), (_67122, 8), (_67121, 8), (_67120, 8), (_67119, 8), (_67118, 8), (_67472, 8), (_67471, 8), (_67470, 8), (_67469, 8), (_67468, 8), (_67467, 8), (_67466, 8), (_67465, 8), (_67464, 8), (_67463, 8), (_67462, 8), (_67461, 8), (_67460, 8), (_67459, 8), (_67458, 8), (_67457, 8), (_67456, 8), (_67455, 8), (_67454, 8), (_67453, 8), (_67452, 8), (_67451, 8), (_67450, 8), (_67449, 8), (_67448, 8), (_67447, 8), (_67446, 8), (_67445, 8), (_67444, 8), (_67443, 8), (_67442, 8), (_67441, 8), (_67795, 8), (_67794, 8), (_67793, 8), (_67792, 8), (_67791, 8), (_67790, 8), (_67789, 8), (_67788, 8), (_67787, 8), (_67786, 8), (_67785, 8), (_67784, 8), (_67783, 8), (_67782, 8), (_67781, 8), (_67780, 8), (_67779, 8), (_67778, 8), (_67777, 8), (_67776, 8), (_67775, 8), (_67774, 8), (_67773, 8), (_67772, 8), (_67771, 8), (_67770, 8), (_67769, 8), (_67768, 8), (_67767, 8), (_67766, 8), (_67765, 8), (_67764, 8), (_68118, 8), (_68117, 8), (_68116, 8), (_68115, 8), (_68114, 8), (_68113, 8), (_68112, 8), (_68111, 8), (_68110, 8), (_68109, 8), (_68108, 8), (_68107, 8), (_68106, 8), (_68105, 8), (_68104, 8), (_68103, 8), (_68102, 8), (_68101, 8), (_68100, 8), (_68099, 8), (_68098, 8), (_68097, 8), (_68096, 8), (_68095, 8), (_68094, 8), (_68093, 8), (_68092, 8), (_68091, 8), (_68090, 8), (_68089, 8), (_68088, 8), (_68087, 8), (_68441, 8), (_68440, 8), (_68439, 8), (_68438, 8), (_68437, 8), (_68436, 8), (_68435, 8), (_68434, 8), (_68433, 8), (_68432, 8), (_68431, 8), (_68430, 8), (_68429, 8), (_68428, 8), (_68427, 8), (_68426, 8), (_68425, 8), (_68424, 8), (_68423, 8), (_68422, 8), (_68421, 8), (_68420, 8), (_68419, 8), (_68418, 8), (_68417, 8), (_68416, 8), (_68415, 8), (_68414, 8), (_68413, 8), (_68412, 8), (_68411, 8), (_68410, 8), (_68764, 8), (_68763, 8), (_68762, 8), (_68761, 8), (_68760, 8), (_68759, 8), (_68758, 8), (_68757, 8), (_68756, 8), (_68755, 8), (_68754, 8), (_68753, 8), (_68752, 8), (_68751, 8), (_68750, 8), (_68749, 8), (_68748, 8), (_68747, 8), (_68746, 8), (_68745, 8), (_68744, 8), (_68743, 8), (_68742, 8), (_68741, 8), (_68740, 8), (_68739, 8), (_68738, 8), (_68737, 8), (_68736, 8), (_68735, 8), (_68734, 8), (_68733, 8), (_69087, 8), (_69086, 8), (_69085, 8), (_69084, 8), (_69083, 8), (_69082, 8), (_69081, 8), (_69080, 8), (_69079, 8), (_69078, 8), (_69077, 8), (_69076, 8), (_69075, 8), (_69074, 8), (_69073, 8), (_69072, 8), (_69071, 8), (_69070, 8), (_69069, 8), (_69068, 8), (_69067, 8), (_69066, 8), (_69065, 8), (_69064, 8), (_69063, 8), (_69062, 8), (_69061, 8), (_69060, 8), (_69059, 8), (_69058, 8), (_69057, 8), (_69056, 8), (_69410, 8), (_69409, 8), (_69408, 8), (_69407, 8), (_69406, 8), (_69405, 8), (_69404, 8), (_69403, 8), (_69402, 8), (_69401, 8), (_69400, 8), (_69399, 8), (_69398, 8), (_69397, 8), (_69396, 8), (_69395, 8), (_69394, 8), (_69393, 8), (_69392, 8), (_69391, 8), (_69390, 8), (_69389, 8), (_69388, 8), (_69387, 8), (_69386, 8), (_69385, 8), (_69384, 8), (_69383, 8), (_69382, 8), (_69381, 8), (_69380, 8), (_69379, 8), (_69733, 8), (_69732, 8), (_69731, 8), (_69730, 8), (_69729, 8), (_69728, 8), (_69727, 8), (_69726, 8), (_69725, 8), (_69724, 8), (_69723, 8), (_69722, 8), (_69721, 8), (_69720, 8), (_69719, 8), (_69718, 8), (_69717, 8), (_69716, 8), (_69715, 8), (_69714, 8), (_69713, 8), (_69712, 8), (_69711, 8), (_69710, 8), (_69709, 8), (_69708, 8), (_69707, 8), (_69706, 8), (_69705, 8), (_69704, 8), (_69703, 8), (_69702, 8), (_70056, 8), (_70055, 8), (_70054, 8), (_70053, 8), (_70052, 8), (_70051, 8), (_70050, 8), (_70049, 8), (_70048, 8), (_70047, 8), (_70046, 8), (_70045, 8), (_70044, 8), (_70043, 8), (_70042, 8), (_70041, 8), (_70040, 8), (_70039, 8), (_70038, 8), (_70037, 8), (_70036, 8), (_70035, 8), (_70034, 8), (_70033, 8), (_70032, 8), (_70031, 8), (_70030, 8), (_70029, 8), (_70028, 8), (_70027, 8), (_70026, 8), (_70025, 8), (_70379, 8), (_70378, 8), (_70377, 8), (_70376, 8), (_70375, 8), (_70374, 8), (_70373, 8), (_70372, 8), (_70371, 8), (_70370, 8), (_70369, 8), (_70368, 8), (_70367, 8), (_70366, 8), (_70365, 8), (_70364, 8), (_70363, 8), (_70362, 8), (_70361, 8), (_70360, 8), (_70359, 8), (_70358, 8), (_70357, 8), (_70356, 8), (_70355, 8), (_70354, 8), (_70353, 8), (_70352, 8), (_70351, 8), (_70350, 8), (_70349, 8), (_70348, 8), (_70702, 8), (_70701, 8), (_70700, 8), (_70699, 8), (_70698, 8), (_70697, 8), (_70696, 8), (_70695, 8), (_70694, 8), (_70693, 8), (_70692, 8), (_70691, 8), (_70690, 8), (_70689, 8), (_70688, 8), (_70687, 8), (_70686, 8), (_70685, 8), (_70684, 8), (_70683, 8), (_70682, 8), (_70681, 8), (_70680, 8), (_70679, 8), (_70678, 8), (_70677, 8), (_70676, 8), (_70675, 8), (_70674, 8), (_70673, 8), (_70672, 8), (_70671, 8), (_71025, 8), (_71024, 8), (_71023, 8), (_71022, 8), (_71021, 8), (_71020, 8), (_71019, 8), (_71018, 8), (_71017, 8), (_71016, 8), (_71015, 8), (_71014, 8), (_71013, 8), (_71012, 8), (_71011, 8), (_71010, 8), (_71009, 8), (_71008, 8), (_71007, 8), (_71006, 8), (_71005, 8), (_71004, 8), (_71003, 8), (_71002, 8), (_71001, 8), (_71000, 8), (_70999, 8), (_70998, 8), (_70997, 8), (_70996, 8), (_70995, 8), (_70994, 8), (_71348, 8), (_71347, 8), (_71346, 8), (_71345, 8), (_71344, 8), (_71343, 8), (_71342, 8), (_71341, 8), (_71340, 8), (_71339, 8), (_71338, 8), (_71337, 8), (_71336, 8), (_71335, 8), (_71334, 8), (_71333, 8), (_71332, 8), (_71331, 8), (_71330, 8), (_71329, 8), (_71328, 8), (_71327, 8), (_71326, 8), (_71325, 8), (_71324, 8), (_71323, 8), (_71322, 8), (_71321, 8), (_71320, 8), (_71319, 8), (_71318, 8), (_71317, 8), (_71671, 8), (_71670, 8), (_71669, 8), (_71668, 8), (_71667, 8), (_71666, 8), (_71665, 8), (_71664, 8), (_71663, 8), (_71662, 8), (_71661, 8), (_71660, 8), (_71659, 8), (_71658, 8), (_71657, 8), (_71656, 8), (_71655, 8), (_71654, 8), (_71653, 8), (_71652, 8), (_71651, 8), (_71650, 8), (_71649, 8), (_71648, 8), (_71647, 8), (_71646, 8), (_71645, 8), (_71644, 8), (_71643, 8), (_71642, 8), (_71641, 8), (_71640, 8), (_71994, 8), (_71993, 8), (_71992, 8), (_71991, 8), (_71990, 8), (_71989, 8), (_71988, 8), (_71987, 8), (_71986, 8), (_71985, 8), (_71984, 8), (_71983, 8), (_71982, 8), (_71981, 8), (_71980, 8), (_71979, 8), (_71978, 8), (_71977, 8), (_71976, 8), (_71975, 8), (_71974, 8), (_71973, 8), (_71972, 8), (_71971, 8), (_71970, 8), (_71969, 8), (_71968, 8), (_71967, 8), (_71966, 8), (_71965, 8), (_71964, 8), (_71963, 8), (_72317, 8), (_72316, 8), (_72315, 8), (_72314, 8), (_72313, 8), (_72312, 8), (_72311, 8), (_72310, 8), (_72309, 8), (_72308, 8), (_72307, 8), (_72306, 8), (_72305, 8), (_72304, 8), (_72303, 8), (_72302, 8), (_72301, 8), (_72300, 8), (_72299, 8), (_72298, 8), (_72297, 8), (_72296, 8), (_72295, 8), (_72294, 8), (_72293, 8), (_72292, 8), (_72291, 8), (_72290, 8), (_72289, 8), (_72288, 8), (_72287, 8), (_72286, 8), (_72640, 8), (_72639, 8), (_72638, 8), (_72637, 8), (_72636, 8), (_72635, 8), (_72634, 8), (_72633, 8), (_72632, 8), (_72631, 8), (_72630, 8), (_72629, 8), (_72628, 8), (_72627, 8), (_72626, 8), (_72625, 8), (_72624, 8), (_72623, 8), (_72622, 8), (_72621, 8), (_72620, 8), (_72619, 8), (_72618, 8), (_72617, 8), (_72616, 8), (_72615, 8), (_72614, 8), (_72613, 8), (_72612, 8), (_72611, 8), (_72610, 8), (_72609, 8), (_72963, 8), (_72962, 8), (_72961, 8), (_72960, 8), (_72959, 8), (_72958, 8), (_72957, 8), (_72956, 8), (_72955, 8), (_72954, 8), (_72953, 8), (_72952, 8), (_72951, 8), (_72950, 8), (_72949, 8), (_72948, 8), (_72947, 8), (_72946, 8), (_72945, 8), (_72944, 8), (_72943, 8), (_72942, 8), (_72941, 8), (_72940, 8), (_72939, 8), (_72938, 8), (_72937, 8), (_72936, 8), (_72935, 8), (_72934, 8), (_72933, 8), (_72932, 8), (_73286, 8), (_73285, 8), (_73284, 8), (_73283, 8), (_73282, 8), (_73281, 8), (_73280, 8), (_73279, 8), (_73278, 8), (_73277, 8), (_73276, 8), (_73275, 8), (_73274, 8), (_73273, 8), (_73272, 8), (_73271, 8), (_73270, 8), (_73269, 8), (_73268, 8), (_73267, 8), (_73266, 8), (_73265, 8), (_73264, 8), (_73263, 8), (_73262, 8), (_73261, 8), (_73260, 8), (_73259, 8), (_73258, 8), (_73257, 8), (_73256, 8), (_73255, 8), (_73609, 8), (_73608, 8), (_73607, 8), (_73606, 8), (_73605, 8), (_73604, 8), (_73603, 8), (_73602, 8), (_73601, 8), (_73600, 8), (_73599, 8), (_73598, 8), (_73597, 8), (_73596, 8), (_73595, 8), (_73594, 8), (_73593, 8), (_73592, 8), (_73591, 8), (_73590, 8), (_73589, 8), (_73588, 8), (_73587, 8), (_73586, 8), (_73585, 8), (_73584, 8), (_73583, 8), (_73582, 8), (_73581, 8), (_73580, 8), (_73579, 8), (_73578, 8), (_73932, 8), (_73931, 8), (_73930, 8), (_73929, 8), (_73928, 8), (_73927, 8), (_73926, 8), (_73925, 8), (_73924, 8), (_73923, 8), (_73922, 8), (_73921, 8), (_73920, 8), (_73919, 8), (_73918, 8), (_73917, 8), (_73916, 8), (_73915, 8), (_73914, 8), (_73913, 8), (_73912, 8), (_73911, 8), (_73910, 8), (_73909, 8), (_73908, 8), (_73907, 8), (_73906, 8), (_73905, 8), (_73904, 8), (_73903, 8), (_73902, 8), (_73901, 8), (_74255, 8), (_74254, 8), (_74253, 8), (_74252, 8), (_74251, 8), (_74250, 8), (_74249, 8), (_74248, 8), (_74247, 8), (_74246, 8), (_74245, 8), (_74244, 8), (_74243, 8), (_74242, 8), (_74241, 8), (_74240, 8), (_74239, 8), (_74238, 8), (_74237, 8), (_74236, 8), (_74235, 8), (_74234, 8), (_74233, 8), (_74232, 8), (_74231, 8), (_74230, 8), (_74229, 8), (_74228, 8), (_74227, 8), (_74226, 8), (_74225, 8), (_74224, 8), (_74578, 8), (_74577, 8), (_74576, 8), (_74575, 8), (_74574, 8), (_74573, 8), (_74572, 8), (_74571, 8), (_74570, 8), (_74569, 8), (_74568, 8), (_74567, 8), (_74566, 8), (_74565, 8), (_74564, 8), (_74563, 8), (_74562, 8), (_74561, 8), (_74560, 8), (_74559, 8), (_74558, 8), (_74557, 8), (_74556, 8), (_74555, 8), (_74554, 8), (_74553, 8), (_74552, 8), (_74551, 8), (_74550, 8), (_74549, 8), (_74548, 8), (_74547, 8), (_74901, 8), (_74900, 8), (_74899, 8), (_74898, 8), (_74897, 8), (_74896, 8), (_74895, 8), (_74894, 8), (_74893, 8), (_74892, 8), (_74891, 8), (_74890, 8), (_74889, 8), (_74888, 8), (_74887, 8), (_74886, 8), (_74885, 8), (_74884, 8), (_74883, 8), (_74882, 8), (_74881, 8), (_74880, 8), (_74879, 8), (_74878, 8), (_74877, 8), (_74876, 8), (_74875, 8), (_74874, 8), (_74873, 8), (_74872, 8), (_74871, 8), (_74870, 8), (_75224, 8), (_75223, 8), (_75222, 8), (_75221, 8), (_75220, 8), (_75219, 8), (_75218, 8), (_75217, 8), (_75216, 8), (_75215, 8), (_75214, 8), (_75213, 8), (_75212, 8), (_75211, 8), (_75210, 8), (_75209, 8), (_75208, 8), (_75207, 8), (_75206, 8), (_75205, 8), (_75204, 8), (_75203, 8), (_75202, 8), (_75201, 8), (_75200, 8), (_75199, 8), (_75198, 8), (_75197, 8), (_75196, 8), (_75195, 8), (_75194, 8), (_75193, 8), (_75547, 8), (_75546, 8), (_75545, 8), (_75544, 8), (_75543, 8), (_75542, 8), (_75541, 8), (_75540, 8), (_75539, 8), (_75538, 8), (_75537, 8), (_75536, 8), (_75535, 8), (_75534, 8), (_75533, 8), (_75532, 8), (_75531, 8), (_75530, 8), (_75529, 8), (_75528, 8), (_75527, 8), (_75526, 8), (_75525, 8), (_75524, 8), (_75523, 8), (_75522, 8), (_75521, 8), (_75520, 8), (_75519, 8), (_75518, 8), (_75517, 8), (_75516, 8), (_75870, 8), (_75869, 8), (_75868, 8), (_75867, 8), (_75866, 8), (_75865, 8), (_75864, 8), (_75863, 8), (_75862, 8), (_75861, 8), (_75860, 8), (_75859, 8), (_75858, 8), (_75857, 8), (_75856, 8), (_75855, 8), (_75854, 8), (_75853, 8), (_75852, 8), (_75851, 8), (_75850, 8), (_75849, 8), (_75848, 8), (_75847, 8), (_75846, 8), (_75845, 8), (_75844, 8), (_75843, 8), (_75842, 8), (_75841, 8), (_75840, 8), (_75839, 8), (_76193, 8), (_76192, 8), (_76191, 8), (_76190, 8), (_76189, 8), (_76188, 8), (_76187, 8), (_76186, 8), (_76185, 8), (_76184, 8), (_76183, 8), (_76182, 8), (_76181, 8), (_76180, 8), (_76179, 8), (_76178, 8), (_76177, 8), (_76176, 8), (_76175, 8), (_76174, 8), (_76173, 8), (_76172, 8), (_76171, 8), (_76170, 8), (_76169, 8), (_76168, 8), (_76167, 8), (_76166, 8), (_76165, 8), (_76164, 8), (_76163, 8), (_76162, 8), (_76516, 8), (_76515, 8), (_76514, 8), (_76513, 8), (_76512, 8), (_76511, 8), (_76510, 8), (_76509, 8), (_76508, 8), (_76507, 8), (_76506, 8), (_76505, 8), (_76504, 8), (_76503, 8), (_76502, 8), (_76501, 8), (_76500, 8), (_76499, 8), (_76498, 8), (_76497, 8), (_76496, 8), (_76495, 8), (_76494, 8), (_76493, 8), (_76492, 8), (_76491, 8), (_76490, 8), (_76489, 8), (_76488, 8), (_76487, 8), (_76486, 8), (_76485, 8), (_76839, 8), (_76838, 8), (_76837, 8), (_76836, 8), (_76835, 8), (_76834, 8), (_76833, 8), (_76832, 8), (_76831, 8), (_76830, 8), (_76829, 8), (_76828, 8), (_76827, 8), (_76826, 8), (_76825, 8), (_76824, 8), (_76823, 8), (_76822, 8), (_76821, 8), (_76820, 8), (_76819, 8), (_76818, 8), (_76817, 8), (_76816, 8), (_76815, 8), (_76814, 8), (_76813, 8), (_76812, 8), (_76811, 8), (_76810, 8), (_76809, 8), (_76808, 8), (_77162, 8), (_77161, 8), (_77160, 8), (_77159, 8), (_77158, 8), (_77157, 8), (_77156, 8), (_77155, 8), (_77154, 8), (_77153, 8), (_77152, 8), (_77151, 8), (_77150, 8), (_77149, 8), (_77148, 8), (_77147, 8), (_77146, 8), (_77145, 8), (_77144, 8), (_77143, 8), (_77142, 8), (_77141, 8), (_77140, 8), (_77139, 8), (_77138, 8), (_77137, 8), (_77136, 8), (_77135, 8), (_77134, 8), (_77133, 8), (_77132, 8), (_77131, 8), (_77485, 8), (_77484, 8), (_77483, 8), (_77482, 8), (_77481, 8), (_77480, 8), (_77479, 8), (_77478, 8), (_77477, 8), (_77476, 8), (_77475, 8), (_77474, 8), (_77473, 8), (_77472, 8), (_77471, 8), (_77470, 8), (_77469, 8), (_77468, 8), (_77467, 8), (_77466, 8), (_77465, 8), (_77464, 8), (_77463, 8), (_77462, 8), (_77461, 8), (_77460, 8), (_77459, 8), (_77458, 8), (_77457, 8), (_77456, 8), (_77455, 8), (_77454, 8), (_77808, 8), (_77807, 8), (_77806, 8), (_77805, 8), (_77804, 8), (_77803, 8), (_77802, 8), (_77801, 8), (_77800, 8), (_77799, 8), (_77798, 8), (_77797, 8), (_77796, 8), (_77795, 8), (_77794, 8), (_77793, 8), (_77792, 8), (_77791, 8), (_77790, 8), (_77789, 8), (_77788, 8), (_77787, 8), (_77786, 8), (_77785, 8), (_77784, 8), (_77783, 8), (_77782, 8), (_77781, 8), (_77780, 8), (_77779, 8), (_77778, 8), (_77777, 8), (_78131, 8), (_78130, 8), (_78129, 8), (_78128, 8), (_78127, 8), (_78126, 8), (_78125, 8), (_78124, 8), (_78123, 8), (_78122, 8), (_78121, 8), (_78120, 8), (_78119, 8), (_78118, 8), (_78117, 8), (_78116, 8), (_78115, 8), (_78114, 8), (_78113, 8), (_78112, 8), (_78111, 8), (_78110, 8), (_78109, 8), (_78108, 8), (_78107, 8), (_78106, 8), (_78105, 8), (_78104, 8), (_78103, 8), (_78102, 8), (_78101, 8), (_78100, 8), (_78454, 8), (_78453, 8), (_78452, 8), (_78451, 8), (_78450, 8), (_78449, 8), (_78448, 8), (_78447, 8), (_78446, 8), (_78445, 8), (_78444, 8), (_78443, 8), (_78442, 8), (_78441, 8), (_78440, 8), (_78439, 8), (_78438, 8), (_78437, 8), (_78436, 8), (_78435, 8), (_78434, 8), (_78433, 8), (_78432, 8), (_78431, 8), (_78430, 8), (_78429, 8), (_78428, 8), (_78427, 8), (_78426, 8), (_78425, 8), (_78424, 8), (_78423, 8), (_78777, 8), (_78776, 8), (_78775, 8), (_78774, 8), (_78773, 8), (_78772, 8), (_78771, 8), (_78770, 8), (_78769, 8), (_78768, 8), (_78767, 8), (_78766, 8), (_78765, 8), (_78764, 8), (_78763, 8), (_78762, 8), (_78761, 8), (_78760, 8), (_78759, 8), (_78758, 8), (_78757, 8), (_78756, 8), (_78755, 8), (_78754, 8), (_78753, 8), (_78752, 8), (_78751, 8), (_78750, 8), (_78749, 8), (_78748, 8), (_78747, 8), (_78746, 8), (_79100, 8), (_79099, 8), (_79098, 8), (_79097, 8), (_79096, 8), (_79095, 8), (_79094, 8), (_79093, 8), (_79092, 8), (_79091, 8), (_79090, 8), (_79089, 8), (_79088, 8), (_79087, 8), (_79086, 8), (_79085, 8), (_79084, 8), (_79083, 8), (_79082, 8), (_79081, 8), (_79080, 8), (_79079, 8), (_79078, 8), (_79077, 8), (_79076, 8), (_79075, 8), (_79074, 8), (_79073, 8), (_79072, 8), (_79071, 8), (_79070, 8), (_79069, 8), (_79423, 8), (_79422, 8), (_79421, 8), (_79420, 8), (_79419, 8), (_79418, 8), (_79417, 8), (_79416, 8), (_79415, 8), (_79414, 8), (_79413, 8), (_79412, 8), (_79411, 8), (_79410, 8), (_79409, 8), (_79408, 8), (_79407, 8), (_79406, 8), (_79405, 8), (_79404, 8), (_79403, 8), (_79402, 8), (_79401, 8), (_79400, 8), (_79399, 8), (_79398, 8), (_79397, 8), (_79396, 8), (_79395, 8), (_79394, 8), (_79393, 8), (_79392, 8), (_79746, 8), (_79745, 8), (_79744, 8), (_79743, 8), (_79742, 8), (_79741, 8), (_79740, 8), (_79739, 8), (_79738, 8), (_79737, 8), (_79736, 8), (_79735, 8), (_79734, 8), (_79733, 8), (_79732, 8), (_79731, 8), (_79730, 8), (_79729, 8), (_79728, 8), (_79727, 8), (_79726, 8), (_79725, 8), (_79724, 8), (_79723, 8), (_79722, 8), (_79721, 8), (_79720, 8), (_79719, 8), (_79718, 8), (_79717, 8), (_79716, 8), (_79715, 8), (_80069, 8), (_80068, 8), (_80067, 8), (_80066, 8), (_80065, 8), (_80064, 8), (_80063, 8), (_80062, 8), (_80061, 8), (_80060, 8), (_80059, 8), (_80058, 8), (_80057, 8), (_80056, 8), (_80055, 8), (_80054, 8), (_80053, 8), (_80052, 8), (_80051, 8), (_80050, 8), (_80049, 8), (_80048, 8), (_80047, 8), (_80046, 8), (_80045, 8), (_80044, 8), (_80043, 8), (_80042, 8), (_80041, 8), (_80040, 8), (_80039, 8), (_80038, 8), (_80392, 8), (_80391, 8), (_80390, 8), (_80389, 8), (_80388, 8), (_80387, 8), (_80386, 8), (_80385, 8), (_80384, 8), (_80383, 8), (_80382, 8), (_80381, 8), (_80380, 8), (_80379, 8), (_80378, 8), (_80377, 8), (_80376, 8), (_80375, 8), (_80374, 8), (_80373, 8), (_80372, 8), (_80371, 8), (_80370, 8), (_80369, 8), (_80368, 8), (_80367, 8), (_80366, 8), (_80365, 8), (_80364, 8), (_80363, 8), (_80362, 8), (_80361, 8), (_80715, 8), (_80714, 8), (_80713, 8), (_80712, 8), (_80711, 8), (_80710, 8), (_80709, 8), (_80708, 8), (_80707, 8), (_80706, 8), (_80705, 8), (_80704, 8), (_80703, 8), (_80702, 8), (_80701, 8), (_80700, 8), (_80699, 8), (_80698, 8), (_80697, 8), (_80696, 8), (_80695, 8), (_80694, 8), (_80693, 8), (_80692, 8), (_80691, 8), (_80690, 8), (_80689, 8), (_80688, 8), (_80687, 8), (_80686, 8), (_80685, 8), (_80684, 8), (_81038, 8), (_81037, 8), (_81036, 8), (_81035, 8), (_81034, 8), (_81033, 8), (_81032, 8), (_81031, 8), (_81030, 8), (_81029, 8), (_81028, 8), (_81027, 8), (_81026, 8), (_81025, 8), (_81024, 8), (_81023, 8), (_81022, 8), (_81021, 8), (_81020, 8), (_81019, 8), (_81018, 8), (_81017, 8), (_81016, 8), (_81015, 8), (_81014, 8), (_81013, 8), (_81012, 8), (_81011, 8), (_81010, 8), (_81009, 8), (_81008, 8), (_81007, 8), (_81361, 8), (_81360, 8), (_81359, 8), (_81358, 8), (_81357, 8), (_81356, 8), (_81355, 8), (_81354, 8), (_81353, 8), (_81352, 8), (_81351, 8), (_81350, 8), (_81349, 8), (_81348, 8), (_81347, 8), (_81346, 8), (_81345, 8), (_81344, 8), (_81343, 8), (_81342, 8), (_81341, 8), (_81340, 8), (_81339, 8), (_81338, 8), (_81337, 8), (_81336, 8), (_81335, 8), (_81334, 8), (_81333, 8), (_81332, 8), (_81331, 8), (_81330, 8), (_81684, 8), (_81683, 8), (_81682, 8), (_81681, 8), (_81680, 8), (_81679, 8), (_81678, 8), (_81677, 8), (_81676, 8), (_81675, 8), (_81674, 8), (_81673, 8), (_81672, 8), (_81671, 8), (_81670, 8), (_81669, 8), (_81668, 8), (_81667, 8), (_81666, 8), (_81665, 8), (_81664, 8), (_81663, 8), (_81662, 8), (_81661, 8), (_81660, 8), (_81659, 8), (_81658, 8), (_81657, 8), (_81656, 8), (_81655, 8), (_81654, 8), (_81653, 8), (_82007, 8), (_82006, 8), (_82005, 8), (_82004, 8), (_82003, 8), (_82002, 8), (_82001, 8), (_82000, 8), (_81999, 8), (_81998, 8), (_81997, 8), (_81996, 8), (_81995, 8), (_81994, 8), (_81993, 8), (_81992, 8), (_81991, 8), (_81990, 8), (_81989, 8), (_81988, 8), (_81987, 8), (_81986, 8), (_81985, 8), (_81984, 8), (_81983, 8), (_81982, 8), (_81981, 8), (_81980, 8), (_81979, 8), (_81978, 8), (_81977, 8), (_81976, 8), (_82330, 8), (_82329, 8), (_82328, 8), (_82327, 8), (_82326, 8), (_82325, 8), (_82324, 8), (_82323, 8), (_82322, 8), (_82321, 8), (_82320, 8), (_82319, 8), (_82318, 8), (_82317, 8), (_82316, 8), (_82315, 8), (_82314, 8), (_82313, 8), (_82312, 8), (_82311, 8), (_82310, 8), (_82309, 8), (_82308, 8), (_82307, 8), (_82306, 8), (_82305, 8), (_82304, 8), (_82303, 8), (_82302, 8), (_82301, 8), (_82300, 8), (_82299, 8), (_82653, 8), (_82652, 8), (_82651, 8), (_82650, 8), (_82649, 8), (_82648, 8), (_82647, 8), (_82646, 8), (_82645, 8), (_82644, 8), (_82643, 8), (_82642, 8), (_82641, 8), (_82640, 8), (_82639, 8), (_82638, 8), (_82637, 8), (_82636, 8), (_82635, 8), (_82634, 8), (_82633, 8), (_82632, 8), (_82631, 8), (_82630, 8), (_82629, 8), (_82628, 8), (_82627, 8), (_82626, 8), (_82625, 8), (_82624, 8), (_82623, 8), (_82622, 8)] [_82945, _82946, _82947, _82948, _82949, _82950, _82951, _82952, _82953, _82954, _82955, _82956, _82957, _82958, _82959, _82960, _82961, _82962, _82963, _82964, _82965, _82966, _82967, _82968, _82969, _82970, _82971, _82972, _82973, _82974, _82975, _82976]", "EXPR [ (1, _256) (-1766847064778384329583297500742918515827483896875618958121606201292619776, _82945) (-6901746346790563787434755862277025452451108972170386555162524223799296, _82946) (-26959946667150639794667015087019630673637144422540572481103610249216, _82947) (-105312291668557186697918027683670432318895095400549111254310977536, _82948) (-411376139330301510538742295639337626245683966408394965837152256, _82949) (-1606938044258990275541962092341162602522202993782792835301376, _82950) (-6277101735386680763835789423207666416102355444464034512896, _82951) (-24519928653854221733733552434404946937899825954937634816, _82952) (-95780971304118053647396689196894323976171195136475136, _82953) (-374144419156711147060143317175368453031918731001856, _82954) (-1461501637330902918203684832716283019655932542976, _82955) (-5708990770823839524233143877797980545530986496, _82956) (-22300745198530623141535718272648361505980416, _82957) (-87112285931760246646623899502532662132736, _82958) (-340282366920938463463374607431768211456, _82959) (-1329227995784915872903807060280344576, _82960) (-5192296858534827628530496329220096, _82961) (-20282409603651670423947251286016, _82962) (-79228162514264337593543950336, _82963) (-309485009821345068724781056, _82964) (-1208925819614629174706176, _82965) (-4722366482869645213696, _82966) (-18446744073709551616, _82967) (-72057594037927936, _82968) (-281474976710656, _82969) (-1099511627776, _82970) (-4294967296, _82971) (-16777216, _82972) (-65536, _82973) (-256, _82974) (-1, _82975) 0 ]", "unconstrained func 0", "[Const { destination: Direct(5), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(6), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(7), bit_size: Integer(U32), value: 3 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(7), offset_address: Direct(5) }, Cast { destination: Direct(1), source: Direct(1), bit_size: Integer(U32) }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(7), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(3), op: IntegerDiv, lhs: Direct(0), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Mul, lhs: Direct(3), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Sub, lhs: Direct(0), rhs: Direct(4) }, Store { destination_pointer: Direct(9), source: Direct(4) }, BinaryIntOp { destination: Direct(9), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(6) }, Mov { destination: Direct(0), source: Direct(3) }, BinaryIntOp { destination: Direct(8), op: LessThan, bit_size: U32, lhs: Direct(9), rhs: Direct(7) }, JumpIf { condition: Direct(8), location: 7 }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, Stop { return_data: HeapVector { pointer: Direct(9), size: Direct(1) } }]", @@ -114730,14 +114730,14 @@ expression: artifact "unconstrained func 2", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "pL3NrvxNclZ7Lz32oDK+g1s5OkIGDLJkGWTMmSDu/bx7V6znhUEzaE+6EuyOrMr6P876Za694n/+5T/9w3/4H//l3//jP//n//rf//Lv/p//+Zf/8C//+E//9I//5d//03/9j3//r//4X//5j//f//m//u4v/D///b/+yz/8wx//X3/53/7nf/y3/tvf/8s//PO//uXf/fP/+Kd/+ru//H9//0//4/d/6b//t7//59/Xf/37f/njf/r5u7/8wz//pz9e/yj4n//xn/7hZ/S//u7P//bnr/9X33t5/+33IlQg/7YKWX+tgv31CmnDJ0jbPyu8+T8q+F+vUG12Fapj/lqF/9t7KGveQ3n+WyuE/00VelRh/6YK2UGF7L/pU8xHFebzV7+L/9u/B/sU/x4s7W/5F+XGe3he769VeO+vl2hnJbs/f1OBpcD4/NUC/5d/kvGhQNi/tYD331Ign/41uf8bC4T9bQWUiOi/bQ0oEH/bO4jP+7cVyPf5t32EXP4t1yf/jQVe/G0FXAX2byow/W8rUK7/6xyfv6mA1V8p8P/+8f/6+//4j//yf+yrf/n88X3/3V/e73/a73/673/G73/m73/W73/273/O73/u9791/+Xvf/t9/+vv+99/3wLvW+F9S7xvjfct8r5V7FvF7j18q9i3in2r2LeKfavYt4p9q9i3in+r+LeK30f5VvE/qvyxKp7fl/q+/FHljy/L5/uyvy/x+b6874v9/m+Gf1++VSK//7P6vnyrxLdKfKvkt0p+q+S3Sn6r5LdKft9Lft9Lfqvkt0p+q9S3Sn2rlH1f/PsS35fve6lvlervy3xf9velP9+Xb5X+Vulvlf5W6W+V/n6i/r6X/r6X/r6X+VaZ9335fqL5fqL5fqL5VplvlflWmW+V+VbZ7yfa73vZ73vZ73vZb5X9rst+P9F+P9F+P9F+q7zP517fvdq9+r3Gvea91r32vX7Lvc93hd773Ou7V7vXq/eu3rt67+q9q/fmXu/92b0/u/dnV8/8XuNe817rXq+eXT27en71/Or5fV6/9+f3/vze3/0Df973ep/X7/PGfd77V/7i6sXVi6t3/9Lf/VN/92/93T/2d//aX169vPW7f/Dv/sW/+yf/8url1bt/9e/+2b/7d//uH/67f/nv/um/+7f/6urVrd/983/37/9dAF5dvb56l4F3IXiXgncx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hxt+uOGHm2h75Tznhxt+uOGHG3644YcbfrjhhxvzUse81OGHG3644YebWHvlPOeHG3644Ycbfrjhhxt+uOGHG/NSx7zU4YcbfrjBww0ebvBwg4cbPNzg4QYPN3i44YcbfrgxL3XwcMMPN/xwww83qefmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3KSem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HCTem5e6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDTeo5P9zg4Sad5/xwk3puXuqYlzp4uMHDDR5u0j1ctveh56nn5qUOHm7S93nqeeq5ealjXurg4QYPN3i4SfdwOd6Hnqeem5c6eLhJ3+ep56nn5qWOeamDhxs83ODhppzn5TwvPS89Ny918HBTzvPS89Jz81LHvNTBww0ebvBwU+7hyn07P9zwww0/3ODhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDTem5eamDhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzel5+alDh5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/clJ6blzp4uOGHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cFN6XnqOhxt+uOGHG3644YcbfrjBww0ebvBwww83/HDDDzel56XneLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HDTet56jocbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83reet53i44Ycbfrjhhxt+uOGHGzzc4OEGDzf8cMMPN/xw03puXurg4YYfbvjhhh9u+OGGH27wcIOHGzzc8MMNP9zww03ruXmpg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83refmpQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3LSem5c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HDTem5e6uDhhh9u+OGGH2744YYfbvBwg4cbPNzwww0/3PDDzei5eamDhxs83ODhBg83/HCDh5txD8cPN3i4wcMNHm7wcPPHw+1/q++e4Y+H+7caq++eYT5OZubjZGY+Tmbm42RmPk5m5uNkZq6MK+PKuDKejCfjyXgynown48l4Mp6MJyNkhIyQETJCRsgIGSEj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D4eHO3i4g4c7eLiDhzt4uIOHO+U8L+d5Oc/LeV7O83IPV+7by317fX9XO+U8L7/by/d5+T4v93DlPC/neTnPy3lezvNyD1fu28t9e1175Twvv9vL93n5Pi/3cOU8L+d5Oc/LeV7O89Lzct+Ohzt4uIOHO3i4g4c7eLiDhzt4uFN6Xnpeeo6HO+Ue7vPD/a7slZ6XnuPhTvk+Lz0vPS89Lz3Hwx083MHDnXIP9/nh/r/S89Lz0nM83Cnf56Xnpeel56XneLiDhzt4uFPu4T4/3O/KXul56Tke7pTv89Lz0vPS89JzPNzBwx083CnneTnPS89Lz1vP8XCnneet563nreet53i4g4c7eLjT7uHafXvreet56zke7rTv89bz1vPW89ZzPNzBwx083Gn3cO2+vfW89bz1HA932vd563nreet56zke7uDhDh7utPO8neet563nred4uNPO89bz1vPW89ZzPNzBwx083Gn3cO2+vfW89bz1HA932vd563nreet56zke7uDhDh7utHu4dt/eet563nqOhzvt+7z1vPW89bz1HA938HAHD3faPVy7b289bz1vPcfDnfZ93nreet563nqOhzt4uIOHO+13e7tvbz1vPW89x8Od8bt99Hz0fPR89BwPd/BwBw93xj3cuG8fPR89Hz3Hw53xfT56Pno+ej56joc7eLiDhzvjHm7ct4+ej56PnuPhzvg+Hz0fPR89Hz3Hwx083MHDnXEPN+7bR89Hz0fP8XBn/G4fPR89Hz0fPcfDHTzcwcOdcQ837ttHz0fPR8/xcGd8n4+ej56Pno+e4+EOHu7g4c64hxv37aPno+ej53i4M77PR89Hz0fPR8/xcAcPd/BwZ9zDjfv20fPR89FzPNwZ3+ej56Pno+ej53i4g4c7eLgzvs/H9/no+ej56Dke7ox7uNHz1fPV89VzPNzBwx083Fn3cOu+ffV89Xz1HA931j3c6vnq+er56jke7uDhDh7urHu4dd++er56vnqOhzvrHm71fPV89Xz1HA938HAHD3fWPdy6b189Xz1fPcfDHTzcwcMdPNxZPcfDnXUPt77P8XAHD3fwcAcPd/54uP1v9d0z/PFw/1ZhlVZl1VZj9d1lLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5m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3s/nh/tdHatr9azCKq3Kqq2+jOs8v3p+9fzq+XWeX+f51fOr51fPr55fPb96fvX8Xhn3WYVVWpWVjCtDz6+eXz2/en71/Or51fP7ZLy2sld6fvX84+F+VzL0/Or51fOr51fPr55fPb/O8+s8v3p+9fzq+XWeX+f51fOr51fPr55fPb96fvX8lozyPvT86vnV84+H+/+qZej51fOr51fPr55fPb96/vnhflfeh55fPb96/vFwvysZen71/Or51fOr51fPr55/frjflfeh51fPr55/PNzvSoaePz1/ev70/On50/On58/v9s8P97saq2+vnp4/v9uf3+1Pz5+ePz1/ev70/On50/PPD/e7OlbX6lmFlYwrQ8+fnj89f3r+9Pzp+dPzzw/3u0ore6XnT88/Hu7/q5Ch50/Pn54/PX96/vT86fnnh/tdeR96/vT86fnzu/353f70/On50/On50/Pn54/Pf/8cL8r70PPn54/PX9+t39+uN+VDD1/ev70/On50/On558f7nflfej50/On58/v9s8P97uSoedPz5+ePz1/ev70/PPD/a68Dz1/ev70/Pnd/vnhflcy9Pzpeeh56Hnoeeh5+D4P3+eh56Hnoefhd/vnh/tdydDz0PPQ89Dz0PPQ888P97v63kfoeeh56Hn43f754X5XMvQ89Dz0PPQ89Dz0/PPD/a6elb3S89Dz8Lv988P9rmToeeh56Hnoeeh56Pnnh/tdeR96Hnoeeh5+t4eeh/M8nOeh5+F3e6QM3+eh56HnoefhPP/j4fa/1XfP8MfD/VuVVVuN1XfPEP1jdayu1bOS0TJaRstoGS1jZIyMkTEyRsbIGBkjY2SMjJWxMlbGylgZK2NlrAy/28P3efo+Tz1PPU89T+d5Os9Tz1PPU89Tzz8/3O9Khp6nnqeep55/frjflQw9Tz1PPU+/29P3eep56nnqeep56nnqeer554f7XR2ra/WswkqG7/PU89Tz1PPU89Tz1PPU888P97tKK3ul56nn6Xd7+j5PPf/8cL8rGc7z1PN0nqfzPPU83cOle7iPh/td2Su/29P3efo+T/dw6TxP53k6z9N5ns7zdA/3+eF+V/aq7ZXzPP1uT9/n6fs83cOl8zyd5+k8T+d5Os/TPdznh/td2auxV87z9Ls9fZ+n7/N0D5fO83Sep/M8nefpPC89L/ft5b794+F+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nes5Hu7g4Q4e7uDhTul56Tke7pSel56Xnpee4+EOHu7g4c7nh/tdydDz0vPSczzcKd/npeel56Xnped4uIOHO3i48/nhfldj9ay+fpSe4+FO+T4vPS89Lz0vPcfDHTzcwcOdzw/3uzpW9krPS8/xcKd8n5eef36435UM5zke7pTzvJzneLjz+eF+V/aq7ZXzHA938HAHD3fwcKec5+U8L+d5Oc/Lef754X5X3sfYq7FXzvPyu718n5fv888P97uS4Twv53k5z8t5/vnhflfex7NXz145z8vv9vJ9Xr7PPz/c70qG87yc5+U8L+d56fnnh/td2avv72oHD3fwcAcPd/BwBw938HCn9bz1vPUcD3faPdznh/tdhVValZUM3+et563nreet53i4g4c7eLjT7uE+P9zv6lqN1bOS4fu89bz1vPW89RwPd/BwBw932j3c54f7/0rPW89bz/Fwp32ft563nreet57j4Q4e7uDhTjvP23neet563nqOhzvtPG89bz1vPW89x8MdPNzBw512D9fX+9Dz1vPWczzcad/nreet563nred4uIOHO3i40+7h+nkfet563nqOhzvt+7z1vPW89bz1HA938HAHD3faed7O89bz1vPWczzcuc7zq+dXz6+eXz3Hwx083MHDnese7rpvv3p+9fzqOR7uXN/nV8+vnl89v3qOhzt4uIOHO9c93HXffvX86vnVczzcub7Pr55fPb96fvUcD3fwcAcPd657uOu+/er51fOr53i4c32fXz2/en71/Oo5Hu7g4Q4e7ly/26/79qvnV8+vnuPhzvW7/er51fOr51fP8XAHD3fwcOe6h7vu26+eXz2/eo6HO9f3+dXzq+dXz6+e4+EOHu7g4c51D3fdt189v3p+9RwPd67v86vnV8+vnl89x8MdPNzBw53rHu66b796fvX86jke7ly/26+ej56Pno+e4+EOHu7g4c64hxv37aPno+ej53i4M77PR89Hz0fPR8/xcAcPd/BwZ9zDjfv20fPR89FzPNwZ3+ej56Pno+ej53i4g4c7eLgz7uHGffvo+ej56Dke7ozv89Hz0fPR89FzPNzBwx083Bnf5+P7fPR89Hz0HA93xj3c6Pno+ej56Dke7uDhDh7ujHu4cd8+ej56PnqOhzvjHm70fPR89Hz0HA938HAHD3fGPdy4bx89Hz0fPcfDnXEP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0PPU89Tz9Lv988P9rmToeep56nnqeep56vnnh/tdjZV+6Hnqefrd/vnhflcy9Dz1PPU89Tz1PPX888P9ro5VWKVVWbV/e63G6lnJcJ6XnpfzvJznpeefH+53da3G6lnJ8H1evs8/Hu53JcN5Xs7zcp6X8/zzw/2uvvfx+eF+V/bKeV5+t5fv8/J9/vnhflcynOflPC/neTnPPz/c78r7KHtV9sp5Xn63l+/z8n3++eF+VzKc5+U8L+d5Oc9Lzz8/3O/KXrW9cp6Xnpfv8/J9/vFwvysZel56Xnpeev754X5X3oeel56Xnpff7eX7vPS89Lz0vPS89Lz0vPT888P9rrwPPS89Lz0vv9vL93npeel56Xnpeel56Xnp+eeH+11976P1vPW89bz9bm/f563nreet563nreet563n7Txv53nreet563k7z9t53nreet563nreet563nre7uE6xupZ2Ss9b7/b2/d563nreet563nreet563m7h+vyPvS89bz1vP1ub9/nreet563nreet563nreftPG/neet563nreTvP23neet563nreet563nreet7u4fp6H3reet563n63t+/z1vPW89bz1vPW89bz1vN2D/f54X5X9krPW8/b7/b2fd563nreet563nreet563u7hPj/c78pe6fnV8+t3+/V9fvX86vnV86vnV8+vnl89v363X/ftV8+vnl89v363X7/br55fPb96fvX86vnV86vn1z3cdd9+9fzq+dXz6/v8+j6/en71/Or51fOr51fPr55f93DXffvV86vnV8+v7/Pr+/zq+dXzq+dXz6+eXz2/en7dw1337VfPr55fPb9+t1+/26+eXz2/en71/Or51fOr59c93HXffvX86vnV8+t3+/V9fvX86vnV86vnV8+vnl89v+7hrvv2q+dXz6+eX7/br+/zq+dXz6+eXz2/en71/Or5dQ933bdfPb96fvX8+t0+vs9Hz0fPR89Hz0fPR89Hz8f3+fg+Hz0fPR89H7/bxz3c6Pno+ej56Pno+ej56Pm4hxv37aPno+ej5+N3+7iHGz0fPR89Hz0fPR89Hz0f93Djvn30fPR89Hz8bh/3cKPno+ej56Pno+ej56Pn4x5u3LePno+ej56P3+2j5+M8H+f56Pn43T7u4cb3+ej56Pno+TjP/3i4/W/13TP88XD/rebH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5X1e3uel56Xnpeel56Xnpeel56Xnpeel5+W8vZy3l56Xnpeel9/t5fu89Lz0vPS89Lz0vPS89Lyct5fz9tLz0vPS8/K7vXyfl56Xnpeet563nreet5638/Z23t563nreet5+t7fv89bzdt7e3uftfd563t7n7X3eet7O4do5XPu7Wnuft9/t7fu8fZ+3c7j2Pm/v8/Y+b+/z9j5v53DtvL2dt7e/q7X3efvd3r7P2/d5O4dr7/P2Pm/v8/Y+b+/zdg7XztvbeXv7u1p7n7ff7e37vH2ft3O49j5v7/P2Pm/v8/Y+bz1v5+3tvL39Xa29z1vP2/d5+z5v53Ct563nreet563n7Ryu/V2t9bz1vPW8/W5v3+et563nreet563nreet5+0crv1drfW89bz1vP1ub9/nreet563nreet56Pno+fjHG78XW30fPR89Hz8bh/f56Pno+ej56Pno+ej56Pn430+3uej56Pno+fjfT7e56Pno+ej56Pno+ej56Pn4xxunLePno+ej56P3+3j+3z0fPR89Hz0fPR89Hz0fJzDjfP20fPR89Hz8bt9fJ+Pno+ej56Pno+ej56Pno/3+Xifj56Pno+ej/f5eJ+Pno+ej56Pno+ej56Pno9zuHHePno+ej56Pn63j+/z0fPR89Hz0fPR89Hz0fNxDjfO20fPR89Hz8fv9vF9Pno+ej56Pno+ej56Pnq+zuHWefvq+er56vn63b6+z1fPV89Xz1fPV89Xz1fP1+/2dd6+er56vnq+frev3+2r56vnq+er56vnq+er5+scbp23r56vnq+er+/z9X2+er56vnq+er56vnq+er7O4dZ5++r56vnq+fo+X9/nq+er56vnq+er56vnq+frHG6dt6+er56vnq/f7et3++r56vnq+er56vnq+er5Oodb5+2r56vnq+frd/v6Pl89Xz1fPV89Xz1fPV89X+dw67x99Xz1fPV8/W5f3+er56vnq+er56vnq+er5+sc7vPD/f+E7Ov5+fP1/Hz7Un/Tv4zz+eF+U5rK1KYx7Td9PT94uPP54X7TM4UpTWWScWQcGVfGlfH1/ODhDh7u4OHO54f7TW0ak3v13Ksn48l4Mp6MJ+O5V891PNfxXEfICM8j3Ktwr8K9ChkhI2SEjJCR7lW6jnQd6TpSRnoe6V6le5XuVcoo11Guo1xHySgZJaNk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noff7dEyfJ+Hnoeeh56H9/lfHu7v+ctfHi7+m47pmp4pTGkqU5vG9J1lxMpYGStjZayMlbEyVsbK2C8j//wxHdM1PVOY0lSmNo1JxpFxZBwZR4bf7en7PH2fp56nnqeep/d5ep+nnqeep56nnqeep56nnqeep56nnn9+uN8kQ89Tz1PP0+/29H2eep56nnqeep56nnqeev754X5Tm8b09SP1PP1uT9/nqeep56nnqeep56nnqeefH+43HZN7peep5+l3e/o+Tz3//HC/SYb3eep5ep+n93nqeTqHS+dwHw/3m9wrv9vT93n6Pk/ncOl9nt7n6X2e3ufpfZ7O4T4/3P+nda/WvfI+T7/b0/d5+j5P53DpfZ7e5+l9Xt7n5X1ezuHKeXs5b68/aSpT+2/HJMM5XHmfl/d5eZ+X93l5n5eel/P2ct7+8XD/n7zPS8/L93n5Pi/ncKXnpeel56XnpeflHO7zw/0m90rPS8/L7/byfV56Xnpeel56Xnpeel56Xs7hPj/cb3Kv9Lz0vPxuL9/npeel56Xnpeel56XnpeflHO7zw/1/0vPS89Lz8ru9fJ+Xnpeel56Xnpeel56Xnpf3eXmfl56Xnpeel/d5eZ+Xnpeel56Xnpeel56XnpdzuHLeXnpeel56Xn63l+/z0vPS89Lz0vPS89Lz0vN2DtfO21vPW89bz9vv9vZ93nreet563nreet563nre3uftfd563nreet7e5+193nreet563nreet563nrezuHaeXvreet563n73d6+z1vPW89bz1vPW89bz1vP2zlcO29vPW89bz1vv9vb93nreet563nreet563nreTuHa+ftreet563n7Xd7+z5vPW89bz1vPW89bz1vPW+/29t5e+t563nrefvd3n63t563nreet563nreet563c7h23t563nreet6+z9v3eet563nreet563nreet5O4dr5+2j56Pno+fj+3x8n4+ej56Pno+ej56Pno+ej3O4cd4+ej56Pno+freP3+2j56Pno+ej56Pno+ej5+Mcbpy3j56Pno+ej9/t4/t89Hz0fPR89Hz0fPR89Hycw43z9tHz0fPR8/G7fXyfj56Pno+ej56Pno+ej56Pc7hx3j56Pno+ej5+t4/v89Hz0fPR89Hz0fPR89Hz8X0+vs9Hz0fPR8/H7/ZxDjd6Pno+ej56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+03ulZ6nnqff7en7PPU89Tz1PPU89Tz1PPU8ncN9frjf5F7peep5+t2evs9Tz1PPU89Tz1PPU89Tz9P3efo+Tz1PPU89T7/b0zlc6nnqeep56nnqeep56nk6h/v8cL/JvdLz1PP0u72cw5Wel56Xnpeel56Xnpeel3O4ct5eel56XnpefreXc7jS89Lz0vPS89Lz0vPS83IOV87bS89Lz0vPy+/20vPyPi/v89Lz8ru9nMOV7/PS89Lz0vPyPv/Lw/09f/nLw8V/0zFd0zOFKU1latOYvrOMShkpI2WkjJSRMlJGykgZKaNklIySUTJKRskoGSWjZJSMltEyWkbL8Lu9fJ+X7/PS89Lz0vPyPi/v89Lz0vPS89Lz0vPS89Lz0vPS89Lzct5ezttLz0vPS8/L7/byfV563nreet563nreet563s7b23l763nreet5+93evs9bz1vPW89bz1vPW89bz9t5eztvbz1vPW89b7/b2/d563k7b2/v8/Y+bz1v7/P2Pm89b+dw7Ryu/V2tvc/b7/b2fd6+z9s5XHuft/d5e5+393l7n7dzuHbe3s7b29/V2vu8/W5v3+ft+7ydw7X3eXuft/d5e5+393k7h2vn7e28vf1drb3P2+/29n3evs/bOVx7n7f3eXuft/d5e5+3nrfz9nbe3v6u1t7nreft+7x9n7dzuNbz1vPW89bz1vN2Dtf+rtZ63nreet5+t7fv89bz1vPW89Hz0fPR89HzcQ43/q42ej56Pno+freP7/PR89Hz0fPR89Hz0fPR83EON/6uNno+ej56Pn63j+/z0fPR89Hz0fPR89Hz0fPxPh/v89Hz0fPR8/E+H+/z0fPR89Hz0fPR89Hz0fNxDjfO20fPR89Hz8fv9vF9Pno+ej56Pno+ej56Pno+zuHGefvo+ej56Pn43T6+z0fPR89Hz0fPR89Hz0fPx/t8vM9Hz0fPR8/H+3y8z0fPR89Hz0fPR89Hz0fPxzncOG8fPR89Hz0fv9vH9/no+ej56Pno+ej56vnq+TqHW+ftq+er56vn63f7+j5fPV89Xz1fPV89Xz1fPV/ncOu8ffV89Xz1fP1uX9/nq+er56vnq+er56vnq+frd/s6b189Xz1fPV+/29fv9tXz1fPV89Xz1fPV89XzdQ63zttXz1fPV8/X9/n6Pl89Xz1fPV89Xz1fPV89X+dw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ep56nnqOhzt4uIOHO+kcLp23l56Xnpee4+FO+T4vPS89Lz0vPcfDHTzcwcOdcg5XzttLz0vPS8/xcKd8n5eel56Xnpee4+EOHu7g4U55n5f3eel56XnpOR7ulPd56Xnpeel56Tke7uDhDh7ulHO4ct5eel56XnqOhzvl+7z0vPS89Lz0HA938HAHD3fKOVw5by89Lz0vPcfDnfJ9Xnpeel56XnqOhzt4uIOHO+Ucrpy3l56Xnpee4+FO+T4vPS89Lz0vPcfDHTzcwcOd8ru9nLeXnpeel57j4U753V56Xnpeel56joc7eLiDhzvlHK6ct5eel563nuPhTvs+bz1vPW89bz3Hwx083MHDnXYO187bW89bz1vP8XCnfZ+3nreet563nuPhDh7u4OFOO4dr5+2t563nred4uNN+t7eet563nree4+EOHu7g4U47h2vn7a3nreet53i4077PW89bz1vPW8/xcAcPd/Bwp53DtfP21vPW89ZzPNxp3+et563nreet53i4g4c7eLjTzuHaeXvreet56zke7rTv89bz1vPW89ZzPNzBwx083Gnf5+37vPW89bz1HA932jlc63nreet56zke7uDhDh7utHO4dt7eet563nqOhzvjHG70fPR89Hz0HA938HAHD3fGOdw4bx89Hz0fPcfDnXEON3o+ej56PnqOhzt4uIOHO+Mcbpy3j56Pno+e4+EOHu7g4Q4e7oye4+HOOIcb3+d4uIOHO3i4g4c7f3m4v+cvf3m4+G86pmt6pjClqUxtGtN3ljEpI2WkjJSRMlJGykgZKSNllIySUTJKRskoGSWjZJSMktEyWkbLaBl+t4/v8/F9joc7eLiDhzt4uIOHO6Pno+d4uDN6Pno+ej56joc7eLiDhzvjvH2ct4+ej56PnuPhzvg+Hz1fPV89Xz3Hwx083MHDnXXevs7bV89Xz1fP8XBnfZ+vnq+er56vnuPhDh7u4OHOOm9f5+2r56vnq+d4uLO+z1fP13n7ep+v9zke7qz3+Xqf4+HOOofDwx083MHD/Y+oc0lyZFeW5JYq/Avf/8a6X95D1RlGZRJguTESVFF88HAfPNwHD/fBw33H9/nxfX58nx/f58f3+XEOd5y3H+ftx+9qx/f58d5+/H1+/H1+nMMd3+fH9/nxfX58nx/f58c53HHefpy3H7+rHd/nx3v78ff58ff5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85LyvOSHNf4tTfO9pHwvKd9LyveSn+zvb+nnNu7kuJO+l5R/45TnJeV5yU/697c0zfeS8r2kfC8p30t+6r+/pZ/bupPrTvpeUv6NU56XlOclPwXg39I030vK95LyvaR8Lym75GcC/L/luZPnTvpeUnZJeV5Snpf8AMi/pWl2SdklbZe0XdKevf68gH/Lctkux+X6LzyXptklbZe0XdJ2SdslbZe0Z68/S+Df8rlkJ9suaf/Gac9L2i5pu6TtkrZL2i5pu6Ttkvbs9ecM/Fu6k3ZJ2yXt3zjteUnbJW2XtF3SdknbJW2XtF3Svpe07yVtl7Rd0nZJ+17Svpe0XdJ2SdslbZe0XdJ2Sdsl7dlrt5+bXdJ2Sdsl7d847XlJ2yVtl7Rd0nZJ2yVtl7Rd0p699vq52SVtl7Rd0v6N056XtF3SdknbJW2XtF3SdknbJe17Sfte0nZJ2yVtl7TvJe17SdslbZe0XdJ2SdslbZe0XTKevY6/44xdMnbJ2CXj3zjjecnYJWOXjF0ydsnYJWOXjF0ynr2Ov+OMXTJ2ydgl498443nJ2CVjl4xdMnbJ2CVjl4xdMp69jr/jjF0ydsnYJePfOON5ydglY5eMXTJ2ydglY5eMXTL+jTP+jjN2ydglY5eMf+OMf+OMXTJ2ydglY5eMXTJ2ydgl49nr+DvO2CVjl4xdMp6XjOclY5eMXTJ2ydglY5eMXTJ2yXj2Ov6OM3bJ2CVjl4znJeN5ydglY5eMXTJ2ydglY5eMXTKevY6/44xdMnbJ2CXj3zjj3zhjl4xdMnbJ2CVjl4xdMnbJePY6/o6zdsnaJWuXrH/jrOcla5esXbJ2ydola5esXbJ2yXr2uv6Os3bJ2iVrl6x/46znJWuXrF2ydsnaJWuXrF2ydsl69rr+jrN2ydola5esf+Os5yVrl6xdsnbJ2iVrl6xdsnbJel6ynpesXbJ2ydol698469nr2iVrl6xdsnbJ2iVrl6xdsp69rr/jrF2ydsnaJevfOOvZ69ola5esXbJ2ydola5esXbKeva6/46xdsnbJ2iXr3zjr2evaJWuXrF2ydsnaJWuXrF2ynr2uv+OsXbJ2ydol6984a5es7yXre8naJevfOOvZ63pesnbJ2iVrl6zvJX+86P/Oz/6A0fpv+bkMl+myXLbLcbkun0tOnt5n2mfaZ9pn2mfaZ9pn2mfaZ9pnWpgWpoVpYVqYFqaFaWFamBampWlpWpqWpvk3zvO85Hle8uySZ5c8u+T5XvJ8L3l2ybNLnl3y7JJnlzy75Nklzy55dsmzS56/4zx/x3l2ybNLnl3y/BvneV7y7JJnlzy75Nklzy55dsmzS56/4zx/x3l2ybNLnl3y/BvneV7y7JJnlzy75Nklzy55dsmzS56/4zx/x3l2ybNLnl3y/BvneV7y7JLn7zjP95Lne8mzS57vJc/3kmeXPM9en2evz9+En+8lz79xzvOS87zkPHs930vO95LzveR8LznfS86z1/N3nPN3nPM34fO95Pwb5zwvOc9LzrPX873kfC8530vO95LzveQ8ez1/xzl/xzl/Ez7fS86/cc7zkvO85Dx7Pd9LzveS873kfC8530vOLjl/xzl/xzl/Ez7fS84uOc9LzvOS8+z17JKzS84uObvk7JLz7PX8TfjskrNLzi45/8Y5z0vOLjm75OySs0vOLjm75OyS8+z1/E347JKzS84uOf/GOc9Lzi45u+TskrNLzi45u+TskvPs9fxN+OySs0vOLjn/xjnPS84uObvk7JKzS84uObvk7JLzveR8Lzm75OySs0vO95LzveToku8fXfL9o0u+f3TJJ/f6yb1+cq/fP85ev3/8jvP9o0u+f3TJ948u+eRev3+faZ9pn2mfaXTJJ/f6yb1+cq/fvzCN33G+f3TJ948u+f7RJZ/c6/cvTAvTwrQwLd3J9NnSZ0ufLU3jveT7l+5kupPpTqZpZVqZVqaVaeVOls9WPlv5bGVa+bm1O9nuZLuTbVqb1qa1aW1au5Pts43PNj7bmDZ+buNOjjs57uSYNqaNaWvamrbu5Pps67Otz7amrZ/bupPrTj538pn2THumPdOeac+dfD7b89mez3amnZ/buZPnTp47eaadaWfamWaXfHaJ3Osn9/rJvX4fZ6/fx+8432eXfHbJZ5fIvX7fZ5pd8tkln13y2SVyr5/c6yf3+n2fafyO8312yWeXfHaJ3Ov3hWl2yWeXfHbJZ5fIvX5yr5/c6/elafyO8312yWeXfHaJ3Ov3pWl2yWeXfHbJZ5fIvX5yr5/c6/eVaeXnZpd8dslnl8i9fl+bZpd8dslnl3x2idzrJ/f6yb1+35g2fm52yWeXfHaJ3Ov3jWl2yWeXfHbJZ5fIvX5yr5/c6/etaevnZpd8dslnl8i9ft8zzS757JLPLvnsErnXT+71k3v9vmfa83OzSz675LNL5F6/70yzSz675LNLPrtE7vWTe/3kXr/g7PULfsf5wi4JuyTsErnXLzh7/cIuCbsk7JKwS+ReP7nXT+71i880fsf5wi4JuyTsErnXL8I0uyTskrBLwi6Re/3kXj+51y/SNH7H+cIuCbsk7BK510/u9ZN7/eRev7BL5F6/KNPKNLtE7vWTe/3kXr8/7vX+W/7Ogr4/7vW/Zf9z+bkMl+myXLbLcbkuTWvTxrQxbUwb08a0MW1MG9PGtDFtTVvT1rQ1bU1b09a0NW1NW9Oeac+05+f2/F/y/F9il8i9fnKvn9zrJ/f6hV0Sdonc6xd2SdglYZeEXSL3+sm9fnKvX/I7zpf8jvOlXZJ2Sdolcq9fcl7ypV2SdknaJWmXyL1+cq+f3OuXn2n8jvOlXZJ2Sdolcq9fhml2SdolaZekXSL3+sm9fnKvX4Zp/I7zpV2SdknaJXKvX6Zpdkmmab6XpO8lcq9f+l6SvpfIvX5Zfm7lTpY76XuJ3Osn9/rJvX5yr1/6XpK+l6TvJel7Sfpekm1a+7m1O9nupO8l6d84OaaNaWOa7yXpe0n6XpK+l6TvJbmmrZ/bupPrTvpekv6Nk2vamram+V6Svpek7yXpe0n6XpJ2ST4/t+dOPnfS9xK510/u9ZN7/eReP7nXL+2StEvSLpF7/fJM4zfhr+ySskvKLpF7/crzkrJLyi4pu6TsErnXT+71k3v96jON34S/skvKLim7RO71K89Lyi4pu6TskrJL5F4/uddP7vWrMI3fhL+yS8ouKbtE7vUrz0vKLim7pOySskvkXj+510/u9SvfS8r3krJLyi4pu0Tu9SvfS8ouKbuk7JKyS+ReP7nXT+71qzat/dzskrJLyi6Re/3K85KyS8ouKbuk7BK510/u9ZN7/WpMGz83u6TskrJL5F6/8ryk7JKyS8ouKbtE7vWTe/3kXr/yvaR8Lym7pOySskvkXr/yvaTskrJLyi4pu0Tu9ZN7/eRevzrTzs/NLim7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+51689e21+x/naLmm7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+51689e21+x/naLmm7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+516/9G6fTz80uabuk7RK516/9G6ftkrZL2i5pu0Tu9ZN7/eRev/bstdvPzS5pu6TtErnXrz0vabuk7ZK2S9oukXv95F4/udevPXvt8XOzS9ouabtE7vVrz0vaLmm7pO2StkvkXj+510/u9WvPXvv5udklbZe0XSL3+rV/47Rd0nZJ2yVtl8i9fnKvn9zr15699vm52SVtl7RdIvf6jeclY5eMXTJ2ydglcq+f3Osn9/qNZ6/j7zhjl4xdMnaJ3Os3npeMXTJ2ydglY5fIvX5yr5/c6zeevY6/44xdMnbJ2CVyr994XjJ2ydglY5eMXSL3+sm9fnKv33heMp6XjF0ydsnYJXKv33j2OnbJ2CVjl4xdIvf6yb1+cq/fePY6/o4zdsnYJWOXyL1+49nr2CVjl4xdMnaJ3Osn9/rJvX7j2ev4O87YJWOXjF0i9/qNZ69jl4xdMnbJ2CVyr5/c6yf3+o1nr+PvOGOXjF0ydonc6yf3+sm9fnKv39glcq/fePY6npfIvX5yr5/c6yf3+v1xr/ffkrOgP+71t3wuOQtaWLVvYdW+hVX7FlbtW1i1b2HVvoVV+xZW7VtYtW//mfaZ9pn2mfaZ9pn2mfaZ9pn2mfaZFqaFaWFamBamhWlhWpgWpoVp/o2znpes5yVyr5/c6yf3+sm9fnKv39ola5fIvX5rl6xdsnbJ2iVyr5/c6yf3+q2/46y/46xdsnbJ2iVyr996XrJ2ydola5esXSL3+sm9fnKv3/o7zvo7ztola5esXSL3+q3nJWuXrF2ydsnaJXKvn9zrJ/f6rb/jrL/jrF2ydsnaJXKv33pesnbJ+jvO+l6yvpfIvX7re8n6XiL3+q1nr3Kvn9zrJ/f6yb1+cq+f3Osn9/qt7yXP95Lne8nzveT5XvI8e33+jvP8Hef5m/DzveT5N87zvOR5XvI8e32+lzzfS57vJc/3kud7yfPs9fk7zvN3nOdvws/3kuffOM/zkud5yfPs9fle8nwveb6XPN9Lnu8lzy55/o4j9/rJvX5yr5/c6yf3+sm9fnKvn9zr9+ySZ5c8u0Tu9XuevT5/E352ybNLnl0i9/o9z0ueXfLskmeXPLtE7vWTe/3kXr/n2evzN+Fnlzy75Nklcq/f87zk2SXPLnl2ybNL5F4/uddP7vV7nr0+fxN+dsmzS55dIvf6Pc9Lnl3y7JJnlzy7RO71k3v95F6/53vJ873k2SXPLnl2idzr93wveXbJs0ueXfLsErnXT+71k3v9zrPX83ecs0vOLjm7RO71O89Lzi45u+TskrNL5F4/uddP7vU7z17P33HOLjm75OwSudfvPC85u+TskrNLzi6Re/3kXj+51+98LznfS84uObvk7BK51+98Lzm75OySs0vOLpF7/eReP7nX7zx7PX/HObvk7JKzS+Rev/O85OySs0vOLjm7RO71k3v95F6/8+z1/B3n7JKzS84ukXv9zvOSs0vOLjm75OwSuddP7vWTe/3Os9fzd5yzS84uObtE7vU7z0vOLjm75OySs0vkXj+510/u9Tv/xjl/xzm75OySs0vkXr/zb5yzS84uObvk7BK510/u9ZN7DX2voe819L3GP7ok/tElIfca+l5D32voew19r6HvNeReQ+415F5D32voew19r/GPLol/dEnIvYa+19D3GvpeQ99r6HsNudeQew2519D3GvpeQ99r/Et3Mt3JNC1NS9PStDQt3cn02cpnK5+tTCs/t3Iny50sd7JMK9PKtDatTWt3sn229tnaZ2vT2s+t3cl2J8edHNPGtDFtTBvTxp0cn218tvHZ1rT1c1t3ct3JdSfXtDVtTVvT1rTnTj6f7flsz2d7pj0/t+dOPnfyuZPPtDPtTDvTzrRzJ89nO5/tfLYzjd9x4rNLPrvks0vkXkPfa+h7DX2voe819L2G3GvIvYbca+h7DX2voe81Prvks0vkXkPfa+h7DX2voe819L2G3GvIvYbca+h7DX2voe81Prvks0vkXkPuNeReQ+419L2G3Gt8aVqaZpfIvYbca8i9xh/3ev8tf2dB8ce9/pbjcl0+l8cSVi0+WLX4YNXig1WLr01r09q0Nq1Na9PGtDFtTBvTxrQxbUwb08a0MW1NW9PWtDVtTVvT1rQ1bf3c1v8lz/8ldonca8i9htxryL3GZ5d8donca+h7DX2voe819L2G3GvIvYbca+h7DX2voe81Prsk7BK519D3GvpeQ99r6HsNfa8h9xpyryH3GvpeQ99r6HuNsEvCLpF7DX2voe819L2GvtfQ9xpyryH3GnKvoe819L2GvtcIuyTsErnX0Pca+l5D32voew19ryH3GuF7SfheIvca+l5D7jXkXkPuNeReQ+415F5D7jX0vYa+19D3GuF7Sfheou819L2GvteIdid9L9H3GvpeQ99r6HsNfa+h7zX0vUb4XhK+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r6nvNfW9ptxryr2m3Gvqe019r6nvNdMuSbtE7jX1vaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpeM+2StEvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe810y5Ju0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7JKyS+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXLLim7RO419b2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XrPskrJL5F5T32vqe019r6nvNfW9ptxryr2m3Gvqe019r6nvNcsuKbtE7jX1vaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpes+ySskvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe81yy4pu0TuNeVeU+415V5T32vKvWY90zwvkXtNudeUe0251/zjXu+/JWdBf9zrf8v75/JzGS7TZblsl+NyXZoGq5YNq5YNq5YNq5YNq5YNq5YNq5YNq5YNq5YNq5b9z7TPtM+0z7TPtM+0z7TPtM+0z7TPtDAtTPNvnPa8RN9ryr2m3GvKvabca8q9ZtslbZfIvaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpes+2StkvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe812y5pu0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7ZK2S+ReU99r6ntNfa+p7zX1vabca7bvJe17idxr6ntNudeUe02515R7TbnXlHtNudfU95r6XlPfa7bvJe17ib7X1Pea+l6z+U04x/cSfa+p7zX1vaa+19T3mvpeU99rju8l43uJvtfU95r6XnP4TTjH9xJ9r6nvNfW9pr7X1Pea+l5T32uO7yXje4m+19T3mnKvKfeacq8p95pyryn3mnKvKfea+l5T32uOXSL3mvpeU99r6nvNsUvGLpF7TX2vqe819b2mvtfU95pyryn3mnKvqe819b2mvtccu2TsErnX1Pea+l5T32vqe019ryn3mnKvKfea+l5T32vqe82xS8YukXtNfa+p7zX1vaa+19T3mnKvKfeacq+p7zX1vaa+1xy7RN9ryr3m+F6i7zXHLhm7ZOwSudeUe0251xzPXsffccYuGbtk7BK511zPS9YuWbtk7ZK1S+ReU+415V5zPXtdf8dZu2TtkrVL5F5zPS9Zu2TtkrVL1i6Re02515R7zfW9ZH0vWbtk7ZK1S+Rec30vWbtk7ZK1S9YukXtNudeUe8317HX9HUffa+p7TX2vKfea+l5T32vqe019r6nvNeVeU+415V5T32vqe019r7l2ydolcq+p7zX1vaa+19T3mvpeU+415V5T7jX1vaa+19T3mmuXrF0i95r6XlPfa+p7TX2vqe815V5T7jXlXlPfa+p7TX2vuXbJ2iVyr6nvNfW9pr7X1Pea+l5T7jXlXlPuNfW9pr7X1Peaa5esXSL3mvpeU99r6ntNfa+p7zXlXlPuNeVeU99r6ntNfa/57JJnl8i9pr7X1Pea+l5T32vqe02515R7TbnX1Pea+l5T32s+u+TZJXKvqe819b2mvtfU95r6XlPuNeVeU+419b2mvtfU95rPLnl2idxr6ntNfa+p7zX1vaa+15R7TbnXlHtNfa+p7zX1veazS55dIvea+l5T32vqe019r6nvNeVeU+415V5T32vqe019r/nskmeXyL2mvtfU95r6XlPfa+p7TbnXlHtNudfU95r6XlPfaz675Nklcq+p7zX1vaa+19T3mvpeU+415V5T7jX1vaa+19T3ms8ueXaJ3Gvqe019r6nvNfW9pr7XlHtNudeUe019r6nvNfW95tklZ5fIvaa+19T3mvpeU99r6ntNudeUe02519T3mvpeU99rnl1ydonca8q9ptxryr2mvteUe83z7FXfa8q9ptxryr2m3Gv+ca/335KzoD/u9bd8LjkLOlm1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVk3vN87xE32vKvabca8q9ptxryr3m2SVnl8i9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l7z7JKzS+ReU99r6ntNfa+p7zX1vabca8m9ltxr6Xstfa+l77X+0SX1jy4pudfS91r6Xkvfa+l7LX2vJfdacq8l91r6Xkvfa+l7rX90Sf2jS0rutfS9lr7X0vda+l5L32vJvda/8NnCZ0vTOHstudeSey2515J7LbnXknstudfS91r6Xkvfa/0rn618tjKt/NzKnSx3stzJMq1Na9PatDat3cn22dpna5+tTWs/t3Enx50cd3JMG9PGtDFtTBt3cny29dnWZ1vT1s9t3cl1J9edXNPWtDXtmfZMe+7k89mez/Z8tmfa83N77uRzJ8+dPNPOtDPtTDvTzp08n+18NrtE32vpe63PLvnsks8ukXstfa+l77X0vZa+19L3WnKvJfdacq+l77X0vZa+1/rsks8ukXstfa+l77X0vZa+19L3WnKvJfdacq+l77X0vZa+1/rsEn2vJfdaX5pml3x2yWeXfHaJ3GvJvZbca31lWvm52SWfXfLZJXKv9ZVpdslnl3x2yWeXyL2W3GvJvdbXprWfm13y2SWfXSL3Wt+YZpd8dslnl3x2idxryb2W3Gt9a9r6udkln13y2SVyr/WtaXbJZ5d8dslnl8i9ltxryb3W90x7fm52ib7X0vdacq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmGXhF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vFXZJ2CVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaYZeEXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa8VdknYJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91phl4RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19rxV2Sdglcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmGXhF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vFXZJ2iVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaaZekXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa+VdknaJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91ppl6RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19r5V2Sdolcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmmXpF0i91pyryX3WnKvpe+15F4r17Q1zS6Rey2515J7rT/u9f5b/s6C6o97/S3H5bp8Lo8lrFolrFolrFolrFrlmXamnWln2pkGq1YFq1YFq1YFq1YFq1YFq1YFq1YFq1YFq1YFq1b1z7TPtM+0z7TPtM+0z7TPtM80/8Ypz0v0vZbca8m9ltxryb2W3GuVXVJ2idxr6Xstfa+l77X0vZbca8m9ltxr6Xstfa+l77XKLim7RO619L2WvtfS91r6Xkvfa8m9ltxryb2WvtfS91r6XqvskrJL5F5L32vpey19r6XvtfS9ltxryb2W3Gvpey19r6XvtcouKbtE7rX0vZa+19L3WvpeS99ryb1W+V5SvpfIvZa+15J7LbnXknstudeSey2515J7LX2vpe+19L1W+V5Svpfoey19r6XvtercSd9L9L2WvtfS91r6Xkvfa+l7LX2v1b6XtO8l+l5L32vpe63mN+Fq30v0vZa+19L3WvpeS99r6Xstfa/Vvpe07yX6Xkvfa8m9ltxryb2W3GvJvZbca8m9ltxr6Xstfa/Vdonca+l7LX2vpe+12i5pu0TutfS9lr7X0vda+l5L32vJvZbca8m9lr7X0vda+l6r7ZK2S+ReS99r6Xstfa+l77X0vZbca8m9ltxr6Xstfa+l77XaLmm7RO619L2WvtfS91r6Xkvfa8m9ltxryb2WvtfS91r6XqvtEn2vJfda7XuJvtdqu6TtkrZL5F5L7rXkXqs9e+3zc7NL2i5pu0TutdrzkrZL2i5pu2TsErnXknstudcaz17H33HGLhm7ZOwSudcaz0vGLhm7ZOySsUvkXkvuteRea3wvGd9Lxi4Zu2TsErnXGt9Lxi4Zu2TskrFL5F5L7rXkXms8ex1/x9H3WvpeS99ryb2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa41dMnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91tglY5fIvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rjV0ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2CVjl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32utXbJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbaJWuXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa61dsnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91tola5fIvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rrV2ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2iVrl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32utXbJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdazS55dIvda+l5L32vpey19r6XvteReS+615F5L32vpey19r/XskmeXyL2W3GvJvZbca+l7LbnXep696nstudeSey2515J7rT/u9f5bchb0x73+luWyXY7LdflccvL0YNXqwarVK9PKtDKtTCvTyrQyrUxr09q0Nq1Na9PatDatTWvT2rQxbUwb08a0MW1M82+c53mJvteSey2515J7LbnXknutZ5c8u0TutfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdazy55donca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2SVnl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32udXXJ2idxr6Xstfa+l77X0vZa+15J7rfO95HwvkXstfa8l91pyryX3WnKvJfdacq8l91r6Xkvfa+l7rfO95Hwv0fda+l5L32udvwmf7yX6Xkvfa+l7LX2vpe+19L2Wvtc630vO9xJ9r6XvtfS91vmb8Pleou+19L2WvtfS91r6Xkvfa+l7rfO95Hwv0fda+l5L7rXkXkvuteReS+615F5L7rXkXkvfa+l7rbNL5F5L32vpey19r3V2ydklcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WkeX9D+6pOVeW99r63ttfa+t77X1vbbca8u9ttxr63ttfa+t77X/0SX9jy5pudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77X90Set7bbnX/pempWlpWpqW7mT6bOmzpc+WpqWfW7mT5U6WO1mmlWllWplWppU7WT5b+2zts7Vp7efW7mS7k+1OtmltWps2po1p406OzzY+2/hsY9r4uY07Oe7kupNr2pq2pq1pa9q6k+uzrc+2Ptsz7fm5PXfyuZPPnXymPdOeac+0Z9q5k+eznc92PtuZdn5u506eO3nuJH/jtL7X1vfa+l77s0s+u0TuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99qfXfLZJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99phl4RdIvfa+l5b32vre219r63vteVeW+615V5b32vre219rx12Sdglcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32mGXhF0i99r6Xlvfa+t7bX2vre+15V5b7rXlXlvfa+t7bX2vHXZJ2CVyr63vtfW9tr7X1vfa+l5b7rXlXlvutfW9tr7X1vfaYZeEXSL32nKvLffacq+t77XlXjvWtDXNLpF7bbnXlnvtP+71/rd8v7Og/uNef8twmS7LZbscl+vyuTyWZ9qZdqadaWfamXamnWlnGqxaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xaJ6xa5z/TPtM+0z7TPtP8Gyc5L2l9ry332nKvLffacq8t99ppl6RdIvfa+l5b32vre219ry332nKvLffa+l5b32vre+20S9IukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1067JO0SudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bRL0i6Re219r63vtfW9tr7X1vfacq+dvpek7yVyr63vteVeW+615V5b7rXlXlvuteVeW99r63ttfa+dvpek7yX6Xlvfa+t77Tx30vcSfa+t77X1vba+19b32vpeW99rl+8l5XuJvtfW99r6Xrv4TbjL9xJ9r63vtfW9tr7X1vfa+l5b32uX7yXle4m+19b32nKvLffacq8t99pyry332nKvLffa+l5b32uXXSL32vpeW99r63vtskvKLpF7bX2vre+19b22vtfW99pyry332nKvre+19b22vtcuu6TsErnX1vfa+l5b32vre219ry332nKvLffa+l5b32vre+2yS8oukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1y67RN9ry712+V6i77XLLim7pOwSudeWe225165n2vNzs0vKLim7RO61y/OSskvKLim7pOwSudeWe225127PXpvfcbrtkrZL2i6Re+32vKTtkrZL2i5pu0TuteVeW+612/eS9r2k7ZK2S9oukXvt9r2k7ZK2S9ouabtE7rXlXlvutduz1+Z3nNb32vpeW99ry722vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa7dd0naJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW9dtslbZfIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rt13Sdonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b122yVtl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32uPXTJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfbYJWOXyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa49dMnaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99tglY5fIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rj10ydonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b322CVjl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32uPXTJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfbYJWuXyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa69dsnaJ3GvLvbbca8u9tr7Xlnvt9exV32vLvbbca8u9ttxr/3Gv99+Ss6A/7vW/Zf5z+bkMl+myXLbLcbkuTUvTyrQyrUwr08q0Mq1MK9PKtDKtTWvT2rQ2rU1r09q0Nq1Na9PGtDHNv3HW8xJ9ry332nKvLffacq8t99prl6xdIvfa+l5b32vre219ry332nKvLffa+l5b32vre+21S9YukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1167ZO0SudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77WeXPLtE7rX1vba+19b32vpeW99ry732873k+V4i99r6XlvuteVeW+615V5b7rXlXlvutfW9tr7X1vfaz/eS53uJvtfW99r6Xvv5m/DzvUTfa+t7bX2vre+19b22vtfW99rP95Lne4m+19b32vpe+/mb8PO9RN9r63ttfa+t77X1vba+19b32s/3kud7ib7X1vfacq8t99pyry332nKvLffacq8t99r6Xlvfaz+7RO619b22vtfW99rPLnl2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfazS55dIvfa+l5b32vre219r63vteVeW+615V5b32vre219r312ydklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32meX6Httudc+30v0vfbZJWeXnF0i99pyry332ufZ6/k7ztklZ5ecXSL32ud5ydklZ5ecXXJ2idxry7223GufZ6/n7zhnl5xdcnaJ3Guf5yVnl5xdcnbJ2SVyry332nKvfb6XnO8lZ5ecXXJ2idxrn+8lZ5ecXXJ2ydklcq8t99pyr32evZ6/4+h7bX2vre+15V5b32vre219r63vtfW9ttxry7223Gvre219r63vtc8uObtE7rX1vba+19b32vpeR9/ryL2O3OvIvY6+19H3Ovpe5x9dMv/okpF7HX2vo+919L2OvtfR9zpyryP3OnKvo+919L2Ovtf5R5fMP7pk5F5H3+voex19r6PvdfS9jtzryL2O3Ovoex19r6Pvdf6lO5nuZJqWpqVpZVqZVu5k+Wzls5XPVqaVn1u5k+VOtjvZprVpbVqb1qa1O9k+W/ts7bONaePnNu7kuJPjTo5pY9qYNqaNaetOrs+2Ptv6bGva+rmtO7nu5LqTa9oz7Zn2THumPXfy+WzPZ3s+2zPt+bmdO3nu5LmTZ9qZdqadaWfauZN2idzryL2OvtfR9zqfXfLZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6+l5H3+voex19r6PvdeReR+515F5H3+voex19r/PZJZ9dIvc6cq8j9zpyr6PvdeRe5xvT1jS7RO515F5H7nX+uNf7b/k7C5o/7vW3fC6PJazafLBq88GqzQerNh+s2nywavM9055pz7Rn2pl2pp1pZ9qZdqadaWfamQarNgGrNgGrNgGrNgGrNgGrNgGrNgGrNgGrNgGrNvHPNP7GmeC8ZPS9jtzryL2O3OvIvY7c64RdEnaJ3Ovoex19r6PvdfS9jtzryL2O3Ovoex19r6PvdcIuCbtE7nX0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o+919L2OvtfR9zpyryP3OnKvo+919L2Ovtc5u+TsErnX0fc6+l5H3+voex19ryP3OnKvI/c6+l5H3+voe52zS84ukXsdfa+j73X0vY6+19H3OnKvI/c6cq+j73X0vY6+1zm75OwSudfR9zr6Xkff6+h7HX2vI/c6cq8j9zr6Xkff6+p73X90yf6jS1budfW9rr7X1fe6+l5X3+vKva7c68q9rr7X1fe6+l73H12y/+iSlXtdfa+r73X1va6+19X3unKvK/e6cq+r73X1va6+1/0X7mS6k2lampampWlpWrqT6bOlz5Y+W5lWfm7lTpY7We5kmVamlWllWpnW7mT7bO2ztc/WprWfW7uT7U62O9mmjc82Ptv4bGPamDamjWnjs43PNqatz/Z/XXL/LX9nQfvHvf6W5bJdjst1+VweS1i1/Qertv+eac+0Z9oz7Zn2THumPdPOtDPtTDvTzrQz7Uw70840WLX9YNX2g1XbD1ZtP1i1/WDV9oNV+/9LPreP85LV97pyryv3unKvK/e6cq/72SWfXSL3uvpeV9/r6ntdfa8r97pyryv3uvpeV9/r6nvdzy757BK519X3uvpeV9/r6ntdfa8r97pyryv3uvpeV9/r6nvdzy757BK519X3uvpeV9/r6ntdfa8r97pyryv3uvpeV9/r6nvdzy757BK519X3uvpeV9/r6ntdfa8r97rf+Gzjs9kl+l5X7nXlXlfudeVeV+515V5X7nX1va6+19X3ut/6bOuzPdOen9tzJ587+dzJZ9oz7Zn2THumnTt5Ptv5bOeznWnn53bu5LmT507yN87qe119r6vvdfW9rr7X1fe64XtJ+F6i73X1va7c68q9rtzryr2u3OvKva7c68q9rr7X1fe6YZfIva6+19X3uvpeN+ySsEvkXlff6+p7XX2vq+919b2u3OvKva7c6+p7XX2vq+91wy4Ju0TudfW9rr7X/X9F3NGqd0mSWPd30bUvTkZEZkT4XYyQZNkMDBoxlgzGzLurzzdV+3cXTTcV7P2vXuTJvVh6r6332nqvzXtt3mvzXlvvtfVeW++1A0sCS3ivrffaeq+t99p6r6332rzX5r0277X1XlvvtfVeO7BE77V5rx3OJXqvHVgSWBJYwntt3mvzXjvatva7YUlgSWAJ77VjbMOSwJLAksAS3mvzXpv32rG2rd8NSwJLAkt4rx1rG5YkliSWJJbwXpv32rzXTueSdC5JLEksSSzhvXY6lySWJJYkliSW8F6b99q8186w7fuO03qvrffaeq/Ne22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qJJYklvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq+dWJJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffaiSWJJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvnViSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332okliSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r11YUljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qFJYUlvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq9dWFJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffahSWFJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvXVhSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332oUlhSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r11YUljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99oXSy6W8F6b99q81+a9tt5r8177unvVe23ea/Nem/favNf+473++/3ZH++1/hqPMYxpLOM1PmMbx/jdPN20LW1L29K2tC1tS9vStrQtbSvbyrayrWwr28q2sq1sK9vKtmvbte3adm3zN851X6L32rzX5r0277V5r8177YslF0t4r6332nqvrffaeq/Ne23ea/NeW++19V5b77Uvllws4b223mvrvbbea+u9tt5r816b99q819Z7bb3X1nvtiyUXS3ivrffaeq+t99p6r6332rzX5r0277X1XlvvtfVe+2HJwxLea+u9tt5r67223mvrvTbvtZ9zyXMu4b223mvzXpv32rzX5r0277V5r817bb3X1nttvdd+ziXPuUTvtfVeW++1X3qTziV6r6332nqvrffaeq+t99p6r/2cS55zid5r67223mu/8iadS/ReW++19V5b77X1XlvvtfVe+zmXPOcSvdfWe23ea/Nem/favNfmvTbvtXmvzXttvdfWe+2HJbzX1nttvdfWe+2HJQ9LeK+t99p6r6332nqvrffavNfmvTbvtfVeW++19V77YcnDEt5r67223mvrvbbea+u9Nu+1ea/Ne22919Z7bb3XbixpLOG9tt5r67223mvrvbbea/Nem/favNfWe22919Z77cYSvdfmvXY7l+i9dmNJY0ljCe+1ea/Ne+1299q+4zSWNJY0lvBeu92XNJY0ljSWNJbwXpv32rzXbnev7TtOY0ljSWMJ77XbfUljSWNJY0ljCe+1ea/Ne+12LmnnksaSxpLGEt5rt3NJY0ljSWNJYwnvtXmvzXvtdvfavuPovbbea+u9Nu+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rN5Y0lvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u9dmPJYAnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeaw+WDJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZgyWAJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msPlgyW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6732YMlgCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rD5YMlvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u99mDJYAnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeaw+WDJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZiyWIJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msvliyW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6732YsliCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rL5YslvBem/favNfmvbbea/Nee9296r0277V5r817bd5r//Fe96/xuwv6473+NfaP8RjDmMYyXuMzttE2rtpy1Zartly15aotV225astVW67actWWq7ZcteWqLVdtuWrLVVuu2nLVlqu2XLX9XLX5+Vy1+flcteG9zs93XzJ6r8N7Hd7r8F6H9zq81/n5WDI/H0uG9zp6r6P3Onqvo/c6vNfhvQ7vdfReR+919F7nJzxbeLawLWwL28K2sO1jyfBeh/c6vNfRex2919F7nZ+PJfPzsWR4r6P3Onqvo/c6eq+j9zq81+G9Du919F5H73X0XufnepPXm7y2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q/e6F0sulvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q97sWSiyW819V7Xb3X1XtdvdfVe13e6/Jel/e6eq+r97p6r/uw5GEJ73X1XlfvdfVeV+919V6X97q81+W9rt7r6r2u3us+LHlYwntdvdfVe12919V7Xb3X5b0u73V5r6v3unqvq/e6D0selvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q97sOShyW819V7Xb3X1XtdvdfVe13e6/Jel/e6eq+r97p6r/uw5GEJ73X1XlfvdfVeV+919V6X97q81+W9rt7r6r2u3us+LHlYwntdvdfVe12919V7Xb3X5b0u73V5r6v3unqvq/e6D0selvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q9bmNJYwnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6zaWNJbwXlfvdfVeV+919V5X73V5r8t7Xd7r6r2u3uvqvW5jSWMJ73X1XlfvdfVeV+919V6X97q81+W9rt7r6r2u3us2ljSW8F6X97q81+W9rt7r8l633b3qvS7vdXmvy3td3uv+8V7//f7sj/daf43HGMY0lvEan7GNY/xunrpta9vatratbWvb2ra2rW1r28a2sW1sG9vGtrFtbBvbxraxbW1b29a2tc3fOO2+RO91ea/Le13e6/Jel/e6gyWDJbzX1XtdvdfVe1291+W9Lu91ea+r97p6r6v3uoMlgyW819V7Xb3X1XtdvdfVe13e6/Jel/e6eq+r97p6rztYMljCe12919V7Xb3X1XtdvdflvS7vdXmvq/e6eq+r97qDJYMlvNfVe12919V7Xb3X1Xtd3uuOc8k4l/BeV+91ea/Le13e6/Jel/e6vNflva7e6+q9rt7rjnPJOJfova7e6+q97vgmPM4leq+r97p6r6v3unqvq/e6eq87ziXjXKL3unqvq/e645vwOJfova7e6+q9rt7r6r2u3uvqve44l4xzid7r6r0u73V5r8t7Xd7r8l6X97q81+W9rt7r6r3uYgnvdfVeV+919V53sWSxhPe6eq+r97p6r6v3unqvy3td3uvyXlfvdfVeV+91F0sWS3ivq/e6eq+r97p6r6v3urzX5b0u73X1XlfvdfVed7FksYT3unqvq/e6eq+r97p6r8t7Xd7r8l5X73X1XlfvdRdL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e43GksYS3mvovYbea+i9ht5r6L0G7zV4r8F7Db3X0HsNvddoLGks4b2G3mvovYbea+i9ht5r8F6D9xq819B7Db3X0HuNxpLGEt5r6L2G3mvovYbea+i9Bu81eK/Bew2919B7Db3XaCxpLOG9ht5r6L2G3mvovYbea/Beg/cavNfQew2919B7jcaSxhLea+i9ht5r6L2G3mvovQbvNXivwXsNvdfQew2912gsaSzhvYbea+i9ht5r6L2G3mvwXoP3GrzX0HsNvdfQe43GksYS3mvovYbea+i9ht5r6L0G7zV4r8F7Db3X0HsNvdcYLBks4b2G3mvovYbea+i9ht5r8F6D9xq819B7Db3X0HuNwZLBEt5r6L2G3mvovYbea+i9Bu81eK/Bew2919B7Db3XGCwZLOG9ht5r6L2G3mvovYbea/Beg/cavNfQew2919B7jcGSwRLea+i9ht5r6L2G3mvovQbvNXivwXsNvdfQew291xgsGSzhvYbea+i9ht5r6L2G3mvwXoP3GrzX0HsNvdfQe43BksES3mvwXoP3GrzX0HsN3muMu1e91+C9Bu81eK/Be40/3uv+NX53QX+817/HMX53QctVW67actWWq7ZcteWqLVdtuWrLVVuu2nLVlqu2XLXlqi1Xbblqy1Vbrtpy1Zartly15aotV225astVW67actWWq7ZcteWq8V5j3ZfovQbvNXivwXsN3mvwXmOxZLGE9xp6r6H3GnqvofcavNfgvQbvNfReQ+819F5jsWSxhPcaeq+h9xp6r6H3GnqvwXsN3mvwXkPvNfReQ+81FksWS3ivofcaeq+h9xp6r6H3GrzX4L0G7zX0XkPvNfReY7FksYT3Gnqvofcaeq+h9xp6r8F7jXUuWecS3mvovQbvNXivwXsN3mvwXoP3GrzX0HtNvdfUe82f71ySP9+5JPVeU+819V7z5/smnD/fuST1XlPvNfVeU+819V5T7zX1XvPnO5fkz3cuSb3X1HtNvdf8+b4J5893Lkm919R7Tb3X1HtNvdfUe0291/xJz5aeLW37vuMk7zV5r8l7Td5r8l6T95q81+S9pt5r6r3mT3m28mxlW/ndypssb/J6k9e2a9u17dp2bbve5PVs17Ndz/Zse363500+b/J5k8+2Z9uz7dn2bGtvsj1be7b2bG1b+93am2xvsr3Jtm1sG9vGtrFt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S++19F6L91q81+K9lt5r6b2W3msFlgSW8F6L91q81+K9lt5r8V4r0ra0DUt4r8V7Ld5r/fFe99/H+vsuqP54r3+PYUxjGa/xGds4xv3Ga9u17dp2bbu2Xduubde2a9u17dn2bHu2Pduebc+2Z9uz7dn2bGvb2ra2rW1rv1v7t6T9W4IlvNfivRbvtXivFVgSWMJ7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6rxVYEljCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91qJJYklvNfSey2919J7Lb3X0nst3mvxXov3Wnqvpfdaeq+VWJJYwnstvdfSey2919J7Lb3X4r1WOpekcwnvtfRei/davNfivRbvtXivxXst3mvpvZbea+m9VjqXpHOJ3mvpvZbea+X1Jp1L9F5L77X0XkvvtfReS++19F4rnUvSuUTvtfReS++18nmTziV6r6X3Wnqvpfdaeq+l91p6r5XOJelcovdaeq/Fey3ea/Fei/davNfivRbvtXivpfdaeq+VWMJ7Lb3X0nstvddKLEks4b2W3mvpvZbea+m9lt5r8V6L91q819J7Lb3X0nutwpLCEt5r6b2W3mvpvZbea+m9Fu+1eK/Fey2919J7Lb3XKiwpLOG9lt5r6b2W3mvpvZbea/Fei/davNfSey2919J7rcISvdfivVY5l+i9VmFJYUlhCe+1eK/Fe60q28rvhiWFJYUlvNcq9yWFJYUlhSWFJbzX4r0W77Xq2fb8blhSWFJYwnutcl9SWFJYUlhSWMJ7Ld5r8V6rnEvKuaSwpLCksIT3WuVcUlhSWFJYUljCey3ea/Feq8a28bthid5r6b0W77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3mtdLLlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaF0sulvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sWSiyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r3Wx5GIJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3mtdLLlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaF0sulvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sWSiyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r/Ww5GEJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3ms9LHlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaD0selvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sOShyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r/Ww5GEJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3ms9LHlYwnst3mvxXov3WnqvxXut5+5V77V4r8V7Ld5r8V7rj/e6f43/2Hbi3/63//D//qd//af/9J//+b/+P//hf/////Ef/6//+d/+y//4p3/5b3/9x//x//33v/+b//yv//TP//xP//d//O//+i//5b/+n//zX//rf/znf/kvf/67f/s//u1/AQ==", + "debug_symbols": "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PMfDnXQPh4c7eLiDhzt4uIOHO3i4g4c75Twv53k5z8t5Xs7zcg9X7tvLfXt9f1c75Twvv9vL93n5Pi/3cOU8L+d5Oc/LeV7O83IPV+7by317XXvlPC+/28v3efk+L/dw5Twv53k5z8t5Xs7z0vNy346HO3i4g4c7eLiDhzt4uIOHO3i4U3peel56joc75R7u88P9ruyVnpee4+FO+T4vPS89Lz0vPcfDHTzcwcOdcg/3+eH+v9Lz0vPSczzcKd/npeel56Xnped4uIOHO3i4U+7hPj/c78pe6XnpOR7ulO/z0vPS89Lz0nM83MHDHTzcKed5Oc9Lz0vPW8/xcKed563nreet563neLiDhzt4uNPu4dp9e+t563nrOR7utO/z1vPW89bz1nM83MHDHTzcafdw7b699bz1vPUcD3fa93nreet563nrOR7u4OEOHu6087yd563nreet53i4087z1vPW89bz1nM83MHDHTzcafdw7b699bz1vPUcD3fa93nreet563nrOR7u4OEOHu60e7h239563nreeo6HO+37vPW89bz1vPUcD3fwcAcPd9o9XLtvbz1vPW89x8Od9n3eet563nreeo6HO3i4g4c77Xd7u29vPW89bz3Hw53xu330fPR89Hz0HA938HAHD3fGPdy4bx89Hz0fPcfDnfF9Pno+ej56PnqOhzt4uIOHO+Mebty3j56Pno+e4+HO+D4fPR89Hz0fPcfDHTzcwcOdcQ837ttHz0fPR8/xcGf8bh89Hz0fPR89x8MdPNzBw51xDzfu20fPR89Hz/FwZ3yfj56Pno+ej57j4Q4e7uDhzriHG/fto+ej56PneLgzvs9Hz0fPR89Hz/FwBw938HBn3MON+/bR89Hz0XM83Bnf56Pno+ej56PneLiDhzt4uDO+z8f3+ej56PnoOR7ujHu40fPV89Xz1XM83MHDHTzcWfdw67599Xz1fPUcD3fWPdzq+er56vnqOR7u4OEOHu6se7h13756vnq+eo6HO+sebvV89Xz1fPUcD3fwcAcPd9Y93LpvXz1fPV89x8MdPNzBwx083Fk9x8OddQ+3vs/xcAcPd/BwBw93/ni4/W/13TP88XD/VmGVVmXVVmP13WUsTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZ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54f7XcnQ89Tz1PP0u/3zw/2uZOh56nnqeep56nnq+eeH+12NlX7oeep5+t3++eF+VzL0PPU89Tz1PPU89fzzw/2ujlVYpVVZtX97rcbqWclwnpeel/O8nOel558f7nd1rcbqWcnwfV6+zz8e7nclw3lezvNynpfz/PPD/a6+9/H54X5X9sp5Xn63l+/z8n3++eF+VzKc5+U8L+d5Oc8/P9zvyvsoe1X2ynlefreX7/Pyff754X5XMpzn5Twv53k5z0vPPz/c78petb1ynpeel+/z8n3+8XC/Kxl6Xnpeel56/vnhflfeh56Xnpeel9/t5fu89Lz0vPS89Lz0vPS89Pzzw/2uvA89Lz0vPS+/28v3eel56Xnpeel56Xnpeen554f7XX3vo/W89bz1vP1ub9/nreet563nreet563nreftPG/neet563nreTvP23neet563nreet563nreet7u4TrG6lnZKz1vv9vb93nreet563nreet563nrebuH6/I+9Lz1vPW8/W5v3+et563nreet563nreet5+08b+d563nreet5O8/bed563nreet563nreet563u7h+nofet563nrefre37/PW89bz1vPW89bz1vPW83YP9/nhflf2Ss9bz9vv9vZ93nreet563nreet563nre7uE+P9zvyl7p+dXz63f79X1+9fzq+dXzq+dXz6+eXz2/frdf9+1Xz6+eXz2/frdfv9uvnl89v3p+9fzq+dXzq+fXPdx13371/Or51fPr+/z6Pr96fvX86vnV86vnV8+vnl/3cNd9+9Xzq+dXz6/v8+v7/Or51fOr51fPr55fPb96ft3DXfftV8+vnl89v363X7/br55fPb96fvX86vnV86vn1z3cdd9+9fzq+dXz63f79X1+9fzq+dXzq+dXz6+eXz2/7uGu+/ar51fPr55fv9uv7/Or51fPr55fPb96fvX86vl1D3fdt189v3p+9fz63T6+z0fPR89Hz0fPR89Hz0fPx/f5+D4fPR89Hz0fv9vHPdzo+ej56Pno+ej56Pno+biHG/fto+ej56Pn43f7uIcbPR89Hz0fPR89Hz0fPR/3cOO+ffR89Hz0fPxuH/dwo+ej56Pno+ej56Pno+fjHm7ct4+ej56Pno/f7aPn4zwf5/no+fjdPu7hxvf56Pno+ej5OM//eLj9b/XdM/zx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56XnpeflfV7e56Xnpeel56Xnpeel56Xnpeel56Xn5by9nLeXnpeel56X3+3l+7z0vPS89Lz0vPS89Lz0vJy3l/P20vPS89Lz8ru9fJ+Xnpeel563nreet563nrfz9nbe3nreet563n63t+/z1vN23t7e5+193nre3uftfd563s7h2jlc+7tae5+33+3t+7x9n7dzuPY+b+/z9j5v7/P2Pm/ncO28vZ23t7+rtfd5+93evs/b93k7h2vv8/Y+b+/z9j5v7/N2DtfO29t5e/u7Wnuft9/t7fu8fZ+3c7j2Pm/v8/Y+b+/z9j5vPW/n7e28vf1drb3PW8/b93n7Pm/ncK3nreet563nreftHK79Xa31vPW89bz9bm/f563nreet563nreet563n7Ryu/V2t9bz1vPW8/W5v3+et563nreet563no+ej5+McbvxdbfR89Hz0fPxuH9/no+ej56Pno+ej56Pno+fjfT7e56Pno+ej5+N9Pt7no+ej56Pno+ej56Pno+fjHG6ct4+ej56Pno/f7eP7fPR89Hz0fPR89Hz0fPR8nMON8/bR89Hz0fPxu318n4+ej56Pno+ej56Pno+ej/f5eJ+Pno+ej56P9/l4n4+ej56Pno+ej56Pno+ej3O4cd4+ej56Pno+freP7/PR89Hz0fPR89Hz0fPR83EON87bR89Hz0fPx+/28X0+ej56Pno+ej56Pno+er7O4dZ5++r56vnq+frdvr7PV89Xz1fPV89Xz1fPV8/X7/Z13r56vnq+er5+t6/f7avnq+er56vnq+er56vn6xxunbevnq+er56v7/P1fb56vnq+er56vnq+er56vs7h1nn76vnq+er5+j5f3+er56vnq+er56vnq+er5+scbp23r56vnq+er9/t63f76vnq+er56vnq+er56vk6h1vn7avnq+er5+t3+/o+Xz1fPV89Xz1fPV89Xz1f53DrvH31fPV89Xz9bl/f56vnq+er56vnq+er56vn6xzu88P9/4Ts6/n58/X8fPtSf9O/jPP54X5TmsrUpjHtN309P3i48/nhftMzhSlNZZJxZBwZV8aV8fX84OEOHu7g4c7nh/tNbRqTe/XcqyfjyXgynown47lXz3U81/FcR8gIzyPcq3Cvwr0KGSEjZISMkJHuVbqOdB3pOlJGeh7pXqV7le5VyijXUa6jXEfJKBklo2SU6yjXUTLadfx6vv9N/84Zzl8e7t8UpjSVqU1j2m/6OJnz5+Nkzp+RMTJGxsgYGSNjZIyMlbEyVsbKWBkrY2WsjJXxcTLnfJzMOR8nc87HyZzzcTLnfJzMOR8nc/Bw53zf5+fzw/2m73ng4Q4e7uDhDh7uHD0/eo6HO0fPj54fPT96joc7eLiDhzufH+43ydDzo+dHz/Fw5/PD/SYZen70/Og5Hu7g4Q4e7nx+uN/0/X/J0fOj50fP8XDn88P9Jhl6fvT86Dke7uDhDh7ufH643/RM7pWeHz3Hw53PD/ebZJSMklHulZ5/+1J/k+vQ888P95vcq3Kv2r1qGS2jZbSMltHuVbuOdh3tOkbGeB7jXo17Ne7VyBgZI2NkjIx1r9Z1rOtY17Ey1vNY92rdq3Wvvt/t5/PD/aZjuqZnClOaytSmL+Pzw/1/+s7bDx7u4OEOHu7g4Q4e7uDhDh7uXD2/en71HA93Pj/cb3qmMKWpTDKuDD2/en71/Oo5Hu7g4Q4e7nx+uN/UJvdKz6+e4+HO54f7TTL0/Or51XM83MHDHTzc+fxwv8nz0POr51fP8XDn88P9Jhl6fvX86jke7uDhDh7uXO/z631+9fzq+dVzPNy53udXz6+eXz2/eo6HO3i4g4c7t2W056HnV8+vnuPhzh0Zen71/Or51XM83MHDHTzcuStjPQ89v3p+9RwPd+7K0POn50/Pn57j4Q4e7uDhzvM+f97nT8+fnj89x8Od533+9Pzp+dPzp+d4uIOHO3i4866M77z9PD1/ev70HA93Pj/cb5Kh50/Pn57j4Q4e7uDhzueH+01pcq/0/Ok5Hu58frjfJEPPn54/PcfDHTzcwcOdzw/3mzwPPX96/vQcD3c+P9xvkqHnT8+fnuPhDh7u4OHO87v988P9JvdKz5+e4+HO87v96fnT86fnT8/xcAcPd/Bw5/PD/SbPQ8+fnj89x8Odzw/3m2To+dPzp+d4uIOHO3i48/nhfpPnoedPz5+e4+HO54f7TTL0/Ol56Dke7uDhDh7ufH6435SmMrVpTDL8bg89Dz0PPQ89x8MdPNzBw53PD/ebvucReh56HnqOhzvh+zz0PPQ89Dz0HA938HAHD3c+P9xveib3Ss9Dz/FwJ3yfh56Hnoeeh57j4Q4e7uDhzueH+02eh56Hnoee4+FO+D4PPQ89Dz0PPcfDHTzcwcOd8H0evs9Dz0PPQ8/xcOfzw/0mGXoeeh56joc7eLiDhzufH+43eR56Hnoeeo6HO58f7jfJ0PPQ89BzPNzBwx083Pn8cL/J89Dz0PPQczzc+fxwv0mGnoeeh57j4Q4e7uDhTjqH+/xwvylMaSpT+2/H//ZdBx7upJ7j4U46h0vf53i4g4c7eLiDhzt/ebi/5y9/ebj4bzqma3qmMKWpTG0a03eWkU/Gk/FkPBlPxpPxZDwZT8aTETJCRsgIGSEjZISMkBEyQkbKSBkpI2X43Z6+z9P3OR7u4OEOHu7g4Q4e7qSep57j4U7qeep56nnqOR7u4OEOHu58frjfJEPPU89Tz/FwJ32fp56nnqeep57j4Q4e7uDhzueH+01t0g89Tz3Hw530fZ56nnqeep56joc7eLiDhzvlvL2ct5eel56XnuPhTvk+Lz0v5+3lfV7e53i4U97n5X2OhzvlHA4Pd/BwBw938HAHD3fwcAcPd8r7vLzPy/u8vM/L+7ycw5Xz9nLeXs+98j4vv9vL93n5Pi/ncOV9Xt7n5X1e3uflfV7O4cp5ezlvr3CvvM/L7/byfV6+z8s5XHmfl/d5eZ+X93l5n5eel/N2PNzBwx083MHDHTzcwcMdPNzBw53S89Lz0nM83CnncJ8f7je5V3peeo6HO+X7vPS89Lz0vPQcD3fwcAcPd8o53OeH+03ulZ6XnuPhTvk+Lz0vPS89Lz3Hwx083MHDnXIOV/6u1nreet56joc77fu89bz1vPW89RwPd/BwBw932vu8vc9bz1vPW8/xcKe9z1vPW89bz1vP8XAHD3fwcKedw7Xz9tbz1vPWczzcad/nreet563nred4uIOHO3i4087h2nl763nrees5Hu607/PW89bz1vPWczzcwcMdPNxp7/P2Pm89bz1vPcfDnfY+bz1vPW89bz3Hwx083MHDnXYO187bW89bz1vP8XCnfZ+3nreet563nuPhDh7u4OFOO4dr5+2t563nred4uNO+z1vPW89bz1vP8XAHD3fwcKedw7Xz9tbz1vPRczzcGd/no+ej56Pno+d4uIOHO3i4M363j/P20fPR89FzPNwZv9tHz0fPR89Hz/FwBw938HBnnMON8/bR89Hz0XM83Bnf56Pno+ej56PneLiDhzt4uDPO4cZ5++j56PnoOR7ujO/z0fPR89Hz0XM83MHDHTzcGedw47x99Hz0fPQcD3fG7/bR89Hz0fPRczzcwcMdPNwZ53DjvH30fPR89BwPd8b3+ej56Pno+eg5Hu7g4Q4e7oxzuHHePno+ej56joc74/t89Hz0fPR89BwPd/BwBw93xjncOG8fPR89Hz3Hw531fb56vnq+er56joc7eLiDhzvr+3x9n6+er56vnuPhzjqHWz1fPV89Xz3Hwx083MHDnXUOt87bV89Xz1fP8XBnncOtnq+er56vnuPhDh7u4OHOOodb5+2r56vnq+d4uLPO4VbPV89Xz1fP8XAHD3fwcGedw63z9tXz1fPVczzcwcMdPNzBw53VczzcWedw6/scD3fwcAcPd/Bw5y8Pt/9N3znDXx7uv6n/mI7pmp4pTGkqU5tk4GQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcnsx8ncPx8nc/98nMzFw90/3/f55Ye7eLiLh7t4uIuHu3i4++1L/U3HJOPr+eWHu/xwlx/u4uEuHu7i4S4/3OWHu/xw9891Hdd1XBlXxpVxZVwZX88vHu7i4S4e7vLDXX64yw93/3w9v9++1N8kI2SEjJARMsK9CtcRriNcR8j4ztsvP9z9k+5VulcpI2WkjJSRMtK9StdRrqNcR8koz6Pcq3Kvyr0qGSWjZLSMltHuVbuOdh3tOlpGex7tXrV7Ne7VyBgZI2NkjIxxr8Z1jOsY17Ey1vNY92rdq3WvVsbKWBkr43ufX364yw93v32pv+mZvgx+uIuHu3i4i4e7eLiLh7t4uIuHu3i4yw93+eHu0XM83OWHu/xwlx/uHj0/eo6Hu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfrh79PzoOR7u8sNdfrjLD3f54S4/3MXDXTzcxcNdfrjLD3f54e7R86PneLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu0fP+eEuHu6ekqHnR8+Pnh89x8NdPNzFw93TMtrz0POj50fP8XD3jAw9P3p+9PzoOR7u4uEuHu6ekTGeh54fPT96joe7Z2Xo+dHzo+dHz/FwFw938XD3ep9f7/Or51fPr57j4e71Pr96fvX86vnVczzcxcNdPNy9R8Z33n754S4/3OWHu3i4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7tXz6+e4+EuP9zlh7v8cJcf7vLDXTzcxcNdPNzlh7v8cJcf7l49v3qOh7v8cJcf7vLDXX64yw938XAXD3fxcJcf7vLDXX64e/X86jke7vLDXX64yw93+eEuP9zFw1083MXDXX64yw93+eHu1fOr53i4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7tXz6+e4+EuP9zlh7v8cJcf7vLDXTzcxcNdPNzlh7v8cJcf7j49f3qOh7v8cJcf7vLDXX64yw938XAXD3fxcJcf7vLDXX64+/T86Tke7vLDXX64yw93+eEuP9zFw1083MXDXX64yw93+eHu0/On53i4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7tPz5+e4+EuP9zlh7v8cJcf7vLDXTzcxcNdPNzlh7v8cJcf7j49f3qOh7v8cJcf7vLDXX64yw938XAXD3fxcJcf7vLDXX64+/T86Tke7vLDXX64yw93+eEuP9zFw1083MXDXX64yw93+eHu0/On53i4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7uh56HneLiLh7t4uIuHu/xwFw93448M3+d4uIuHu3i4i4e7f3m4/W/6d85w//Jw/6YxfecM8XEyNz5O5sbHydz4OJkbHydz4+NkblwZV8aVcWU8GU/Gk/FkPBlPxpPxZDwZT0bICBkhI2SEjJARMkJGyAgZfreH73N+uIuHu3i4i4e7eLiLh7uh56HneLjLD3f54S4/3OWHu3i4i4e7eLjLD3f54S4/3A09Dz3Hw11+uMsPd/nhLj/c5Ye7eLiLh7t4uMsPd/nhLj/cDT0PPcfDXX64yw93+eEuP9zlh7t4uIuHu3i4yw93+eEuP9wNPU89x8NdfrjLD3f54S4/3OWHu3i4m97n6X2Oh7v8cBcPd/FwFw938XAXD3fxcBcPd/nhLj/c5Ye76X2e3uf8cJcf7vLD3fz+rnbT+5wf7vLDXX64yw93+eEuP9zlh7vpfZ7e5/xwlx/u8sPdDPfK+5wf7vLDXX64yw93+eEuP9zlh7vpfZ7e5/xwlx/u4uEuHu7i4S4e7uLhLh7u4uEuHu7yw11+uJt6joe7/HCXH+7yw93U89RzPNzlh7v8cJcf7vLDXX64i4e7eLiLh7v8cJcf7vLD3dTz1HM83OWHu/xwlx/u8sNdfriLh7t4uIuHu/xwlx/u8sPd1PPUczzc5Ye7/HCXH+7yw11+uIuHu3i4i4e7/HCXH+7yw93Sc364i4e75X3OD3dLz0vPS8/xcBcPd/Fwt5zDlfP20vPS89JzPNwt3+el56Xnpeel53i4i4e7eLhbzuHKeXvpeel56Tke7pbv89Lz0vPS89JzPNzFw1083C3v8/I+Lz0vPS89x8Pd8j4vPS89Lz0vPcfDXTzcxcPdcg5Xztv54S4/3OWHu3i4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7ul56XneLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu6Xnped4uMsPd/nhLj/c5Ye7/HAXD3fxcBcPd/nhLj/c5Ye7reet53i4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7ut563neLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu63nred4uMsPd/nhLj/c5Ye7/HAXD3fxcBcPd/nhLj/c5Ye7reet53i4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7ut563neLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu63nred4uMsPd/nhLj/c5Ye7/HAXD3fxcBcPd/nhLj/c5Ye7reet53i4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7uj56PneLjLD3f54S4/3OWHu/xwFw938XAXD3f54S4/3OWHu6Pno+d4uMsPd/nhLj/c5Ye7/HAXD3fxcBcPd/nhLj/c5Ye7o+ej53i4yw93+eEuP9zlh7v8cBcPd/FwFw93+eEuP9zlh7uj56PneLiLh7t4uIuHu/xwFw93xzkcP9zFw1083MXDXTzc/cvD7X/Td87wl4f7N5WpTWP6zhnm42TufJzMnY+TufNxMndaRstoGS2jZbSMkTEyRsbIGBkjY2SMjJExMlbGylgZK2NlrIyVsTL8bh/f5/xwFw938XAXD3fxcBcPd1fPV8/xcJcf7vLDXX64yw938XAXD3fxcJcf7vLDXX64u3q+eo6Hu/xwlx/u8sNdfrjLD3fxcBcPd/Fwlx/u8sNdfri7er56joe7/HCXH+7yw11+uMsPd/FwFw938XCXH+7yw11+uLt6vnqOh7v8cJcf7vLDXX64yw938XB3vc/X+xwPd/nhLh7u4uEuHu7i4S4e7uLhLh7u8sNdfrjLD3fX+3y9z/nhLj/c5Ye76+9q633OD3f54S4/3OWHu/xwlx/u8sPd9T5f73N+uMsPd/nh7vq72nqf88NdfrjLD3f54S4/3OWHu/xwd73P7Ut9/HCPH+7h4R4e7uHhHh7u4eEeHu7h4R4e7vHDPX64Z1/qw8M9frjHD/f44d6fr+fPvtSHh3v8cI8f7vHDPX64xw/38HAPD/fwcI8f7vHDPX649+e5V8+9ejKejCfjyXgynnv1XEe4jnAdISM8j3Cvwr0K9ypkhIyQkTJSRrpX6TrSdaTrSBnpeaR7le5VuVclo2SUjJJRMsq9KtdRrqNcR8toz6Pdq3av2r1qGS2jZbSMljHu1biOcR3jOkbGeB7jXo17Ne7VyFgZK2NlrIx1r9Z1rOtY17Eyvvf5O3p+9Ny+1IeHe+d7n7+j50fP7Ut99qU+PNzDwz083DtHxnfe/vjhHj/c44d7eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe0fP7Ut9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe0fP7Ut9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe0fP7Ut9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe0fPj57j4R4/3OOHe/xwjx/u8cM9PNzDwz083OOHe/xwjx/uHT0/eo6He/xwjx/u8cM9frjHD/fwcA8P9/Bwjx/u8cM9frh39PzqOR7u8cM9frjHD/f44R4/3MPDPTzcw8M9frjHD/f44d7V86vneLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe1fP7Ut9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe1fP7Ut9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe1fP7Ut9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe1fP7Ut9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe1fP7Ut9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe1fP7Ut9eLiHh3t4uIeHe/xwDw/33ncO9/jhHh7u4eEeHu7h4d5fHm7/m/6dM7y/PNy/KUxpKlObxrTf9HEy732czHtXxpVxZVwZV8aVcWVcGU/Gk/FkPBlPxpPxZDwZT8aTETJCRsgIGSEjZPjd/r7v88cP9/BwDw/38HAPD/fwcM++1Gdf6sPDPX64xw/3+OEeP9zDwz083MPDPX64xw/3+OHe03P7Uh8e7vHDPX64xw/3+OEeP9zDwz083MPDPX64xw/3+OHe03P7Uh8e7vHDPX64xw/3+OEeP9zDwz083MPDPX64xw/3+OHe03P7Uh8e7vHDPX64xw/3+OEeP9zDwz37Up99qQ8P9/jhHh7u4eEeHu7h4R4e7uHhHh7u8cM9frjHD/fsS332pT5+uMcP9/jhXnx/V3v2pT5+uMcP9/jhHj/c44d7/HCPH+7Zl/rsS338cI8f7vHDvXjulfc5P9zjh3v8cI8f7vHDPX64xw/37Et99qU+frjHD/fwcA8P9/BwDw/38HAPD/fwcA8P9/jhHj/csy/14eEeP9zjh3v8cC/03L7Uh4d7/HCPH+7xwz1+uMcP9/BwDw/38HCPH+7xwz1+uBd6bl/qw8M9frjHD/f44R4/3OOHe3i4h4d7eLjHD/f44R4/3As9ty/14eEeP9zjh3v8cI8f7vHDPTzcw8M9PNzjh3v8cI8f7qWe88M9PNxL73N+uJd6bl/qsy/14eEeHu7h4V46h8vvvP2lnqee25f68HAvfZ+nnqee25f67Et9eLiHh3t4uJfO4fI7b3+p56nn9qU+PNxL3+ep56nn9qU++1IfHu7h4R4e7qX3eXqfp56nntuX+vBwL73PU89Tz+1LffalPjzcw8M9PNxL53BZnoee88M9friHh3v8cI8f7vHDPX64xw/38HAPD/fwcI8f7vHDPX64l3puX+rDwz1+uMcP9/jhHj/c44d7eLiHh3t4uMcP9/jhHj/cSz23L/Xh4R4/3OOHe/xwjx/u8cM9PNzDwz083OOHe/xwjx/ulZ7bl/rwcI8f7vHDPX64xw/3+OEeHu7h4R4e7vHDPX64xw/3Ss9Lz/Fwjx/u8cM9frjHD/f44R4e7uHhHh7u8cM9frjHD/dKz0vP8XCPH+7xwz1+uMcP9/jhHh7u4eEeHu7xwz1+uMcP90rPS8/xcI8f7vHDPX64xw/3+OEeHu7h4R4e7vHDPX64xw/3Ss9Lz/Fwjx/u8cM9frjHD/f44R4e7uHhHh7u8cM9frjHD/dKz+1LfXi4xw/3+OEeP9zjh3v8cA8P9/BwDw/3+OEeP9zjh3ul5/alPjzc44d7/HCPH+7xwz1+uIeHe3i4h4d7/HCPH+7xw73Wc/tSHx7u8cM9frjHD/f44R4/3MPDPTzcw8M9frjHD/f44V7ruX2pDw/3+OEeP9zjh3v8cI8f7uHhHh7u4eEeP9zjh3v8cK/13L7Uh4d7/HCPH+7xwz1+uMcP9/BwDw/38HCPH+7xwz1+uNd6bl/qw8M9PNzDwz083OOHe3i4187h+OEeHu7h4R4e7uHh3l8e7u/5y18eLv6bjumanilMaSpTm8b0nWV0y2gZLaNltIyW0TJaRstoGSNjZIyMkTEyRsbIGBkjY2SsjJWxMlaG3+3t+5wf7uHhHh7u4eEeHu7h4Z59qc++1IeHe/xwjx/u8cM9friHh3t4uIeHe/xwjx/u8cO90XP7Uh8e7vHDPX64xw/3+OEeP9zDwz083MPDPX64xw/3+OHe6Ll9qQ8P9/jhHj/c44d7/HCPH+7h4R4e7uHhHj/c44d7/HBv9Ny+1IeHe/xwjx/u8cM9frjHD/fwcM++1Gdf6sPDPX64h4d7eLiHh3t4uIeHe3i4h4d7/HCPH+7xwz37Up99qY8f7vHDPX64N/6uZl/q44d7/HCPH+7xwz1+uMcP9/jhnn2pz77Uxw/3+OEeP9wbf1ezL/Xxwz1+uMcP9/jhHj/c44d7/HDPvtRnX+rjh3v8cA8P9/BwDw/38HAPD/fwcA8P9/Bwjx/u8cM9+1IfHu7xwz1+uMcP91bP7Ut9eLjHD/f44R4/3OOHe/xwDw/38HAPD/f44R4/3OOHe6vn9qU+PNzjh3v8cI8f7vHDPX64h4d7eLiHh3v8cI8f7vHDvdVz+1IfHu7xwz1+uMcP9/jhHj/cw8M9PNzDwz1+uMcP9/jh3uo5P9zDw731PueHe6vn9qU++1IfHu7h4R4e7q1zuHXevnq+em5f6sPDvfV9vnq+em5f6rMv9eHhHh7u4eHeOodb5+2r56vn9qU+PNxb3+er56vn9qU++1IfHu7h4R4e7q33+Xqfr56vntuX+vBw8ed7n8efr+fx5+t52Jca9qUGHi7wcIGHiz/fOVz8+c7bgx8u+OGCHy7wcMEPF/xwwQ8X/HDBDxd4uMDDBR4u+OGCHy744eLP1/OwLzXwcMEPF/xwwQ8X/HDBDxd4uMDDBR4u+OGCHy744eLPc6/CvQoZISNkhIyQEe5VuI5wHeE6UkZ6HulepXuV7lXKSBkpI2WkjHKvynWU6yjXUTLK8yj3qtyrcq9KRstoGS2jZbR71a6jXUe7jpbRnse4V+NejXs1MkbGyBgZI2Pcq3Ed6zrWdayM9TzWvVr3at2rlbEy9JwfLvjhgh8u8HCBhws8XPDDBT9c8MPF0fOj53i44IcLfrjghwt+uOCHCzxc4OECDxf8cMEPF/xwcfTcvtTAwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4uj5/alBh4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9cHD23LzXwcMEPF/xwwQ8X/HDBDxd4uMDDBR4u+OGCHy744eLouX2pgYcLfrjghwt+uOCHC364wMMFHi7wcMEPF/xwwQ8XR8/tSw08XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uDh6bl9q4OECDxd4uMDDBT9c4OHifudwwQ8XeLjAwwUeLvBw8ZeH2/+mf+cM8ZeH+286f0zHdE3PFKY0lalNMo6MK+PKuDKujCvjyrgyrowr48p4Mp6MJ+PJeDKejCfjyXgynoyQETLC8/i+z4MfLvBwgYcLPFzg4QIPF/alhn2pgYcLfrjghwt+uOCHCzxc4OECDxf8cMEPF/xwcfXcvtTAwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4ur5/alBh4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9cXD23LzXwcMEPF/xwwQ8X/HDBDxd4uLAvNexLDTxc8MMFHi7wcIGHCzxc4OECDxd4uOCHC3644IcL+1LDvtTghwt+uOCHi/f9XS3sSw1+uOCHC3644IcLfrjghwt+uLAvNexLDX644IcLfrh4z73yPueHC3644IcLfrjghwt+uOCHC/tSw77U4IcLfrjAwwUeLvBwgYcLPFzg4QIPF3i44IcLfriwLzXwcMEPF/xwwQ8XT8/tSw08XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uHh6bl9q4OGCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MPF03P7UgMPF/xwwQ8X/HDBDxf8cIGHCzxc4OGCHy744YIfLkLP+eECDxfhfc4PF6Hn9qWGfamBhws8XODhIo6M77w9Qs9Dz+1LDTxchO/z0PPQc/tSw77UwMMFHi7wcBFXxnfeHqHnoef2pQYeLsL3eeh56Ll9qWFfauDhAg8XeLgI7/PwPg89Dz23LzXwcBHe56Hnoef2pYZ9qYGHCzxc4OEiUkZ6HnrODxf8cIGHC3644IcLfrjghwt+uMDDBR4u8HDBDxf8cMEPF6Hn9qUGHi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1yEntuXGni44IcLfrjghwt+uOCHCzxc4OECDxf8cMEPF/xwkXpuX2rg4YIfLvjhgh8u+OGCHy7wcIGHCzxc8MMFP1zww0Xqeeo5Hi744YIfLvjhgh8u+OECDxd4uMDDBT9c8MMFP1yknqee4+GCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MNF6nnqOR4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9cpJ6nnuPhgh8u+OGCHy744YIfLvBwgYcLPFzwwwU/XPDDReq5famBhwt+uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxep5/alBh4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9cpJ7blxp4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cFF6bl9q4OGCHy744YIfLvjhgh8u8HCBhws8XPDDBT9c8MNF6bl9qYGHC3644IcLfrjghwt+uMDDBR4u8HDBDxf8cMEPF6Xn9qUGHi7wcIGHCzxc8MMFHi7KORw/XODhAg8XeLjAw8VfHm7/m75zhr883L9pTN85Q32cTNTHyUR9nEzUx8lEfZxM1MfJRJWMklEySkbLaBkto2W0jJbRMlpGy2gZI2NkjIyRMTJGxsgYGSNjZPjdXr7P+eECDxd4uMDDBR4u8HBhX2rYlxp4uOCHC3644IcLfrjAwwUeLvBwwQ8X/HDBDxet5/alBh4u+OGCHy744YIfLvjhAg8XeLjAwwU/XPDDBT9ctJ7blxp4uOCHC3644IcLfrjghws8XODhAg8X/HDBDxf8cNF6bl9q4OGCHy744YIfLvjhgh8u8HBhX2rYlxp4uOCHCzxc4OECDxd4uMDDBR4u8HDBDxf8cMEPF/alhn2pwQ8X/HDBDxft72r2pQY/XPDDBT9c8MMFP1zwwwU/XNiXGvalBj9c8MMFP1y0v6vZlxr8cMEPF/xwwQ8X/HDBDxf8cGFfatiXGvxwwQ8XeLjAwwUeLvBwgYcLPFzg4QIPF/xwwQ8X9qUGHi744YIfLvjhYvTcvtTAwwU/XPDDBT9c8MMFP1zg4QIPF3i44IcLfrjgh4vRc/tSAw8X/HDBDxf8cMEPF/xwgYcLPFzg4YIfLvjhgh8uRs/tSw08XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uBg954cLPFyM9zk/XIye25ca9qUGHi7wcIGHi3EON87bR89Hz+1LDTxcjO/z0fPRc/tSw77UwMMFHi7wcDHO4cZ5++j56Ll9qYGHi/F9Pno+em5fatiXGni4wMMFHi7G+3y8z0fPR8/tSw08XIz3+ej56Ll9qWFfauDhAg8XeLhY53DrvJ0fLvjhgh8u8HDBDxf8cMEPF/xwwQ8XeLjAwwUeLvjhgh8u+OFi9dy+1MDDBT9c8MMFP1zwwwU/XODhAg8XeLjghwt+uOCHi9Vz+1IDDxf8cMEPF/xwwQ8X/HCBhws8XODhgh8u+OGCHy5Wz+1LDTxc8MMFP1zwwwU/XPDDBR4u8HCBhwt+uOCHC364WD1fPcfDBT9c8MMFP1zwwwU/XODhAg8XeLjghwt+uOCHi9Xz1XM8XPDDBT9c8MMFP1zwwwUeLvBwgYcLfrjghwt+uFg9Xz3HwwU/XPDDBT9c8MMFP1zg4RIPl3i45IdLfrjkh8s/X8/zz9fzxMMlP1zywyU/XPLDJT9c4uESD5d4uOSHS3645IfLP1/P077UxMMlP1zywyU/XPLDJT9c4uESD5d4uOSHS3645IfLP8+9eu7Vk/FkPBlPxpMR7lW4jnAd4TpCRnge4V6FexXuVchIGSkjZaSMdK/SdaTrSNeRMtLzKPeq3Ktyr0pGySgZJaNklHtVrqNdR7uOltGeR7tX7V61e9UyWkbLGBkjY9yrcR3jOsZ1jIzxPMa9Gvdq3auVsa5jXce6jpWxMlbGytBzPFzi4RIPl395uP1v+nfOkH95uH9Tmdo0pv2mj5PJ83EyeT5OJs/HyeQ5Mo6MI+PIODKOjCvjyrgyrowr48q4Mq6MK+PKeDKejCfjyXgynown48n4frfn+b7Pkx8u8XCJh0s8XOLhEg+X9qWmfamJh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HB59Ny+1MTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy6Pn9qUmHi754ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1wePbcvNfFwyQ+X/HDJD5f8cMkPl3i4tC817UtNPFzywyUeLvFwiYdLPFzi4RIPl3i45IdLfrjkh0v7UtO+1OSHS3645IfL+/1dLe1LTX645IdLfrjkh0t+uOSHS364tC817UtNfrjkh0t+uLzXvfI+54dLfrjkh0t+uOSHS3645IdL+1LTvtTkh0t+uMTDJR4u8XCJh0s8XOLhEg+XeLjkh0t+uLQvNfFwyQ+X/HDJD5dXz+1LTTxc8sMlP1zywyU/XPLDJR4u8XCJh0t+uOSHS364vHpuX2ri4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw+XVc/tSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8ur57zwyUeLp/3OT9cPj23LzXtS008XOLhEg+X78j4ztvz6fnTc/tSEw+X78jQ86fn9qWmfamJh0s8XOLh8l0Z33l7Pj1/em5fauLh8j0Zev703L7UtC818XCJh0s8XD7v8+d9/vT86bl9qYmHy+d9/vT86bl9qWlfauLhEg+XeLh8KSM9Dz3nh0t+uMTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy6fn9qUmHi754ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1w+PbcvNfFwyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnh8um5famJh0t+uOSHS3645IdLfrjEwyUeLvFwyQ+X/HDJD5eh56HneLjkh0t+uOSHS3645IdLPFzi4RIPl/xwyQ+X/HAZeh56jodLfrjkh0t+uOSHS364xMMlHi7xcMkPl/xwyQ+Xoeeh53i45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xwGXoeeo6HS3645IdLfrjkh0t+uMTDJR4u8XDJD5f8cMkPl6Hn9qUmHi754ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1yGntuXmni45IdLfrjkh0t+uOSHSzxc4uESD5f8cMkPl/xwGXpuX2ri4ZIfLvnhkh8u+eGSHy7xcImHSzxc8sMlP1zyw2XquX2piYdLfrjkh0t+uOSHS364xMMlHi7xcMkPl/xwyQ+Xqef2pSYeLvnhkh8u+eGSHy754RIPl3i4xMMlP1zywyU/XKae25eaeLjEwyUeLvFwyQ+XeLhM53D8cImHSzxc4uESD5d/ebj9b/rOGf7ycP+mMKWpTG0a03eWkR8nk/lxMpklo2SUjJJRMkpGySgZLaNltIyW0TJaRstoGS2jZYyMkTEyRsbIGBl+t6fvc364xMMlHi7xcImHSzxc2pea9qUmHi754ZIfLvnhkh8u8XCJh0s8XPLDJT9c8sNl6bl9qYmHS3645IdLfrjkh0t+uMTDJR4u8XDJD5f8cMkPl6Xn9qUmHi754ZIfLvnhkh8u+eESD5d4uMTDJT9c8sMlP1yWntuXmni45IdLfrjkh0t+uOSHSzxc2pea9qUmHi754RIPl3i4xMMlHi7xcImHSzxc8sMlP1zyw6V9qWlfavLDJT9c8sNllXvlfc4Pl/xwyQ+X/HDJD5f8cMkPl/alpn2pyQ+X/HDJD5fV7pX3OT9c8sMlP1zywyU/XPLDJT9c2pea9qUmP1zywyUeLvFwiYdLPFzi4RIPl3i4xMMlP1zyw6V9qYmHS3645IdLfrhsPbcvNfFwyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnhsvXcvtTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vWc/tSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uW8/54RIPl+19zg+Xref2paZ9qYmHSzxc4uGyncO18/bW89Zz+1ITD5ft+7z1vPXcvtS0LzXxcImHSzxctnO4dt7eet56bl9q4uGyfZ+3nree25ea9qUmHi7xcImHy/Y+b+/z1vPWc/tSEw+X7X3eet56bl9q2peaeLjEwyUeLsc53Dhv54dLfrjkh0s8XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uBw9ty818XDJD5f8cMkPl/xwyQ+XeLjEwyUeLvnhkh8u+eFy9Ny+1MTDJT9c8sMlP1zywyU/XOLhEg+XeLjkh0t+uOSHy9Fz+1ITD5f8cMkPl/xwyQ+X/HCJh0s8XOLhkh8u+eGSHy5Hz0fP8XDJD5f8cMkPl/xwyQ+XeLjEwyUeLvnhkh8u+eFy9Hz0HA+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uR89Hz/FwyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnhcvV89RwPl/xwyQ+X/HDJD5f8cImHSzxc4uGSHy754ZIfLlfP7UtNPFzywyU/XPLDJT9c8sMlHi7xcImHS3645IdLfrhcPbcvNfFwyQ+X/HDJD5f8cMkPl3i4xMMlHi754ZIfLvnhcvXcvtTEwyU/XPLDJT9c8sMlP1zi4RIPl3i45IdLfrjkh8vVc/tSEw+X/HDJD5f8cMkPl/xwiYdLPFzi4ZIfLvnhkh8uV8/tS008XPLDJT9c8sMlP1zywyUeLvFwiYdLfrjkh0t+uFw9ty818XCJh0s8XOLhkh8u8XC5zuH44RIPl3i4xMMlHi7/8nC/85f6y8PFf9MxXdMzhSlNZWrTmPabjowj48g4Mo6MI+PIODKOjCPjyrgyrowr48q4Mq6MK+PKuDKejCfjyXgyvt/t9ef7Pi9+uMLDFR6u8HCFhys8XNmXWvalFh6u+OGKH6744YofrvBwhYcrPFzxwxU/XPHD1Z90Hek6UkbKSBklo2R8PS88XOHhCg9X/HDFD1f8cPXn63nZl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cPVn3Ktxr0bGyBgZI2NkrHu1rmNdx7qOlbGex7pX616te/X9bi88XOHhCg9X/HDFD1f8cGVfatmXWvxwxQ9X/HB1vr+rlX2pxQ9X/HDFD1f8cMUPV/xwxQ9X9qWWfanFD1f8cMUPV+f7u1rZl1r8cMUPV/xwxQ9X/HDFD1f8cGVfatmXWvxwxQ9XeLjCwxUervBwhYcrPFzh4QoPV/xwxQ9X9qUWHq744Yofrvjh6ui5famFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1dHz+1LLTxc8cMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364OnpuX2rh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw9XRc364wsPVWRl6fvXcvtSyL7XwcIWHKzxc3e8cru533l5Xz6+e25daeLi6R4aeXz23L7XsSy08XOHhCg9X98r4ztvr6vnVc/tSCw9X98rQ86vn9qWWfamFhys8XOHh6nqfX+/zq+dXz+1LLTxcXe/zq+dXz+1LLftSCw9XeLjCw9UNGeF56Dk/XPHDFR6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9cXT23L7XwcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744erquX2phYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9XV8/tSy08XPHDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uHp6/vQcD1f8cMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH66enj89x8MVP1zxwxU/XPHDFT9c4eEKD1d4uOKHK3644oerp+dPz/FwxQ9X/HDFD1f8cMUPV3i4wsMVHq744Yofrvjh6un503M8XPHDFT9c8cMVP1zxwxUervBwhYcrfrjihyt+uHp6bl9q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV03P7UgsPV/xwxQ9X/HDFD1f8cIWHKzxc4eGKH6744Yofrp6e25daeLjihyt+uOKHK3644ocrPFzh4QoPV/xwxQ9X/HAVem5fauHhih+u+OGKH6744YofrvBwhYcrPFzxwxU/XPHDVei5famFhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1eh5/alFh6u8HCFhys8XPHDFR6uImT4PsfDFR6u8HCFh6u/PNz+N33nDH95uP+m/GM6pmt6pjClqUxtkpEySkbJKBklo2SUjJJRMkpGyWgZLaNltIyW0TJaRstoGS1jZIwMv9vD9zk/XOHhCg9XeLjCwxUeruxLLftSCw9X/HDFD1f8cMUPV3i4wsMVHq744YofrvjhKvXcvtTCwxU/XPHDFT9c8cMVP1zh4QoPV3i44ocrfrjih6vUc/tSCw9X/HDFD1f8cMUPV/xwhYcrPFzh4Yofrvjhih+uUs/tSy08XPHDFT9c8cMVP1zxwxUeruxLLftSCw9X/HCFhys8XOHhCg9XeLjCwxUervjhih+u+OHKvtSyL7X44YofrvjhKtO98j7nhyt+uOKHK3644ocrfrjihyv7Usu+1OKHK3644oerbPfK+5wfrvjhih+u+OGKH6744YofruxLLftSix+u+OEKD1d4uMLDFR6u8HCFhys8XOHhih+u+OHKvtTCwxU/XPHDFT9clZ7bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cFV6bl9q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cNV6bl9qYWHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV6Xn/HCFh6vyPueHq9Jz+1LLvtTCwxUervBwVc7hynl76XnpuX2phYer8n1eel56bl9q2ZdaeLjCwxUerso5XDlvLz0vPbcvtfBwVb7PS89Lz+1LLftSCw9XeLjCw1V5n5f3eel56bl9qYWHq/I+Lz0vPbcvtexLLTxc4eEKD1flHK6ct/PDFT9c8cMVHq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cMVP1y1ntuXWni44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xw1XpuX2rh4Yofrvjhih+u+OGKH67wcIWHKzxc8cMVP1zxw1XruX2phYcrfrjihyt+uOKHK364wsMVHq7wcMUPV/xwxQ9Xreet53i44ocrfrjihyt+uOKHKzxc4eEKD1f8cMUPV/xw1Xreeo6HK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV63nred4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cNV63nqOhyt+uOKHK3644ocrfrjCwxUervBwxQ9X/HDFD1ej5/alFh6u+OGKH6744YofrvjhCg9XeLjCwxU/XPHDFT9cjZ7bl1p4uOKHK3644ocrfrjihys8XOHhCg9X/HDFD1f8cDV6bl9q4eGKH6744Yofrvjhih+u8HCFhys8XPHDFT9c8cPV6Ll9qYWHK3644ocrfrjihyt+uMLDFR6u8HDFD1f8cMUPV6Pn9qUWHq744Yofrvjhih+u+OEKD1d4uMLDFT9c8cMVP1yNntuXWni4wsMVHq7wcMUPV3i4Gudw/HCFhys8XOHhCg9Xf3m4/W/6zhn+8nD/pjF95wyLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFyeDhan2f88MVHq7wcIWHKzxc4eHKvtSyL7XwcMUPV/xwxQ9X/HCFhys8XOHhih+u+OGKH65Wz+1LLTxc8cMVP1zxwxU/XPHDFR6u8HCFhyt+uOKHK364Wj23L7XwcMUPV/xwxQ9X/HDFD1d4uMLDFR6u+OGKH6744Wr13L7UwsMVP1zxwxU/XPHDFT9c4eHKvtSyL7XwcMUPV3i4wsMVHq7wcIWHKzxc4eGKH6754Zofru1LbftSmx+u+eGaH67/fH9Xa/tSmx+u+eGaH6754Zofrvnhmh+u7Utt+1KbH6754Zofrv98f1dr+1KbH6754Zofrvnhmh+u+eGaH67tS237UpsfrvnhGg/XeLjGwzUervFwjYdrPFzj4Zofrvnh2r7UxsM1P1zzwzU/XP8J9yrdq5SRMlJGykgZ6V6l60jXka6jZJTnUe5VuVflXpWMklEySkbJaPeqXUe7jnYdLaM9j3av2r1q96pljIyRMTJGxrhX4zrGdYzrGBnjeax7te7VulcrY2WsjJWxMta90nM8XOPh+nzncH2+8/Y+en703L7UxsP1+b7P++j50XP7Utu+1MbDNR6u8XB9jozvvL2Pnh89ty+18XB9rgw9P3puX2rbl9p4uMbDNR6uz5Pxvc/76PnRc/tSGw/X58nQ86Pn9qW2famNh2s8XOPh+oSM8Dz0nB+u+eEaD9f8cM0P1/xwzQ/X/HCNh2s8XOPhmh+u+eGaH66PntuX2ni45odrfrjmh2t+uOaHazxc4+EaD9f8cM0P1/xwffTcvtTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+uj5/alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cXz2/eo6Ha3645odrfrjmh2t+uMbDNR6u8XDND9f8cM0P11fPr57j4Zofrvnhmh+u+eGaH67xcI2Hazxc88M1P1zzw/XV86vneLjmh2t+uOaHa3645odrPFzj4RoP1/xwzQ/X/HB99fzqOR6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cXz23L7XxcM0P1/xwzQ/X/HDND9d4uMbDNR6u+eGaH6754frquX2pjYdrfrjmh2t+uOaHa364xsM1Hq7xcM0P1/xwzQ/XV8/tS208XPPDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uH56bl9q4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88P103P7UhsP1/xwzQ/X/HDND9f8cI2Hazxc4+GaH6754Zofrp+e25faeLjGwzUervFwzQ/XeLh+T8aToed4uMbDNR6u//Jw+9/075yh//Jw/6YytWlM+00fJ9Pv42T6fZxMv4+T6ZcyUkbKSBkpI2WUjJJRMkpGySgZJaNklIyS0TJaRstoGS2jZbSMluF3+2vPfDxzPcfDNR6u8XCNh2v7Utu+1MbDNT9c88M1P1zzwzUervFwjYdrfrjmh2t+uH56bl9q4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88N16Ll9qY2Ha3645odrfrjmh2t+uMbDNR6u8XDND9f8cM0P16Hn9qU2Hq754Zofrvnhmh+u+eEaD9f2pbZ9qY2Ha364xsM1Hq7xcI2Hazxc4+EaD9f8cM0P1/xwbV9q25fa/HDND9f8cB3pXnmf88M1P1zzwzU/XPPDNT9c88O1faltX2rzwzU/XPPDdZR75X3OD9f8cM0P1/xwzQ/X/HDND9f2pbZ9qc0P1/xwjYdrPFzj4RoP13i4xsM1Hq7xcM0P1/xwbV9q4+GaH6754ZofrkPP7UttPFzzwzU/XPPDNT9c88M1Hq7xcI2Ha3645odrfrhOPbcvtfFwzQ/X/HDND9f8cM0P13i4xsM1Hq754ZofrvnhOvXcvtTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vUc364xsN1ep/zw3XquX2pbV9q4+EaD9d4uE7ncJmeh56nntuX2ni4Tt/nqeep5/altn2pjYdrPFzj4Tqdw2V5Hnqeem5fauPhOn2fp56nntuX2valNh6u8XCNh+v0Pk/v89Tz1HP7UhsP1+l9nnqeem5fatuX2ni4xsM1Hq7TOVyu56Hn/HDND9d4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cF16bl9q4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88N16bl9qY2Ha3645odrfrjmh2t+uMbDNR6u8XDND9f8cM0P16Xn9qU2Hq754Zofrvnhmh+u+eEaD9d4uMbDNT9c88M1P1yXnpee4+GaH6754Zofrvnhmh+u8XCNh2s8XPPDNT9c88N16XnpOR6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cl56XnuPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPDdel56Tkervnhmh+u+eGaH6754RoP13i4xsM1P1zzwzU/XLee25faeLjmh2t+uOaHa3645odrPFzj4RoP1/xwzQ/X/HDdem5fauPhmh+u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPDdeu5famNh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9et5/alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9ct57bl9p4uOaHa3645odrfrjmh2s8XOPhGg/X/HDND9f8cN16bl9q4+EaD9d4uMbDNT9c4+G6ncPxwzUervFwjYdrPFz/5eH2v+k7Z/jLw/2bwpSmMrVpTN9ZxnycTM/HyfR8nEzPx8n0fJxMz8fJ9HycTM/HyfR8nEzPHxlHxpFxZBwZR8aRcWQcGUfGkXFlXBlXxpVxZVwZfreP73N+uMbDNR6u8XCNh2s8XNuX2valNh6u+eGaH6754ZofrvFwjYdrPFzzwzU/XPPD9ei5famNh2t+uOaHa3645odrfrjGwzUervFwzQ/X/HDND9ej5/alNh6u+eGaH6754ZofrvnhGg/XeLjGwzU/XPPDNT9cj57bl9p4uOaHa3645odrfrjmh2s8XNuX2valNh6u+eEaD9d4uMbDNR6u8XCNh2s8XPPDNT9c88O1faltX2rzwzU/XPPD9fq7mn2pzQ/X/HDND9f8cM0P1/xwzQ/X9qW2fanND9f8cM0P1+vvavalNj9c88M1P1zzwzU/XPPDNT9c25fa9qU2P1zzwzUervFwjYdrPFzj4RoP13i4xsM1P1zzw7V9qY2Ha3645odrfrhePbcvtfFwzQ/X/HDND9f8cM0P13i4xsM1Hq754ZofrvnhevXcvtTGwzU/XPPDNT9c88M1P1zj4RoP13i45odrfrjmh+vVc/tSGw/X/HDND9f8cM0P1/xwjYdrPFzj4Zofrvnhmh+uV8/54RoP1+t9zg/Xq+f2pbZ9qY2Hazxc4+F6ncPtd94+f76ez5+v52Nf6uDh5s/3fT5/vp7Pn6/nY1/q2Jc6eLjBww0ebv4cGd95+/z5ej5/vp6PfamDh5s/R8aRcWVcGV/PBw83eLjBw82fK+N7n8+fr+fz57pXz716Mp6MJ+PJeDKee/Vcx3Mdz3WEjPA8wr0K9yrcq5ARMkJGyAgZ6V6l60jXka4jZaTnke5VulfpXqWMklEySkbJKPeqXEe5jnIdJaM8j3av2r1q96pltIyW0TJaRrtX7TrGdYzrGBnjeYx7Ne7VuFcjY2SMjJWxMta9WtexrmNdx8pYz2PdKz0/eo6HG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPN0fPj57j4YYfbvjhhh9u+OGGH27wcIOHGzzc8MMNP9zww83R86PneLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HBz9PzoOR5u+OGGH2744YYfbvjhBg83eLjBww0/3PDDDT/cHD23L3XwcMMPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744ebouX2pg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83R8/tSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uDl6bl/q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MPN1XP7UgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbq6e25c6eLjBww0ebvBwww83eLi5T8aToed4uMHDDR5u/vJw+3eKf+cM85eH+zdd0zOFKU1latOY9ptSRspIGSkjZaSMlJEyUkbKKBklo2SUjJJRMkpGySgZJaNltIyW0TLa82jPvD1zPcfDDR5u8HCDhxv7Use+1MHDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uLl6bl/q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MPN03P7UgcPN/xwww83/HDDDzf8cIOHGzzc4OGGH2744YYfbp6e25c6eLjhhxt+uOGHG3644YcbPNzYlzr2pQ4ebvjhBg83eLjBww0ebvBwg4cbPNzwww0/3PDDjX2pY1/q8MMNP9zww81L98r7nB9u+OGGH2744YYfbvjhhh9u7Esd+1KHH2744YYfbl65V97n/HDDDzf8cMMPN/xwww83/HBjX+rYlzr8cMMPN3i4wcMNHm7wcIOHGzzc4OEGDzf8cMMPN/alDh5u+OGGH2744ebpuX2pg4cbfrjhhxt+uOGHG364wcMNHm7wcMMPN/xwww83oef2pQ4ebvjhhh9u+OGGH2744QYPN3i4wcMNP9zwww0/3ISe25c6eLjhhxt+uOGHG3644YcbPNzg4QYPN/xwww83/HATes4PN3i4Ce9zfrgJPbcvdexLHTzc4OEGDzcRMsLz0PPQc/tSBw834fs89Dz03L7UsS918HCDhxs83ETJKM9Dz0PP7UsdPNyE7/PQ89Bz+1LHvtTBww0ebvBwE97n4X0eeh56bl/q4OEmvM9Dz0PP7Usd+1IHDzd4uMHDTYyM8Tz0nB9u+OEGDzf8cMMPN/xwww83/HCDhxs83ODhhh9u+OGGH25Sz+1LHTzc8MMNP9zwww0/3PDDDR5u8HCDhxt+uOGHG364ST23L3XwcMMPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744Sb13L7UwcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yeb1PPUczzc8MMNP9zwww0/3PDDDR5u8HCDhxt+uOGHG364ST1PPcfDDT/c8MMNP9zwww0/3ODhBg83eLjhhxt+uOGHm9Tz1HM83PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uEk9Tz3Hww0/3PDDDT/c8MMNP9zg4QYPN3i44Ycbfrjhh5vSc/tSBw83/HDDDzf8cMMPN/xwg4cbPNzg4YYfbvjhhh9uSs/tSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uCk9ty918HDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OGm9Ny+1MHDDT/c8MMNP9zwww0/3ODhBg83eLjhhxt+uOGHm9Jz+1IHDzf8cMMPN/xwww83/HCDhxs83ODhhh9u+OGGH25Kz+1LHTzc4OEGDzd4uOGHGzzclHM4frjBww0ebvBwg4ebvzzc/jd95wx/ebj/pv1jOqZreqYwpalMbZLxcTLTHycz/XEy0x8nM/1xMtMfJzP9cTLTHycz/XEy0x8nM/1HxpFxZBwZR8aRcWQcGUfGkXFkXBlXht/t7fucH27wcIOHGzzc4OEGDzf2pY59qYOHG3644Ycbfrjhhxs83ODhBg83/HDDDzf8cNN6bl/q4OGGH2744YYfbvjhhh9u8HCDhxs83PDDDT/c8MNN67l9qYOHG3644Ycbfrjhhxt+uMHDDR5u8HDDDzf8cMMPN63n9qUOHm744YYfbvjhhh9u+OEGDzf2pY59qYOHG364wcMNHm7wcIOHGzzc4OEGDzf8cMMPN/xwY1/q2Jc6/HDDDzf8cNP+rmZf6vDDDT/c8MMNP9zwww0/3PDDjX2pY1/q8MMNP9zww834u5p9qcMPN/xwww83/HDDDzf8cMMPN/aljn2pww83/HCDhxs83ODhBg83eLjBww0ebvBwww83/HBjX+rg4YYfbvjhhh9uRs/tSx083PDDDT/c8MMNP9zwww0ebvBwg4cbfrjhhxt+uBk9ty918HDDDzf8cMMPN/xwww83eLjBww0ebvjhhh9u+OFm9Ny+1MHDDT/c8MMNP9zwww0/3ODhBg83eLjhhxt+uOGHm9FzfrjBw814n/PDzei5faljX+rg4QYPN3i4Gedw47x99Hz03L7UwcPN+j5fPV89ty917EsdPNzg4QYPN+scbp23r56vntuXOni4Wd/nq+er5/aljn2pg4cbPNzg4Wa9z9f7fPV89dy+1MHDzXqfr56vntuXOvalDh5u8HCDh5t1DrfO2/nhhh9u+OEGDzf8cMMPN/xwww83/HCDhxs83ODhhh9u+OGGH25Wz+1LHTzc8MMNP9zwww0/3PDDDR5u8HCDhxt+uOGHG364WT23L3XwcMMPN/xwww83/HDDDzd4uMHDDR5u+OGGH2744Wb13L7UwcMNP9zwww0/3PDDDT/c4OEGDzd4uOGHG3644Yeb1fPVczzc8MMNP9zywy0/3PLDLR5u8XCLh1t+uOWHW364/fP1fP98PV883PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uP3z9Xz/fD1fPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645Ydbfrj989yr5149GSEjZISMkBHuVbiOcB3hOkJGeB7pXqV7le5VykgZKSNlpIx0r9J1lOso11EyyvMo96rcq3KvSkbJKBkto2W0e9Wuo11Hu46W0Z5Hu1ftXo17NTJGxsgYGSNj3KtxHeM6xnWsjPU81r1a92rdq5WxMlbGytBzfrjFwy0ebvFwyw+3/HDLD7dHz+1LXTzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364PXpuX+ri4RYPt3i4xcMtP9zi4fZcGU+GnuPhFg+3eLj9y8Ptf9O/c4b9y8P9m8a03/RxMns+TmbPx8ns+TiZPR8ns+fjZPaEjJARMkJGykgZKSNlpIyUkTJSRspIGSWjZJSMklEySkbJKBklo2S059GeeXvmeo6HWzzc4uEWD7f2pa59qYuHW3645Ydbfrjlh1s83OLhFg+3/HDLD7f8cHv03L7UxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfbq+f2pS4ebvnhlh9u+eGWH2754RYPt3i4xcMtP9zywy0/3F49ty918XDLD7f8cMsPt/xwyw+3eLi1L3XtS1083PLDLR5u8XCLh1s83OLhFg+3eLjlh1t+uOWHW/tS177U5Ydbfrjlh9sb7pX3OT/c8sMtP9zywy0/3PLDLT/c2pe69qUuP9zywy0/3N5yr7zP+eGWH2754ZYfbvnhlh9u+eHWvtS1L3X54ZYfbvFwi4dbPNzi4RYPt3i4xcMtHm754ZYfbu1LXTzc8sMtP9zyw+3Vc/tSFw+3/HDLD7f8cMsPt/xwi4dbPNzi4ZYfbvnhlh9un57bl7p4uOWHW3645Ydbfrjlh1s83OLhFg+3/HDLD7f8cPv03L7UxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfbp+f8cIuH2+d9zg+3T8/tS137UhcPt3i4xcPtCxnheej503P7UhcPty9k6PnTc/tS177UxcMtHm7xcPtSRnoeev703L7UxcPtKxl6/vTcvtS1L3XxcIuHWzzcPu/z533+9PzpuX2pi4fb533+9PzpuX2pa1/q4uEWD7d4uH0jYzwPPeeHW364xcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb0HP7UhcPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfbkPP7UtdPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645YdbfrgNPbcvdfFwyw+3/HDLD7f8cMsPt3i4xcMtHm754ZYfbvnhNvQ89BwPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfbkPPQ8/xcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754Tb0PPQcD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25Dz0PP8XDLD7f8cMsPt/xwyw+3eLjFwy0ebvnhlh9u+eE29Ny+1MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH29Rz+1IXD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25Tz+1LXTzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364TT23L3XxcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754Tb13L7UxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb1HP7UhcPt3i4xcMtHm754RYPt+kcjh9u8XCLh1s83OLh9i8Pt/9N3znDXx7u31SmNo3pO2fIj5PZ/DiZzY+T2fw4mc2VsTJWxspYGR8ns/VxMlsfJ7P1cTJbHyez9XEyWx8ns/VxMlsfJ7P1cTJbf2QcGUfGkXFkHBlHxpFxZPjdXr7P+eEWD7d4uMXDLR5u8XBrX+ral7p4uOWHW3645YdbfrjFwy0ebvFwyw+3/HDLD7el5/alLh5u+eGWH2754ZYfbvnhFg+3eLjFwy0/3PLDLT/clp7bl7p4uOWHW3645Ydbfrjlh1s83OLhFg+3/HDLD7f8cFt6bl/q4uGWH2754ZYfbvnhlh9u8XBrX+ral7p4uOWHWzzc4uEWD7d4uMXDLR5u8XDLD7f8cMsPt/alrn2pyw+3/HDLD7e17pX3OT/c8sMtP9zywy0/3PLDLT/c2pe69qUuP9zywy0/3La/q9mXuvxwyw+3/HDLD7f8cMsPt/xwa1/q2pe6/HDLD7d4uMXDLR5u8XCLh1s83OLhFg+3/HDLD7f2pS4ebvnhlh9u+eG29dy+1MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH29Zz+1IXD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25bz+1LXTzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364bT3nh1s83Lb3OT/ctp7bl7r2pS4ebvFwi4fbdg7Xzttbz1vP7UtdPNy27/PW89Zz+1LXvtTFwy0ebvFwO87hxnn76PnouX2pi4fb8X0+ej56bl/q2pe6eLjFwy0ebsf7fLzPR89Hz+1LXTzcjvf56PnouX2pa1/q4uEWD7d4uB3ncOO8nR9u+eGWH27xcMsPt/xwyw+3/HDLD7d4uMXDLR5u+eGWH2754Xb03L7UxcMtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb0XP7UhcPt/xwyw+3/HDLD7f8cIuHWzzc4uGWH2754ZYfbkfP7UtdPNzywy0/3PLDLT/c8sMtHm7xcIuHW3645YdbfrgdPR89x8MtP9zywy0/3PLDLT/c4uEWD7d4uOWHW3645Yfb1fPVczzc8sMtP9zywy0/3PLDLR5u8XCLh1t+uOWHW364XT1fPcfDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH29Xz1XM83PLDLT/c8sMtP9zywy0ebvFwi4dbfrjlh1t+uF09ty918XDLD7f8cMsPt/xwyw+3eLjFwy0ebvnhlh9u+eF29dy+1MXDLT/c8sMtP9zywy0/3OLhFg+3eLjlh1t+uOWH29Vz+1IXD7f8cMsPt/xwyw+3/HCLh1s83OLhlh9u+eGWH25Xz+1LXTzc8sMtP9zywy0/3PLDLR5u8XD78XD//zr/dw73m47pmp4pTOm/LVObxiTjX89/0zFd0zPJ+Hfe/pvK1KYxybiu47qO6zqujCvjyrgyruu4ruPKeK7j1/P9b/rvnOE3PVOY0lSmNo1pv+kfJ/ObjklGyAgZISNkhIyQETJSRspIGSkjZaSMlJEyUkbKKBklo2SUjJJRMsrzKM+8PPPyPNrzaP+u2r+r9szbM2/PvGW0Z96eecsYGSNjZIyMkTEyRsa4jnEdI2NlrIyVsTL+9fw36eDq4LqOlfHvvP3/Z296fvT86PnHw/2mMKWpTG0a03cdR8+Pnn9+uN/0TGFKU5lkHBl6/vnhfpOMe02u47qO6zr0/PPD/aYxuVfPvXoynown48l4Mp579VzHcx3PdYSM8DzCvQr3KtyrkBEyQkbICBnpXqXrSNeRriNlpOeR7lW6V+lepYySUTJKRsko96pcR7mOch16/vnh/j+1e9XuVbtXev7xcL9JRsvQ86PnR8+Pnh89//xwv8nz0POj50fPPx7uN8nQ86PnR8+Pnh89P3p+9Pzzw/0mz0PPj55fPf94uN90Tc8UpjSVqU1j+q7j88P9pmO6pmcKk4wjQ8+vnl89v3p+9fzq+dXz631+vc+vnl89v3p+vc+v9/nV86vnV8+vnl89v3p+9fw+Gc/z0POr51fPPx7uN8nQ86vnV8+vnl89v3p+9fymjPQ89Pzq+dXzj4f7TTL0/Or51fOr51fPr55fPb/e59f7/Or51fOr59f7/HqfXz2/en71/Or51fOr51fP78gYz0PPr55fPf94uN8kQ8+vnl89v3p+9fzq+dXzzw/3mzwPPb96fvX8+t3++eF+0zFd0zOFKU1latOX8fnh/j/p+dPzp+fP7/bPD/ebZOj50/On50/Pn54/PX9+t39+uN8UpjSVSYbf7U/Pn54/PX96/vT86fnT888P95va5F7p+dPzj4f7TTL0/On50/On50/Pn54/Pf/8cL/J89Dzp+dPzz8e7jfJ0POn50/Pn54/PX96/vT888P9Js9Dz5+ePz1/frc/v9ufnj89f3r+9Pzp+dPzp+efH+43eR56/vT86fnzu/3zw/0mGXr+9Pzp+dPzp+dPzz8/3G/yPPT86fnT8+d3++eH+01fRuh56Hnoeeh56Hno+eeH+01tGtN3r0LPw+/28H0eeh56Hnoeeh56Hnoeeh6+z8P3eeh56Hnoefjd/vnhfpMMPQ89Dz0PPQ89Dz3//HC/KU3ulZ6Hnoff7Z8f7jfJ0PPQ89Dz0PPQ89Dzzw/3mzwPPQ89Dz0Pv9s/P9xvkqHnoeeh56Hnoeeh558f7jd5Hnoeeh56Hn63h56H93l4n4eeh9/t0TJ8n4eeh56Hnof3+V8e7u/5y18eLv6bjumanilMaSpTm8b0nWXEylgZK2NlrIyVsTJWxsrYLyP//DEd0zU9U5jSVKY2jUnGkXFkHBlHht/t6fs8fZ+nnqeep56n93l6n6eep56nnqeep56nnqeep56nnqeef3643yRDz1PPU8/T7/b0fZ56nnqeep56nnqeep56/vnhflObxvT1I/U8/W5P3+ep56nnqeep56nnqeep558f7jcdk3ul56nn6Xd7+j5PPf/8cL9Jhvd56nl6n6f3eep5OodL53AfD/eb3Cu/29P3efo+T+dw6X2e3ufpfZ7e5+l9ns7hPj/c/6d1r9a98j5Pv9vT93n6Pk/ncOl9nt7n6X1e3uflfV7O4cp5ezlvrz9pKlP7b8ckwzlceZ+X93l5n5f3eXmfl56X8/Zy3v7xcP+fvM9Lz8v3efk+L+dwpeel56Xnpeel5+Uc7vPD/Sb3Ss9Lz8vv9vJ9Xnpeel56Xnpeel56XnpezuE+P9xvcq/0vPS8/G4v3+el56Xnpeel56Xnpeel5+Uc7vPD/X/S89Lz0vPyu718n5eel56Xnpeel56Xnpeel/d5eZ+Xnpeel56X93l5n5eel56Xnpeel56Xnpeel3O4ct5eel56XnpefreX7/PS89Lz0vPS89Lz0vPS83YO187bW89bz1vP2+/29n3eet563nreet563nreet7e5+193nreet563t7n7X3eet563nreet563nreet7O4dp5e+t563nrefvd3r7PW89bz1vPW89bz1vPW8/bOVw7b289bz1vPW+/29v3eet563nreet563nreet5O4dr5+2t563nreftd3v7Pm89bz1vPW89bz1vPW89b7/b23l763nreet5+93efre3nreet563nreet563nrdzuHbe3nreet563r7P2/d563nreet563nreet563k7h2vn7aPno+ej5+P7fHyfj56Pno+ej56Pno+ej56Pc7hx3j56Pno+ej5+t4/f7aPno+ej56Pno+ej56Pn4xxunLePno+ej56P3+3j+3z0fPR89Hz0fPR89Hz0fJzDjfP20fPR89Hz8bt9fJ+Pno+ej56Pno+ej56Pno9zuHHePno+ej56Pn63j+/z0fPR89Hz0fPR89Hz0fPxfT6+z0fPR89Hz8fv9nEON3o+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Pz/c78r70PPQ89Dzj4f7XcnQ89Dz0PPQ89Dz0PPQ888P97vyPvQ89Dz0/OPhflcy9Dz0PPQ89Dz0PPQ89Pzzw/2uvA89Dz0PPf94uN+VDD0PPQ89Dz0PPQ89Dz3//HC/K+9Dz0PPQ88/Hu53JUPPQ89Dz1PPU89Tz1PPPz/c76qtxupaPSsZR4aep56nnqeep56nnqeef36439X3PlLPU89Tz9Pv9tTzdJ6n8zz1PP1uz5CRMvQ89Tz1PJ3nfzzc/rf6757hd3WtntV+q3+czO/qWIVVWpVVW8koGSWjZLSMltEyWkbLaBkto2W0jJYxMkbGyBgZI2NkjIyRMTJGht/teb3z653reep56nk6z9N5nnqeep56nnqeep56nnqeep56nnr++eF+VzL0PPU89Tz9bv/8cL8rGXqeep56nnpeel56/vnhfldpVVZtNVbXv31WMvS89Lz0vPS89Lz0/PPD/a6u1bP69qr0vPxuL9/npeefH+53JcN5XnpezvNynpeef36435W9SnvlPC+/28v3efk+/3i435UM53k5z8t5Xs7zzw/3u/I+yl6VvXKel9/t5fu8fJ9/frjflQzneTnPy3lezvPPD/e78j7GXo29cp6X3+3l+7x8n39+uN+VDOd5Oc/LeV7O89Lzzw/3u7JX1145z0vPy/d5+T7/eLjflQw9Lz0vPS89//xwvyvvQ89Lz0vPy+/28n1eel56Xnpeel56Xnpeet7u4T4/3O8qrNKqrNq/Hatr9axk6Hnreet563m7h/v8cL+rsbpWz0qG7/PW89bz1vPW89bz1vPW83aet/O89bz1vPW8neftPG89bz1vPW89bz1vPW89b/dwXd6Hnreet5633+3t+7z1vPW89bz1vPW89bz1vN3DdXsfet563nrefre37/PW89bz1vPW89bz1vPW83aet/O89bz1vPW8neftPG89bz1vPW89bz1vPW89b/dw/bwPPW89bz1vv9vb93nreet563nreet563nrebuHa/fto+ej56Pn43f7+D4fPR89Hz0fPR89Hz0fPR/3cOO+ffR89Hz0fPxuH9/no+ej56Pno+ej56Pno+fjd/u4bx89Hz0fPR+/28fv9tHz0fPR89Hz0fPR89HzcQ837ttHz0fPR8/H9/n4Ph89Hz0fPR89Hz0fPR89H/dw47599Hz0fPR8fJ+P7/PR89Hz0fPR89Hz0fPR83EPN+7bR89Hz0fPx+/28bt99Hz0fPR89Hz0fPR89Hzcw4379tHz0fPR8/G7fXyfj56Pno+ej56Pno+ej56Pe7hx3z56Pnp+9fz63X59n189v3p+9fzq+dXzq+dXz697uOu+/er51fOr59fv9uv7/Or51fOr51fPr55fPb96fn2fX9/nV8+vnl89v363X/dwV8+vnl89v3p+9fzq+dXz6x7uum+/en71/Or59bv9uoe7en71/Or51fOr51fPr55f93DXffvV86vnV8+v3+3XPdzV86vnV8+vnl89v3p+9fy6h7vu26+eXz2/en79br96fp3n13l+9fz63X7dw13f51fPr55fPb/O8z8ebv9bffcMfzzcv9VYXatn9d0z3P2xOlZhlVYyVsbKWBkrY7+M9/NjdazCKq3Kqq3G6lo9KxlHxpFxZBwZR8aRcWQcGX63P9/nz/f50/On50/Pn/P8Oc+fnj89f3r+9Pzp+dPzp+dPz5+ePz1/7tuf+/an50/Pn54/v9uf7/On50/Pn54/PX96/vT86flz3/7ctz89f3r+9Pz53f58nz89f3r+9Pzp+dPzp+dPz5/79ue+/en50/On58/v9uf7/On5c9/+nOfPef70/DnPn/P86flzD/fcwz1/V3vO8+d3+/N9/nyfP/dwz3n+nOfPef6c5895/tzDPfftz33783e15zx/frc/3+fP9/m6h1vn+TrP13m+zvN1nq97uHXfvu7b19/V1nm+frev7/P1fb7u4dZ5vs7zdZ6v83yd56vn67593bevv6ut83z1fH2fr+/zdQ+3er56vnq+er56vu7h1t/VVs9Xz1fP1+/29X2+er56vnq+er56vnq+er7u4dbf1VbPV89Xz9fv9vV9vnq+er56vnq+er56vnq+7uHW39VWz1fPV8/X7/b1fb56vnq+er56vnq+er56vs7zdZ6vnq+er56v83yd56vnq+er56vnq+er56vn6x5u3bevnq+er56v3+3r+3z1fPX8m5f6/1/UX88PHu7g4Q4e7vx893Dn57tvPz9fz8/P1/PzzUv9Xck4Mo6MI+PI+Hp+8HAHD3fwcOfnyPjO8/Pz9fz8fD0/37zU35WMkBEyQkbI+Hp+8HAHD3fwcOcnZXz37efzw/2u7FXaq5SRMlJGySgZZa/Kc5TnKM9RMsr7KHtV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0znc54f7Te6Vnqeep9/t6fs89Tz1PPU89Tz1PPU89Tydw31+uN/kXul56nn63Z6+z1PPU89Tz1PPU89Tz1PP0/d5+j5PPU89Tz1Pv9vTOVzqeep56nnqeep56nnqeTqH+/xwv8m90vPU8/S7vZzDlZ6Xnpeel56Xnpeel56Xc7hy3l56Xnpeel5+t5dzuNLz0vPS89Lz0vPS89Lzcg5XzttLz0vPS8/L7/bS8/I+L+/z0vPyu72cw5Xv89Lz0vPS8/I+/8vD/T1/+cvDxX/TMV3TM4UpTWVq05i+s4xKGSkjZaSMlJEyUkbKSBkpo2SUjJJRMkpGySgZJaNklIyW0TJaRsvwu718n5fv89Lz0vPS8/I+L+/z0vPS89Lz0vPS89Lz0vPS89Lz0vNy3l7O20vPS89Lz8vv9vJ9Xnreet563nreet563nreztvbeXvreet563n73d6+z1vPW89bz1vPW89bz1vP23l7O29vPW89bz1vv9vb93nreTtvb+/z9j5vPW/v8/Y+bz1v53DtHK79Xa29z9vv9vZ93r7P2zlce5+393l7n7f3eXuft3O4dt7eztvb39Xa+7z9bm/f5+37vJ3Dtfd5e5+393l7n7f3eTuHa+ft7by9/V2tvc/b7/b2fd6+z9s5XHuft/d5e5+393l7n7eet/P2dt7e/q7W3uet5+37vH2ft3O41vPW89bz1vPW83YO1/6u1nreet563n63t+/z1vPW89bz0fPR89Hz0fNxDjf+rjZ6Pno+ej5+t4/v89Hz0fPR89Hz0fPR89HzcQ43/q42ej56Pno+freP7/PR89Hz0fPR89Hz0fPR8/E+H+/z0fPR89Hz8T4f7/PR89Hz0fPR89Hz0fPR83EON87bR89Hz0fPx+/28X0+ej56Pno+ej56Pno+ej7O4cZ5++j56Pno+fjdPr7PR89Hz0fPR89Hz0fPR8/H+3y8z0fPR89Hz8f7fLzPR89Hz0fPR89Hz0fPR8/HOdw4bx89Hz0fPR+/28f3+ej56Pno+ej56Pnq+er5Oodb5+2r56vnq+frd/v6Pl89Xz1fPV89Xz1fPV89X+dw67x99Xz1fPV8/W5f3+er56vnq+er56vnq+er5+t3+zpvXz1fPV89X7/b1+/21fPV89Xz1fPV89Xz1fN1DrfO21fPV89Xz9f3+fo+Xz1fPV89Xz1fPV89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3nreet5+t7ff7a3nreet563nreet563n4xxunLePno+ej56P7/PxfT56Pno+ej56Pno+ej56Ps7hxnn76Pno+ej5+D4f3+ej56Pno+ej56Pno+ej5+Mcbpy3j56Pno+ej9/t43f76Pno+ej56Pno+ej56Pk4hxvn7aPno+ej5+N3+/g+Hz0fPR89Hz0fPR89Hz0f53DjvH30fPR89Hz8bh/f56Pno+ej56Pno+ej56Pn4xxunLePno+ej56P3+3j+3z0fPR89Hz0fPR89Hz0fHyfj+/z0fPR89Hz8bt9nMONno+ej56Pno+ej56Pno9zuHHevnq+er56vn63r3O41fPV89Xz1fPV89Xz1fN1DrfO21fPV89Xz9fv9nUOt3q+er56vnq+er56vnq+zuHWefvq+er56vn63b56vt7n632+er5+t69zuPV9vnq+er56vt7nf3m4/W/6zhn+8nD/pjK1aUzfOcPiZBYnsziZxcksTmZxMouTWZzM4mQWJ7M4mcXJLE5mcTKLk1mczOJkFiezOJnFySxOZnEyi5NZnMziZBYnsziZxcms3+3r+3x9n6+er56vnq/3+Xqfr56vnq+er56vnq+er56vnq+er56v8/Z13r56vl/Pz7cv9Tf9yzifH+43PVOY0lSmNo1pv+nI+M7bz+eH+03PFCYZR8aRcWQcGV/PDx7u4OEOHu58frjflKYytWlMMp6MJ+PJeDKee/Vcx3Mdz3U8Gc/zCPcq3Ktwr0JGyAgZISNkhHsVriNdR7qOlJGeR7pX6V6le5UyUkbKKBklo9yrch3lOsp1lIzyPMq9Kveq3auW0TJaRstoGe1eteto19GuY2SM5zHu1bhX416NjJExMkbGyFj3al3Huo51HStjPY91r9a9Wvfq+91+Pj/cbzqma3qmMKWpTG36Mj4/3E8K98d0TNck48jQ86PnR8+PnuPhDh7u4OHO54f7Tc8UpjSVScaVoedHz4+eHz3Hwx083MHDnc8P95va5F7p+dFzPNw5IUPPj54fPT96joc7eLiDhzsnZaTnoedHz4+e4+HOSRl6fvT86PnRczzcwcMdPNw5JaM8Dz0/en70HA93TsvQ86PnR8+PnuPhDh7u4OHOaRnteej50fOj53i4c0aGnh89P3p+9BwPd/BwBw93zspYz0PPj54fPcfDnc8P95u+jKvnV8+vnuPhDh7u4OHO54f7TW0a03evrp7j4c7nh/tNMvT86vnVczzcwcMdPNz5/HC/6Ziu6ZnCJOPK0POr51fPr57j4Q4e7uDhzueH+01pcq/0/Oo5Hu58frjfJEPPr55fPcfDHTzcwcOdzw/3mzwPPb96fvUcD3c+P9xvkqHnV8+vnuPhDh7u4OHO54f7TZ6Hnl89v3qOhzufH+43ydDzq+dXz/FwBw938HDn88P9Js9Dz6+eXz3Hw53PD/ebZOj51fOr53i4g4c7eLjz+eF+k+eh51fPr57j4c7nh/tNMvT86vnTczzcwcMdPNz5/HC/KU1latOYZBwZev70/On503M83MHDHTzc+fxwv+l7Hk/Pn54/PcfDnc8P95tk6PnT86fneLiDhzt4uPP54X7TM7lXev70HA93Pj/cb5Kh50/Pn57j4Q4e7uDhzueH+02eh54/PX96joc7nx/uN8nQ86fnT8/xcAcPd/Bw5/PD/SbPQ8+fnj89x8Odzw/3m2To+dPzp+d4uIOHO3i48/nhfpPnoedPz5+e4+EOHu7g4Q4e7jw9x8OdNzJGhp7j4Q4e7uDhzl8ebv+b/p0znL883L8pTGkqU5vG9O8s48THyZz4OJkTHydz4uNkTnyczImPkznxcTInPk7mxMfJnPgj48g4Mo6MI+PIODKOjCPjyDgyrowr48q4Mq6MK8Pv9vB9Hr7P8XAHD3fwcAcPd/BwJ/Q89BwPd0LPQ89Dz0PP8XAHD3fwcOfzw/0mGXoeeh56joc74fs89Dz0PPQ89BwPd/BwBw93Pj/cb/r+WxJ6Hnoeeo6HO+H7PPQ89Dz0PPQcD3fwcAcPdz4/3G96JvdKz0PP8XAnfJ+Hnn9+uN8kw/scD3fC+zy8z/Fw5/PD/Sb3atwr73M83MHDHTzcwcOd8D4P7/PwPg/v8/A+T+dwnx/uN13TM4Up/bNlatOYZHifp/d5ep+n93k6h/v8cL+pTG0akwzf5+n7PJ3Dpfd5ep+n93l6n6f3eer554f7ic3dq+deeZ/j4Q4e7uDhDh7u4OFO6nnqeeo5Hu6kc7jPD/eb3Cs9Tz3Hw530fZ56nnqeep56joc7eLiDhzvpHO7zw/0m90rPU8/xcCd9n6eep56nnqee4+EOHu7g4U46h/v8cL/JvdLz1HM83Enf56nnqeep56nneLiDhzt4uJPe5+l9nnqeep56joc76X2eep56nnqeeo6HO3i4g4c76RwunbeXnpeel57j4U75Pi89Lz0vPS89x8MdPNzBw51yDlfO20vPS89Lz/Fwp3yfl56Xnpeel57j4Q4e7uDhTnmfl/d56Xnpeek5Hu6U93npeel56XnpOR7u4OEOHu6Uc7hy3l56Xnpeeo6HO+X7vPS89Lz0vPQcD3fwcAcPd8o5XDlvLz0vPS89x8Od8n1eel56Xnpeeo6HO3i4g4c75RyunLeXnpeel57j4U75Pi89Lz0vPS89x8MdPNzBw53yu72ct5eel56XnuPhTvndXnpeel56XnqOhzt4uIOHO+Ucrpy3l56Xnree4+FO+z5vPW89bz1vPcfDHTzcwcOddg7Xzttbz1vPW8/xcKd9n7eet563nree4+EOHu7g4U47h2vn7a3nreet53i40363t563nreet57j4Q4e7uDhTjuHa+ftreet563neLjTvs9bz1vPW89bz/FwBw938HCnncO18/bW89bz1nM83Gnf563nreet563neLiDhzt4uNPO4dp5e+t563nrOR7utO/z1vPW89bz1nM83MHDHTzcad/n7fu89bz1vPUcD3faOVzreet563nrOR7u4OEOHu60c7h23t563nreeo6HO+McbvR89Hz0fPQcD3fwcAcPd8Y53DhvHz0fPR89x8OdcQ43ej56Pno+eo6HO3i4g4c74xxunLePno+ej57j4Q4e7uDhDh7ujJ7j4c44hxvf53i4g4c7eLiDhzt/ebi/5y9/ebj4bzqma3qmMKWpTG0a03eWMSkjZaSMlJEyUkbKSBkpI2WUjJJRMkpGySgZJaNklIyS0TJaRstoGX63j+/z8X2Ohzt4uIOHO3i4g4c7o+ej53i4M3o+ej56PnqOhzt4uIOHO+O8fZy3j56Pno+e4+HO+D4fPV89Xz1fPcfDHTzcwcOddd6+zttXz1fPV8/xcGd9n6+er56vnq+e4+EOHu7g4c46b1/n7avnq+er53i4s77PV8/Xeft6n6/3OR7urPf5ep/j4c46h8PDHTzcwcP9j6hzSXJkV5bklir8C9//xrpf3kPVGUZlEmC5MRJUUXzwcB883AcP98HDfcf3+fF9fnyfH9/nx/f5cQ53nLcf5+3H72rH9/nx3n78fX78fX6cwx3f58f3+fF9fnyfH9/nxznccd5+nLcfv6sd3+fHe/vx9/nx9/lxDnd8nx/f58f3+fF9fnyfH3N+nLfDw33wcB883AcP98HDffBwHzzcBw/3HXN+zPkx5/Bw33EOd/yudsz5MefHnMPDfcff58ecH3OOHy7wwwU8XMDDBTxc4IcL/HCBHy7+/eY8fvel/t+KjI+Mj4yPjI+M35wHPFzAwwU8XOCHC/xwgR8u/v3mPH73pf7fiowgI8gIMoKM35wHPFzAwwU8XOCHC/xwgR8u/iV7lexVkpFkJBlFRpFR7FXxHMVzFM9RZBSfR7FXxV41e9VkNBlNRpPRZDR71TxH8xzNcwwZw+cx7NWwV8NeDRlDxpAxZAwZy14tz7E8x/IcS8byeSx7tezVsldLxiPjkfHIeGQ89urxHI/neDzHI+PxeRx7dezVsVdHxpFxZBwZR8axV8w5PFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jh4mPOP+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jhIpjzYM7h4QI/XOCHC/xwgR8u8MMFPFzAwwU8XOCHC/xwgR8ugjkP5hweLvDDBX64wA8X+OECP1zAwwU8XMDDBX64wA8X+OEimPNgzuHhAj9c4IcL/HCBHy7wwwU8XMDDBTxc4IcL/HCBHy6COQ/mHB4u8MMFfrjADxf44QI/XMDDBTxcwMMFfrjADxf44SKY82DO4eECP1zghwv8cIEfLvDDBTxcwMMFPFzghwv8cIEfLoI5D+YcHi7g4QIeLuDhAj9cwMNFPDIeGcw5PFzAwwU8XPzxcPe/1X/nDPHHw/1vdf9YfayCVbIqVs1qWC0rMn6cTOSPk4n8cTKRP04m8sfJRP44mcgfJxP542Qif5xM5I+TifxHxkfGR8ZHxkfGR8ZHxkfGR8ZHxkdGkBFk8N6ev7/PAz9cwMMFPFzAwwU8XMDDRTLnyZzDwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jhIpnzZM7h4QI/XOCHC/xwgR8u8MMFPFzAwwU8XOCHC/xwgR8ukjlP5hweLvDDBX64wA8X+OECP1zAwwU8XMDDBX64wA8X+OEimfNkzuHhAj9c4IcL/HCBHy7wwwU8XCTf58n3OTxc4IcLeLiAhwt4uICHC3i4gIcLeLjADxf44QI/XCTf58n3OX64wA8X+OEif7+rRfF9jh8u8MMFfrjADxf44QI/XOCHi+L7vPg+xw8X+OECP1zU73e1KL7P8cMFfrjADxf44QI/XOCHC/xwUXyfF9/n+OECP1zAwwU8XMDDBTxcwMMFPFzAwwU8XOCHC/xwUcw5PFzghwv8cIEfLoo5L+YcHi7wwwV+uMAPF/jhAj9cwMMFPFzAwwV+uMAPF/jhopjzYs7h4QI/XOCHC/xwgR8u8MMFPFzAwwU8XOCHC/xwgR8uijkv5hweLvDDBX64wA8X+OECP1zAwwU8XMDDBX64wA8X+OGimHP8cAEPF8X3OX64KOa8mPNizuHhAh4u4OGijozj82DOizkv5hweLpq/z5s5b+a8mfNmzuHhAh4u4OGiOYfr33l7NHPezHkz5/Bw0fx93sx5M+fNnDdzDg8X8HABDxfN93nzfd7MeTPnzZzDw0Xzfd7MeTPnzZw3cw4PF/BwAQ8XzTlc/87bAz9c4IcL/HABDxf44QI/XOCHC/xwgR8u4OECHi7g4QI/XOCHC/xw0cx5M+fwcIEfLvDDBX64wA8X+OECHi7g4QIeLvDDBX64wA8XzZw3cw4PF/jhAj9c4IcL/HCBHy7g4QIeLuDhAj9c4IcL/HDRzHkz5/BwgR8u8MMFfrjADxf44QIeLuDhAh4u8MMFfrjADxfNnDdzDg8X+OECP1zghwv8cIEfLuDhAh4u4OECP1zghwv8cDHM+TDn8HCBHy7wwwV+uMAPF/jhAh4u4OECHi7wwwV+uMAPF8OcD3MODxf44QI/XOCHC/xwgR8u4OECHi7g4QI/XOCHC/xwMcz5MOfwcIEfLvDDBX64wA8X+OECHi7g4QIeLvDDBX64wA8Xw5wPcw4PF/jhAj9c4IcL/HCBHy7g4QIeLuDhAj9c4IcL/HAxzPkw5/BwgR8u8MMFfrjADxf44QIeLuDhAh4u8MMFfrjADxfDnA9zDg8X+OECP1zghwv8cIEfLuDhAh4u4OECP1zghwv8cDHM+TDn8HCBHy7wwwV+uMAPF/jhAh4u4OECHi7wwwV+uMAPF8ucL3MODxf44QI/XOCHC/xwgR8u4OECHi7g4QI/XOCHC/xwscz5MufwcAEPF/BwAQ8X+OECHi6Wczj8cAEPF/BwAQ8X8HDxx8Pd/1a/c4Y/Hu6/1WP1O2fYHycT++NkYn+cTOyPk4n9cTKxP04mtsgoMoqMIqPJaDKajCajyWgymowmo8loMoaMIWPIGDKGjCFjyBgyhowhg/f25e9z/HABDxfwcAEPF/BwAQ8Xy5wvcw4PF/jhAj9c4IcL/HABDxfwcAEPF/jhAj9c4IeLZc6XOYeHC/xwgR8u8MMFfrjADxfwcAEPF/BwgR8u8MMFfrh4zPljzuHhAj9c4IcL/HCBHy7wwwU8XMDDBTxc4IcL/HCBHy4ec/6Yc3i4wA8X+OECP1zghwv8cAEPF4/v88f3OTxc4IcLeLiAhwt4uICHC3i4gIcLeLjADxf44QI/XDy+zx/f5/jhAj9c4IeLx+9qj+9z/HCBHy7wwwV+uMAPF/jhAj9cPL7PH9/n+OECP1zgh4vH72qP73P8cIEfLvDDBX64wA8X+OECP1w8vs8f3+f44QI/XMDDBTxcwMMFPFzAwwU8XMDDBTxc4IcL/HDxmHN4uMAPF/jhAj9cPOb8MefwcIEfLvDDBX64wA8X+OECHi7g4QIeLvDDBX64wA8Xx5wfcw4PF/jhAj9c4IcL/HCBHy7g4QIeLuDhAj9c4IcL/HBxzPkx5/BwgR8u8MMFfrjADxf44QIeLuDhAh4u8MMFfrjADxfHnOOHC3i4OL7P8cPFMefHnB9zDg8X8HABDxfHOdxx3n7M+THnx5zDw8Xx9/kx58ecH3N+zDk8XMDDBTxcHOdwx3n7MefHnB9zDg8Xx9/nx5wfc37M+THn8HABDxfwcHF8nx/f58ecH3N+zDk8XBzf58ecH3N+zPkx5/BwAQ8X8HBxnMMd5+344QI/XOCHC3i4wA8X+OECP1zghwv8cAEPF/BwAQ8X+OECP1zih8t/vzlP7ktNeLjED5f44RI/XOKHS/xwCQ+X8HAJD5f44RI/XOKHy3+/OU/uS014uMQPl/jhEj9c4odL/HAJD5fwcAkPl/jhEj9c4ofLf8FeJXuVZCQZSUaSkWQke5U8R/IcyXMUGcXnUexVsVfFXhUZRUaRUWQUGc1eNc/RPEfzHE1G83k0e9XsVbNXTcaQMWQMGUPGsFfDcwzPMTzHkDF8HsteLXu17NWSsWQsGUvGkrHs1fIcj+d4PMcj4/F5PPbqsVePvXpkPDIeGUfGkXHs1fEcx3Mcz3FkHJ/HsVfMOfelJjxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw+XHnHNfasLDJX64xA+X+OESP1zih0t4uISHS3i4xA+X+OESP1x+zDn3pSY8XOKHS/xwiR8u8cMlfriEh0t4uISHS/xwiR8u8cPlx5xzX2rCwyV+uMQPl/jhEj9c4odLeLiEh0t4uMQPl/jhEj9cfsw596UmPFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHD5cecc19qwsMlPFzCwyU8XOKHS3i4/JaMJYM5h4dLeLiEh8s/Hu7+t/rvnCH/eLj/VsNqWT1W91v9OJn8fpxMfj9OJr8fJ5PfkXFkHBlHxpHx42QyfpxMxo+TyfhxMhk/Tibjx8lk/DiZjB8nk/HjZDJ+nEzGPzI+Mj4yPjI+Mj4yPjI+Mj4yfu/tGb+/zxM/XMLDJTxcwsMlPFzCwyX3pSb3pSY8XOKHS/xwiR8u8cMlPFzCwyU8XOKHS/xwiR8ugznnvtSEh0v8cIkfLvHDJX64xA+X8HAJD5fwcIkfLvHDJX64DOac+1ITHi7xwyV+uMQPl/jhEj9cwsMlPFzCwyV+uMQPl/jhMphz7ktNeLjED5f44RI/XOKHS/xwCQ+X3Jea3Jea8HCJHy7h4RIeLuHhEh4u4eESHi7h4RI/XOKHS/xwyX2pyX2piR8u8cMlfriMY6/4PscPl/jhEj9c4odL/HCJHy7xwyX3pSb3pSZ+uMQPl/jhMn+/qyX3pSZ+uMQPl/jhEj9c4odL/HCJHy65LzW5LzXxwyV+uISHS3i4hIdLeLiEh0t4uISHS3i4xA+X+OGS+1ITHi7xwyV+uMQPl8mcc19qwsMlfrjED5f44RI/XOKHS3i4hIdLeLjED5f44RI/XCZzzn2pCQ+X+OESP1zih0v8cIkfLuHhEh4u4eESP1zih0v8cJnMOfelJjxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw2Uy5/jhEh4uk+9z/HCZzDn3pSb3pSY8XMLDJTxc5pFxfB7MeTLn3Jea8HCZRwZznsw596Um96UmPFzCwyU8XNbvHC7rd96exZwXc859qQkPl8Xf58WcF3POfanJfakJD5fwcAkPl8X3efF9Xsx5Mefcl5rwcFl8nxdzXsw596Um96UmPFzCwyU8XFaS8TtvT/xwiR8u8cMlPFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHDZTHn3Jea8HCJHy7xwyV+uMQPl/jhEh4u4eESHi7xwyV+uMQPl8Wcc19qwsMlfrjED5f44RI/XOKHS3i4hIdLeLjED5f44RI/XBZzzn2pCQ+X+OESP1zih0v8cIkfLuHhEh4u4eESP1zih0v8cFnMeTHn8HCJHy7xwyV+uMQPl/jhEh4u4eESHi7xwyV+uMQPl82cN3MOD5f44RI/XOKHS/xwiR8u4eESHi7h4RI/XOKHS/xw2cx5M+fwcIkfLvHDJX64xA+X+OESHi7h4RIeLvHDJX64xA+XzZw3cw4Pl/jhEj9c4odL/HCJHy7h4RIeLuHhEj9c4odL/HDZzDn3pSY8XOKHS/xwiR8u8cMlfriEh0t4uISHS/xwiR8u8cNlM+fcl5rwcIkfLvHDJX64xA+X+OESHi7h4RIeLvHDJX64xA+XzZxzX2rCwyV+uMQPl/jhEj9c4odLeLiEh0t4uMQPl/jhEj9cNnPOfakJD5f44RI/XOKHS/xwiR8u4eESHi7h4RI/XOKHS/xwOcw596UmPFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHD5TDn3Jea8HAJD5fwcAkPl/jhEh4uh3M4/HAJD5fwcAkPl/Bw+cfD3f9Wv3OGPx7uv1WxalbDalk9Vr+zjPlxMjk/TianyCgyiowio8goMoqMIqPJaDKajCajyWgymowmo8loMoaMIWPIGDKGjCGD9/bh73P8cAkPl/BwCQ+X8HAJD5fcl5rcl5rwcIkfLvHDJX64xA+X8HAJD5fwcIkfLvHDJX64HOac+1ITHi7xwyV+uMQPl/jhEj9cwsMlPFzCwyV+uMQPl/jhcplz7ktNeLjED5f44RI/XOKHS/xwCQ+X8HAJD5f44RI/XOKHy2XOuS814eESP1zih0v8cIkfLvHDJTxccl9qcl9qwsMlfriEh0t4uISHS3i4hIdLeLiEh0v8cIkfLvHDJfelJvelJn64xA+X+OFy+V2N+1ITP1zih0v8cIkfLvHDJX64xA+X3Jea3Jea+OESP1zih8vldzXuS038cIkfLvHDJX64xA+X+OESP1xyX2pyX2rih0v8cAkPl/BwCQ+X8HAJD5fwcAkPl/BwiR8u8cMl96UmPFzih0v8cIkfLpc5577UhIdL/HCJHy7xwyV+uMQPl/BwCQ+X8HCJHy7xwyV+uFzmnPtSEx4u8cMlfrjED5f44RI/XMLDJTxcwsMlfrjED5f44fIx59yXmvBwiR8u8cMlfrjED5f44RIeLuHhEh4u8cMlfrjED5ePOccPl/Bw+fg+xw+XjznnvtTkvtSEh0t4uISHy8c53OO8/THnjznnvtSEh8vH3+ePOX/MOfelJvelJjxcwsMlPFw+zuEe5+2POX/MOfelJjxcPv4+f8z5Y865LzW5LzXh4RIeLuHh8vF9/vg+f8z5Y865LzXh4fLxff6Y88ecc19qcl9qwsMlPFzCw+XjHO5x3o4fLvHDJX64hIdL/HCJHy7xwyV+uMQPl/BwCQ+X8HCJHy7xwyV+uHzMOfelJjxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw+Ux59yXmvBwiR8u8cMlfrjED5f44RIeLuHhEh4u8cMlfrjED5fHnHNfasLDJX64xA+X+OESP1zih0t4uISHS3i4xA+X+OESP1wec37MOTxc4odL/HCJHy7xwyV+uISHS3i4hIdL/HCJHy7xw+Ux58ecw8MlfrjED5f44RI/XOKHS3i4hIdLeLjED5f44RI/XB5zfsw5PFzih0v8cIkfLvHDJX64hIdLeLiEh0v8cIkfLvHD5THnx5zDwyV+uMQPl/jhEj9c4odLeLiEh0t4uMQPl/jhEj9cHnPOfakJD5f44RI/XOGHK/xwhR+u4OEKHq7g4Qo/XOGHK/xw9e8358V9qQUPV/jhCj9c4Ycr/HCFH67g4QoeruDhCj9c4Ycr/HD17zfnxX2pBQ9X+OEKP1zhhyv8cIUfruDhCh6u4OEKP1zhhyv8cPUv2atkr5KMIqPIKDKKjGKviuconqN4jiKj+DyavWr2qtmrJqPJaDKajCaj2avmOYbnGJ5jyBg+j2Gvhr0a9mrIGJ5jeI7lOZaMJWPJWDKW51ieY8lYnuP/5vz+Vu+/c4b64+H+WwWrZFWsmtWwWlaP1f1WR8aRcWQcGUfGkXFkHBlHxo+Tqe/HydT342Tq+3Ey9f04mfp+nEx9P06mvh8nU9+Pk6nvx8nU94+Mj4yPjI+Mj4zfe3t9v7/PCz9cwcMVPFzBwxU8XMHDFfelFvelFjxc4Ycr/HCFH67wwxU8XMHDFTxc4Ycr/HCFH64+5pz7UgservDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OHqY865L7Xg4Qo/XOGHK/xwhR+u8MMVPFzBwxU8XOGHK/xwhR+uPuac+1ILHq7wwxV+uMIPV/jhCj9cwcMV96UW96UWPFzhhyt4uIKHK3i4gocreLiChyt4uMIPV/jhCj9ccV9qcV9q4Ycr/HCFH66+Y6+OvToyjowj48g4Mo694vuc+1KL+1ILP1zhhyv8cBW/39WK+1ILP1zhhyv8cIUfrvDDFX64wg9X3Jda3Jda+OEKP1zBwxU8XMHDFTxcwcMVPFzBwxU8XOGHK/xwxX2pBQ9X+OEKP1zhh6tgzrkvteDhCj9c4Ycr/HCFH67wwxU8XMHDFTxc4Ycr/HCFH66COee+1IKHK/xwhR+u8MMVfrjCD1fwcAUPV/BwhR+u8MMVfrgK5pz7UgservDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OEqmHP8cAUPV8H3OX64Cuac+1KL+1ILHq7g4QoeruKR8fg8mPNgzrkvteDhKo4M5jyYc+5LLe5LLXi4gocreLjK3zlc5e+8vZI5T+ac+1ILHq7y9/d5JXOezDn3pRb3pRY8XMHDFTxcJd/nyfd5MufJnHNfasHDVfJ9nsx5Mufcl1rcl1rwcAUPV/BwlUHG77y98MMVfrjCD1fwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9XyZxzX2rBwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cJXPOfakFD1f44Qo/XOGHK/xwhR+u4OEKHq7g4Qo/XOGHK/xwlcw596UWPFzhhyv8cIUfrvDDFX64gocreLiChyv8cIUfrvDDVTLnyZzDwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cFXNezDk8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MNVMefFnMPDFX64wg9X+OEKP1zhhyt4uIKHK3i4wg9X+OEKP1wVc17MOTxc4Ycr/HCFH67wwxV+uIKHK3i4gocr/HCFH67ww1Ux59yXWvBwhR+u8MMVfrjCD1f44QoeruDhCh6u8MMVfrjCD1fFnHNfasHDFX64wg9X+OEKP1zhhyt4uIKHK3i4wg9X+OEKP1wVc859qQUPV/jhCj9c4Ycr/HCFH67g4QoeruDhCj9c4Ycr/HBVzDn3pRY8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MNVMefcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9XzZxzX2rBwxU8XMHDFTxc4YcreLhqzuHwwxU8XMHDFTxcwcPVHw93/1v9zhn+eLj/rfIfq49VsEpWxapZDatlRUaSUWQUGUVGkVFkFBlFRpFRZBQZTUaT0WQ0GU1Gk9FkNBlNRpMxZAwZvLc3f5/jhyt4uIKHK3i4gocreLjivtTivtSChyv8cIUfrvDDFX64gocreLiChyv8cIUfrvDDVTPn3Jda8HCFH67wwxV+uMIPV/jhCh6u4OEKHq7wwxV+uMIPV82cc19qwcMVfrjCD1f44Qo/XOGHK3i4gocreLjCD1f44Qo/XA1zzn2pBQ9X+OEKP1zhhyv8cIUfruDhivtSi/tSCx6u8MMVPFzBwxU8XMHDFTxcwcMVPFzhhyv8cIUfrrgvtbgvtfDDFX64wg9Xk+wV3+f44Qo/XOGHK/xwhR+u8MMVfrjivtTivtTCD1f44Qo/XE2zV3yf44cr/HCFH67wwxV+uMIPV/jhivtSi/tSCz9c4YcreLiChyt4uIKHK3i4gocreLiChyv8cIUfrrgvteDhCj9c4Ycr/HA1zDn3pRY8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MPVMOfcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9Xy5xzX2rBwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cLXOOH67g4Wr5PscPV8ucc19qcV9qwcMVPFzBw9VyDrecty9zvsw596UWPFwtf58vc77MOfelFvelFjxcwcMVPFwt53DLefsy58ucc19qwcPV8vf5MufLnHNfanFfasHDFTxcwcPV8n2+fJ8vc77MOfelFjxcLd/ny5wvc859qcV9qQUPV/BwBQ9Xyzncct6OH67wwxV+uIKHK/xwhR+u8MMVfrjCD1fwcAUPV/BwhR+u8MMVfrha5pz7UgservDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OHqMefcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9XjznnvtSChyv8cIUfrvDDFX64wg9X8HAFD1fwcIUfrvDDFX64esz5Y87h4Qo/XOGHK/xwhR+u8MMVPFzBwxU8XOGHK/xwhR+uHnP+mHN4uMIPV/jhCj9c4Ycr/HAFD1fwcAUPV/jhCj9c4Yerx5w/5hwervDDFX64wg9X+OEKP1zBwxU8XMHDFX64wg9X+OHqMeePOYeHK/xwhR+u8MMVfrjCD1fwcAUPV/BwhR+u8MMVfrh6zDn3pRY8XOGHK/xwhR+u8MMVfriChyt4uIKHK/xwhR+u8MPVMefcl1rwcIUfrvDDFX64wg9X+OEKHq7g4QoervDDFX64wg9Xx5xzX2rBwxV+uMIPV/jhCj9c4YcreLiChyt4uMIPV/jhCj9cHXPOfakFD1f44Qo/XOGHK/xwhR+u4OEKHq7g4Qo/XOGHK/xwdcw596UWPFzhhyv8cIUfrvDDFX64gocreLiChyv8cIUfrvDD1THn3Jda8HAFD1fwcAUPV/jhCh6ujnM4/HAFD1fwcAUPV/Bw9cfD3f9Wv3OGPx7uv9Vj9TtnODiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZ+3Ey/e/HyfS/HyfT/36cTP/7cTL978fJ9L8fJ9P/fpxM//txMv3vx8n0v39k/N7b+9/v7/PGD9fwcA0P1/BwDQ/X8HDNfanNfakND9f44Ro/XOOHa/xwDQ/X8HAND9f44Ro/XOOH63/JcyTPkWQkGUlGkpFk/Oa84eEaHq7h4Ro/XOOHa/xw/e835819qQ0P1/jhGj9c44dr/HCNH67h4RoeruHhGj9c44dr/HD9r9mrYa+GjCFjyBgyhoxhr4bnGJ5jeI4lY/k8lr1a9mrZqyVjyVgylowl47FXj+d4PMfjOR4Zj8/jsVePvXrs1SPjyDgyjowj49ir4zmO5zie48j4nbc3frj+fr+rNfelNn64xg/X+OEaP1zjh2v8cI0frrkvtbkvtfHDNX64hodreLiGh2t4uIaHa3i4hodreLjGD9f44Zr7UhservHDNX64xg/XH3POfakND9f44Ro/XOOHa/xwjR+u4eEaHq7h4Ro/XOOHa/xw/THn3Jfa8HCNH67xwzV+uMYP1/jhGh6u4eEaHq7xwzV+uMYP1x9zzn2pDQ/X+OEaP1zjh2v8cI0fruHhGh6u4eEaP1zjh2v8cP0x5/jhGh6uvyWDOf+Yc+5Lbe5LbXi4hodreLj+HhmPz4M5/5hz7ktteLj+HhnM+cecc19qc19qw8M1PFzDw/V3ZByfB3P+Mefcl9rwcB2/v887mPNgzrkvtbkvteHhGh6u4eE6+D4Pvs+DOQ/mnPtSGx6ug+/zYM6DOee+1Oa+1IaHa3i4hofrCDJ+5+2NH67xwzV+uIaHa/xwjR+u8cM1frjGD9fwcA0P1/BwjR+u8cM1frgO5pz7UhservHDNX64xg/X+OEaP1zDwzU8XMPDNX64xg/X+OE6mHPuS214uMYP1/jhGj9c44dr/HAND9fwcA0P1/jhGj9c44frYM65L7Xh4Ro/XOOHa/xwjR+u8cM1PFzDwzU8XOOHa/xwjR+ugzkP5hwervHDNX64xg/X+OEaP1zDwzU8XMPDNX64xg/X+OE6mPNgzuHhGj9c44dr/HCNH67xwzU8XMPDNTxc44dr/HCNH66TOU/mHB6u8cM1frjGD9f44Ro/XMPDNTxcw8M1frjGD9f44TqZ82TO4eEaP1zjh2v8cI0frvHDNTxcw8M1PFzjh2v8cI0frpM5577Uhodr/HCNH67xwzV+uMYP1/BwDQ/X8HCNH67xwzV+uE7mnPtSGx6u8cM1frjGD9f44Ro/XMPDNTxcw8M1frjGD9f44TqZc+5LbXi4xg/X+OEaP1zjh2v8cA0P1/BwDQ/X+OEaP1zjh+tkzrkvteHhGj9c44dr/HCNH67xwzU8XMPDNTxc44dr/HCNH66TOee+1IaHa/xwjR+u8cM1frjGD9fwcA0P1/BwjR+u8cM1frgu5pz7UhseruHhGh6u4eEaP1zDw3V9ZPD3OTxcw8M1PFzDw/UfD3f/W/3OGf54uP9Ww2pZPVa/c4b6cTJdP06m68fJdP04ma4kI8lIMpKMJCPJKDKKjCKjyCgyiowio8goMoqMJqPJaDKajCajyWgymgze24u/z/HDNTxcw8M1PFzDwzU8XHNfanNfasPDNX64xg/X+OEaP1zDwzU8XMPDNX64xg/X+OG6mHPuS214uMYP1/jhGj9c44dr/HAND9fwcA0P1/jhGj9c44frYs65L7Xh4Ro/XOOHa/xwjR+u8cM1PFzDwzU8XOOHa/xwjR+umznnvtSGh2v8cI0frvHDNX64xg/X8HDNfanNfakND9f44RoeruHhGh6u4eEaHq7h4RoervHDNX64xg/X3Jfa3Jfa+OEaP1zjh+tO9orvc/xwjR+u8cM1frjGD9f44Ro/XHNfanNfauOHa/xwjR+uu9grvs/xwzV+uMYP1/jhGj9c44dr/HDNfanNfamNH67xwzU8XMPDNTxcw8M1PFzDwzU8XMPDNX64xg/X3Jfa8HCNH67xwzV+uG7mnPtSGx6u8cM1frjGD9f44Ro/XMPDNTxcw8M1frjGD9f44bqZc+5LbXi4xg/X+OEaP1zjh2v8cA0P1/BwDQ/X+OEaP1zjh+thzrkvteHhGj9c44dr/HCNH67xwzU8XMPDNTxc44dr/HCNH66HOccP1/BwPXyf44frYc65L7W5L7Xh4RoeruHhejiHG87bhzkf5pz7Uhseroe/z4c5H+ac+1Kb+1IbHq7h4RoerodzuOG8fZjzYc65L7Xh4Xr4+3yY82HOuS+1uS+14eEaHq7h4Xr4Ph++z4c5H+ac+1IbHq6H7/Nhzoc5577U5r7UhodreLiGh+vhHG44b8cP1/jhGj9cw8M1frjGD9f44Ro/XOOHa3i4hodreLjGD9f44Ro/XA9zzn2pDQ/X+OEaP1zjh2v8cI0fruHhGh6u4eEaP1zjh2v8cL3MOfelNjxc44dr/HCNH67xwzV+uIaHa3i4hodr/HCNH67xw/Uy59yX2vBwjR+u8cM1frjGD9f44RoeruHhGh6u8cM1frjGD9fLnC9zDg/X+OEaP1zjh2v8cI0fruHhGh6u4eEaP1zjh2v8cL3M+TLn8HCNH67xwzV+uMYP1/jhGh6u4eEaHq7xwzV+uMYP18ucL3MOD9f44Ro/XOOHa/xwjR+u4eEaHq7h4Ro/XOOHa/xwvcz5MufwcI0frvHDNX64xg/X+OEaHq7h4RoervHDNX64xg/Xy5xzX2rDwzV+uMYP1/jhGj9c44dreLiGh2t4uMYP1/jhGj9cP+ac+1IbHq7xwzV+uMYP1/jhGj9cw8M1PFzDwzV+uMYP1/jh+jHn3Jfa8HCNH67xwzV+uMYP1/jhGh6u4eEaHq7xwzV+uMYP1485577Uhodr/HCNH67xwzV+uMYP1/BwDQ/X8HCNH67xwzV+uH7MOfelNjxc44dr/HCNH67xwzV+uIaHa3i4hodr/HCNH67xw/VjzrkvteHhGh6u4eEaHq7xwzU8XD/O4fDDNTxcw8M1PFzDw/UfD3f/W/3OGf54uP9WxapZDatl9Vj9zjLej5Pp9+Nk+j0yHhmPjEfGI+OR8ch4ZBwZR8aRcWQcGUfGkXFkHBlwMgcnc3AyBydzcDIHJ3NwMvBwffx9jh+u4eEaHq7h4RoeruHhmvtSm/tSGx6u8cM1frjGD9f44RoeruHhGh6u8cM1frjGD9fHnHNfasPDNX64xg/X+OEaP1zjh2t4uIaHa3i4xg/X+OEaP1wfc859qQ0P1/jhGj9c44dr/HCNH67h4RoeruHhGj9c44dr/HB9zDn3pTY8XOOHa/xwjR+u8cM1friGh2vuS23uS214uMYP1/BwDQ/X8HAND9fwcA0P1/BwjR+u8cM1frjmvtTmvtTGD9f44Ro/XB+/q3FfauOHa/xwjR+u8cM1frjGD9f44Zr7Upv7Uhs/XOOHa/xwffyuxn2pjR9u8MMNfrjBDzf44QY/3OCHG+5LHe5LHfxwgx9u4OEGHm7g4QYebuDhBh5u4OEGHm7www1+uOG+1IGHG/xwgx9u8MPNv9+cD/elDjzc4Icb/HCDH27www1+uIGHG3i4gYcb/HCDH27ww82/ZK+KvSoyiowio8goMoq9Kp6jeI7iOZqM5vNo9qrZq2avmowmo8loMpqMYa+G5xieY3iOIWP4PIa9GvZq2KshY8lYMpaMJWPZq+U5ludYnmPJWD6Px1499uqxV4+MR8Yj45HxyHjs1eM5juc4nuPIOD6PY6+OvTr26sg4MpjzjznnvtThvtSBhxt4uIGHm+/3fT7f7/t8Pub8Y865L3Xg4eb7yGDOP+ac+1KH+1IHHm7g4QYebr4g43fePvjhBj/c4IcbeLjBDzf44QY/3OCHG/xwAw838HADDzf44QY/3OCHm485577UgYcb/HCDH27www1+uMEPN/BwAw838HCDH27www1+uPmYc+5LHXi4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5uPOee+1IGHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrj5mPOPOYeHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrj5mPOPOYeHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrgJ5jyYc3i4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5tgzoM5h4cb/HCDH27www1+uMEPN/BwAw838HCDH27www1+uAnmnPtSBx5u8MMNfrjBDzf44QY/3MDDDTzcwMMNfrjBDzf44SaYc+5LHXi4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5tgzrkvdeDhBj/c4Icb/HCDH27www083MDDDTzc4Icb/HCDH26COee+1IGHG/xwgx9u8MMNfrjBDzfwcAMPN/Bwgx9u8MMNfrgJ5pz7UgcebvDDDX64wQ83+OEGP9zAww083MDDDX64wQ83+OEmmXPuSx14uIGHG3i4gYcb/HADDzf5kfGRwZzDww083MDDzR8Pd3+r+O+cYf54uP9WwSpZFatmNayW1WN1v1WSkWQkGUlGkpFkJBlJRpKRZBQZRUaRUWQUGUVGkVFkFBlFRpPRZDQZTQbv7dl85s1nzpzDww083MDDDTzccF/qcF/qwMMNfrjBDzf44QY/3MDDDTzcwMMNfrjBDzf44SaZc+5LHXi4wQ83+OEGP9zghxv8cAMPN/BwAw83+OEGP9zgh5tkzrkvdeDhBj/c4Icb/HCDH27www083MDDDTzc4Icb/HCDH26KOee+1IGHG/xwgx9u8MMNfrjBDzfwcMN9qcN9qQMPN/jhBh5u4OEGHm7g4QYebuDhBh5u8MMNfrjBDzfclzrclzr44QY/3OCHm0r2iu9z/HCDH27www1+uMEPN/jhBj/ccF/qcF/q4Icb/HCDH26q2Cu+z/HDDX64wQ83+OEGP9zghxv8cMN9qcN9qYMfbvDDDTzcwMMNPNzAww083MDDDTzcwMMNfrjBDzfclzrwcIMfbvDDDX64Keac+1IHHm7www1+uMEPN/jhBj/cwMMNPNzAww1+uMEPN/jhpphz7ksdeLjBDzf44QY/3OCHG/xwAw838HADDzf44QY/3OCHm2bOuS914OEGP9zghxv8cIMfbvDDDTzcwMMNPNzghxv8cIMfbpo5xw838HDTfJ/jh5tmzrkvdbgvdeDhBh5u4OGmOYfr33n7NHPezDn3pQ483DR/nzdz3sw596UO96UOPNzAww083DTncF18Hsx5M+fclzrwcNP8fd7MeTPn3Jc63Jc68HADDzfwcNN8nzff582cN3POfakDDzfN93kz582cc1/qcF/qwMMNPNzAw01zDtfD58Gc44cb/HADDzf44QY/3OCHG/xwgx9u4OEGHm7g4QY/3OCHG/xw08w596UOPNzghxv8cIMfbvDDDX64gYcbeLiBhxv8cIMfbvDDTTPn3Jc68HCDH27www1+uMEPN/jhBh5u4OEGHm7www1+uMEPN8Occ1/qwMMNfrjBDzf44QY/3OCHG3i4gYcbeLjBDzf44QY/3AxzPsw5PNzghxv8cIMfbvDDDX64gYcbeLiBhxv8cIMfbvDDzTDnw5zDww1+uMEPN/jhBj/c4IcbeLiBhxt4uMEPN/jhBj/cDHM+zDk83OCHG/xwgx9u8MMNfriBhxt4uIGHG/xwgx9u8MPNMOfDnMPDDX64wQ83+OEGP9zghxt4uIGHG3i4wQ83+OEGP9wMc859qQMPN/jhBj/c4Icb/HCDH27g4QYebuDhBj/c4Icb/HAzzDn3pQ483OCHG/xwgx9u8MMNfriBhxt4uIGHG/xwgx9u8MPNMufclzrwcIMfbvDDDX64wQ83+OEGHm7g4QYebvDDDX64wQ83y5xzX+rAww1+uMEPN/jhBj/c4IcbeLiBhxt4uMEPN/jhBj/cLHPOfakDDzf44QY/3OCHG/xwgx9u4OEGHm7g4QY/3OCHG/xws8w596UOPNzAww083MDDDX64gYeb5RwOP9zAww083MDDDTzc/PFw97/V75zhj4f732r/sfpYBatkVaya1bBaVmQsGY+MR8Yj45HxyHhkPDIeGY+MR8aRcWQcGUfGkXFkHBlHxpHx42Tm/TiZeT9OZuDh5vH3OX64gYcbeLiBhxt4uIGHG+5LHe5LHXi4wQ83+OEGP9zghxt4uIGHG3i4wQ83+OEGP9w85pz7UgcebvDDDX64wQ83+OEGP9zAww083MDDDX64wQ83+OHmMefclzrwcIMfbvDDDX64wQ83+OEGHm7g4QYebvDDDX64wQ83jznnvtSBhxv8cIMfbvDDDX64wQ838HDDfanDfakDDzf44QYebuDhBh5u4OEGHm7g4QYebvDDDX64wQ833Jc63Jc6+OEGP9zgh5vH72rclzr44QY/3OCHG/xwgx9u8MMNfrjhvtThvtTBDzf44QY/3Dx+V+O+1MEPN/jhBj/c4Icb/HCDH27www33pQ73pQ5+uMEPN/BwAw838HADDzfwcAMPN/BwAw83+OEGP9xwX+rAww1+uMEPN/jh5phz7ksdeLjBDzf44QY/3OCHG/xwAw838HADDzf44QY/3OCHm2POuS914OEGP9zghxv8cIMfbvDDDTzcwMMNPNzghxv8cIMfbo45577UgYcb/HCDH27www1+uMEPN/BwAw838HCDH27www1+uDnmHD/cwMPN8X2OH26OOee+1OG+1IGHG3i4gYeb4xzuOG8/5vyYc+5LHXi4Of4+P+b8mHPuSx3uSx14uIGHG3i4Oc7hjvP2Y86POee+1IGHm+Pv82POjznnvtThvtSBh1t4uIWH23+/7/P99/s+33+/Od9/vzlf7ktdeLj99/s+33//yPjI+Mj4zfnCwy083MLD7b+PjN95++KHW/xwix9u4eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbv8le5XsVZKRZCQZSUaSUexV8RzFcxTPUWQUn0exV8VeFXtVZDQZTUaT0WQ0e9U8R/MczXM0Gc3nMezVsFfDXg0ZQ8aQMWQMGcNeDc+xPMfyHEvG8nkse7Xs1bJXS8aSsWQ8Mh4Zj716PMfjOR7P8ch4fB6PvXrs1bFXR8aRcWQcGUfGsVfHcxzPwZzjh1v8cIsfbj/m/GPO4eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbj/m/GPO4eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbj/mnPtSFx5u8cMtfrjFD7f44RY/3MLDLTzcwsMtfrjFD7f44fZjzrkvdeHhFj/c4odb/HCLH27xwy083MLDLTzc4odb/HCLH24/5pz7UhcebvHDLX64xQ+3+OEWP9zCwy083MLDLX64xQ+3+OH2Y865L3Xh4RY/3OKHW/xwix9u8cMtPNzCwy083OKHW/xwix9uP+ac+1IXHm7xwy1+uMUPt/jhFj/cwsMtPNzCwy1+uMUPt/jhNphz7ktdeLiFh1t4uIWHW/xwCw+38Y+MjwzmHB5u4eEWHm7/eLj73+q/c4b94+H+Wz1W91v9OJmNHyez8eNkNn6czMaPk9n4cTIbQUaQEWQEGUlGkpFkJBlJRpKRZCQZSUaSUWQUGUVGkVFkFBlFRpFRZBQZzefRfObNZ86cw8MtPNzCwy083HJf6nJf6sLDLX64xQ+3+OEWP9zCwy083MLDLX64xQ+3+OE2mHPuS114uMUPt/jhFj/c4odb/HALD7fwcAsPt/jhFj/c4ofbYM65L3Xh4RY/3OKHW/xwix9u8cMtPNzCwy083OKHW/xwix9ugznnvtSFh1v8cIsfbvHDLX64xQ+38HDLfanLfakLD7f44RYebuHhFh5u4eEWHm7h4RYebvHDLX64xQ+33Je63Je6+OEWP9zih9v8/a623Je6+OEWP9zih1v8cIsfbvHDLX645b7U5b7UxQ+3+OEWP9xmsVd8n+OHW/xwix9u8cMtfrjFD7f44Zb7Upf7Uhc/3OKHW3i4hYdbeLiFh1t4uIWHW3i4hYdb/HCLH265L3Xh4RY/3OKHW/xwm8w596UuPNzih1v8cIsfbvHDLX64hYdbeLiFh1v8cIsfbvHDbTLn3Je68HCLH27xwy1+uMUPt/jhFh5u4eEWHm7xwy1+uMUPt8mcc1/qwsMtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3BZzjh9u4eG2+D7HD7fFnHNf6nJf6sLDLTzcwsNtBRm/8/Yt5ryYc+5LXXi4Lf4+L+a8mHPuS13uS114uIWHW3i4rSTjd96+xZwXc859qQsPt8Xf58WcF3POfanLfakLD7fwcAsPt8X3efF9Xsx5Mefcl7rwcFt8nxdzXsw596Uu96UuPNzCwy083NaQMXwezDl+uMUPt/Bwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7fFnHNf6sLDLX64xQ+3+OEWP9zih1t4uIWHW3i4xQ+3+OEWP9wWc859qQsPt/jhFj/c4odb/HCLH27h4RYebuHhFj/c4odb/HDbzDn3pS483OKHW/xwix9u8cMtfriFh1t4uIWHW/xwix9u8cNtM+fNnMPDLX64xQ+3+OEWP9zih1t4uIWHW3i4xQ+3+OEWP9w2c97MOTzc4odb/HCLH27xwy1+uIWHW3i4hYdb/HCLH27xw20z582cw8MtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3DZz3sw5PNzih1v8cIsfbvHDLX64hYdbeLiFh1v8cIsfbvHDbTPn3Je68HCLH27xwy1+uMUPt/jhFh5u4eEWHm7xwy1+uMUPt82cc1/qwsMtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3A5zzn2pCw+3+OEWP9zih1v8cIsfbuHhFh5u4eEWP9zih1v8cDvMOfelLjzc4odb/HCLH27xwy1+uIWHW3i4hYdb/HCLH27xw+0w59yXuvBwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7fDnHNf6sLDLTzcwsMtPNzih1t4uB3O4fDDLTzcwsMtPNzCw+0fD3f/W/3OGf54uP9Ww2pZPVa/c4b5cTI7P05m58fJ7Pw4mZ0lY8lYMpaMJWPJeGQ8Mh4Zj4xHxiPjkfHIeGQ8Mo6MI+PIODKOjCPjyDgyeG8f/j7HD7fwcAsPt/BwCw+38HDLfanLfakLD7f44RY/3OKHW/xwCw+38HALD7f44RY/3OKH22XOuS914eEWP9zih1v8cIsfbvHDLTzcwsMtPNzih1v8cIsfbpc5577UhYdb/HCLH27xwy1+uMUPt/BwCw+38HCLH27xwy1+uF3mnPtSFx5u8cMtfrjFD7f44RY/3MLDLfelLvelLjzc4odbeLiFh1t4uIWHW3i4hYdbeLjFD7f44RY/3HJf6nJf6uKHW/xwix9ul9/VuC918cMtfrjFD7f44RY/3OKHW/xwy32py32pix9u8cMtfrhdflfjvtTFD7f44RY/3OKHW/xwix9u8cMt96Uu96UufrjFD7fwcAsPt/BwCw+38HALD7fwcAsPt/jhFj/ccl/qwsMtfrjFD7f44fYx59yXuvBwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7ePOee+1IWHW/xwix9u8cMtfrjFD7fwcAsPt/Bwix9u8cMtfrh9zDn3pS483OKHW/xwix9u8cMtfriFh1t4uIWHW/xwix9u8cPtY87xwy083D6+z/HD7WPOuS91uS914eEWHm7h4fZxDvc4b3/M+WPOuS914eH28ff5Y84fc859qct9qQsPt/BwCw+3j3O4x3n7Y84fc859qQsPt4+/zx9z/phz7ktd7ktdeLiFh1t4uH18nz++z485P+ac+1IXHm6P7/Njzo85577U5b7UhYdbeLiFh9vjHO44b8cPt/jhFj/cwsMtfrjFD7f44RY/3OKHW3i4hYdbeLjFD7f44RY/3B5zzn2pCw+3+OEWP9zih1v8cIsfbuHhFh5u4eEWP9zih1v8cHvMOfelLjzc4odb/HCLH27xwy1+uIWHW3i4hYdb/HCLH27xw+0x59yXuvBwix9u8cMtfrjFD7f44RYebuHhFh5u8cMtfrjFD7fHnB9zDg+3+OEWP9zih1v8cIsfbuHhFh5u4eEWP9zih1v8cHvM+THn8HCLH27xwy1+uMUPt/jhFh5u4eEWHm7xwy1+uMUPt/eb8/fvN+cPHu7hh3v44R5+uIcf7uGHe/BwDx7uwcM9/HAPP9zDD/f+/eb8/fvN+YOHe/jhHn64hx/u4Yd7+OEePNyDh3vwcA8/3MMP9/DDvX+/OX/cl/rg4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cO9fsVfFXhUZRUaRUWQUGcVeFc/RPEfzHE1G83k0e9XsVbNXTUaT0WQMGUPGsFfDcwzPMTzHkDF8HsNeDXu17NWSsWQsGUvGkrHs1fIcy3Msz/HIeHwej7167NVjrx4Zj4xHxiPjkXHs1fEcx3Mcz3FkHJ/HsVfHXh179Xtvf/BwDx7uwcM9/HAPHu59v3O4hx/uwcM9eLgHD/fg4d4fD3f/W/13zvD+eLj/VsWqWQ2rZfVY3W/142Te9+Nk3hdkBBlBRpARZAQZQUaQkWQkGUlGkpFkJBlJRpKRZCQZRUaRUWQUGUVGkVF8Hr+/zx9+uAcP9+DhHjzcg4d78HCP+1If96U+eLiHH+7hh3v44R5+uAcP9+DhHjzcww/38MM9/HDvY865L/XBwz38cA8/3MMP9/DDPfxwDx7uwcM9eLiHH+7hh3v44d7HnHNf6oOHe/jhHn64hx/u4Yd7+OEePNyDh3vwcA8/3MMP9/DDvY85577UBw/38MM9/HAPP9zDD/fwwz14uMd9qY/7Uh883MMP9+DhHjzcg4d78HAPHu7Bwz14uIcf7uGHe/jhHvelPu5LffjhHn64hx/uxe93tcd9qQ8/3MMP9/DDPfxwDz/cww/38MM97kt93Jf68MM9/HAPP9yLZK/4PscP9/DDPfxwDz/cww/38MM9/HCP+1If96U+/HAPP9yDh3vwcA8e7sHDPXi4Bw/34OEePNzDD/fwwz3uS33wcA8/3MMP9/DDvWDOuS/1wcM9/HAPP9zDD/fwwz38cA8e7sHDPXi4hx/u4Yd7+OFeMOfcl/rg4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cC+Yc+5LffBwDz/cww/38MM9/HAPP9yDh3vwcA8e7uGHe/jhHn64l8w5frgHD/eS73P8cC+Zc+5LfdyX+uDhHjzcg4d7+ZHxO29/yZwnc859qQ8e7mWQwZwnc859qY/7Uh883IOHe/BwL5OM33n7S+Y8mXPuS33wcC+TDOY8mXPuS33cl/rg4R483IOHe8n3efJ9nsx5Mufcl/rg4V7yfZ7MeTLn3Jf6uC/1wcM9eLgHD/dyyBg+D+YcP9zDD/fg4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cC+Zc+5LffBwDz/cww/38MM9/HAPP9yDh3vwcA8e7uGHe/jhHn64l8w596U+eLiHH+7hh3v44R5+uIcf7sHDPXi4Bw/38MM9/HAPP9wr5pz7Uh883MMP9/DDPfxwDz/cww/34OEePNyDh3v44R5+uIcf7hVzXsw5PNzDD/fwwz38cA8/3MMP9+DhHjzcg4d7+OEefriHH+4Vc17MOTzcww/38MM9/HAPP9zDD/fg4R483IOHe/jhHn64hx/uFXNezDk83MMP9/DDPfxwDz/cww/34OEePNyDh3v44R5+uIcf7hVzXsw5PNzDD/fwwz38cA8/3MMP9+DhHjzcg4d7+OEefriHH+4Vc859qQ8e7uGHe/jhHn64hx/u4Yd78HAPHu7Bwz38cA8/3MMP94o5577UBw/38MM9/HAPP9zDD/fwwz14uAcP9+DhHn64hx/u4Yd7zZxzX+qDh3v44R5+uIcf7uGHe/jhHjzcg4d78HAPP9zDD/fww71mzrkv9cHDPfxwDz/cww/38MM9/HAPHu7Bwz14uIcf7uGHe/jhXjPn3Jf64OEefriHH+7hh3v44R5+uAcP9+DhHjzcww/38MM9/HCvmXPuS33wcA8e7sHDPXi4hx/uwcO95hwOP9yDh3vwcA8e7sHDvT8e7u/85Y+Hq/+tPlbBKlkVq2Y1rJbVY/U7y+glY8lYMpaMJWPJWDKWjCVjyXhkPDIeGY+MR8Yj45HxyHhkPDKOjCPjyDgyeG9v/j7HD/fg4R483IOHe/BwDx7ucV/q477UBw/38MM9/HAPP9zDD/fg4R483IOHe/jhHn64hx/uDXPOfakPHu7hh3v44R5+uIcf7uGHe/BwDx7uwcM9/HAPP9zDD/eGOee+1AcP9/DDPfxwDz/cww/38MM9eLgHD/fg4R5+uIcf7uGHe8Occ1/qg4d7+OEefriHH+7hh3v44R483OO+1Md9qQ8e7uGHe/BwDx7uwcM9eLgHD/fg4R483MMP9/DDPfxwj/tSH/elPvxwDz/cww/3Ztkrvs/xwz38cA8/3MMP9/DDPfxwDz/c477Ux32pDz/cww/38MO9eewV3+f44R5+uIcf7uGHe/jhHn64hx/ucV/q477Uhx/u4Yd78HAPHu7Bwz14uAcP9+DhHjzcg4d7+OEefrjHfakPHu7hh3v44R5+uLfMOfelPni4hx/u4Yd7+OEefriHH+7Bwz14uAcP9/DDPfxwDz/cW+ac+1IfPNzDD/fwwz38cA8/3MMP9+DhHjzcg4d7+OEefriHH+4tc859qQ8e7uGHe/jhHn64hx/u4Yd78HAPHu7Bwz38cA8/3MMP95Y5xw/34OHe8n2OH+4tc859qY/7Uh883IOHe/BwbzmHW87blzlf5pz7Uh883Fv+Pl/mfJlz7kt93Jf64OEePNyDh3vLOdxy3r7M+TLn3Jf64OHe8vf5MufLnHNf6uO+1AcP9+DhHjzcW77Pl+/zZc6XOee+1AcP9x7f5485f8w596U+7kt98HAPHu7Bw73HOdzjvB0/3MMP9/DDPXi4hx/u4Yd7+OEefriHH+7Bwz14uAcP9/DDPfxwDz/ce8w596U+eLiHH+7hh3v44R5+uIcf7sHDPXi4Bw/38MM9/HAPP9x7zDn3pT54uIcf7uGHe/jhHn64hx/uwcM9eLgHD/fwwz38cA8/3HvMOfelPni4hx/u4Yd7+OEefriHH+7Bwz14uAcP9/DDPfxwDz/ce8z5Y87h4R5+uIcf7uGHe/jhHn64Bw/34OEePNzDD/fwwz38cO8x5485h4d7+OEefriHH+7hh3v44R483IOHe/BwDz/cww/38MO9x5w/5hwe7uGHe/jhHn64hx/u4Yd78HAPHu7Bwz38cA8/3MMP9445P+YcHu7hh3v44R5+uIcf7uGHe/BwDx7uwcM9/HAPP9zDD/eOOee+1AcP9/DDPfxwDz/cww/38MM9eLgHD/fg4R5+uIcf7uGHe8ecc1/qg4d7+OEefriHH+7hh3v44R483IOHe/BwDz/cww/38MO9Y865L/XBwz38cA8/3MMP9/DDPfxwDx7uwcM9eLiHH+7hh3v44d4x59yX+uDhHn64hx/u4Yd7+OEefrgHD/fg4R483MMP9/DDPfxw75hz7kt98HAPP9zDD/fwwz38cA8/3IOHe/BwDx7u4Yd7+OEefrh3zDn3pT54uAcP9+DhHjzcww938HD373cOd/jhDh7u4OEOHu7g4e6Ph7v/rf47Z7g/Hu5/q+8fq49VsEpWxapZDatlRcZHRpARZAQZQUaQEWQEGUFGkBFkJBlJRpKRZCQZSUaSkWQkGUlGkVFkFJ/H7+/zww938HAHD3fwcAcPd/Bwx32px32pBw93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7t/w3MMzzFkDBlDxpAxZPzm/ODhDh7u4OEOP9zhhzv8cPfvN+fHfakHD3f44Q4/3OGHO/xwhx/u4OEOHu7g4Q4/3OGHO/xw9+/Yq2Ovjowj48g4Mo6MY6+Yc+5LPe5LPXi4ww938HAHD3fwcAcPd/BwBw938HCHH+7wwx1+uOO+1OO+1MMPd/jhDj/cfb/f1Y77Ug8/3OGHO/xwhx/u8MMdfrjDD3fcl3rcl3r44Q4/3OGHuy/Zq2SvkowkI8lIMpKMYq+K5yieo3gO5hw/3MHDHTzcwcMdPNzBwx083MHDHTzc4Yc7/HDHfakHD3f44Q4/3OGHu485577Ug4c7/HCHH+7wwx1+uMMPd/BwBw938HCHH+7wwx1+uPuYc+5LPXi4ww93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7uPOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrgL5hw/3MHDXfB9jh/ugjnnvtTjvtSDhzt4uIOHu/jI+J23XzDnwZxzX+rBw10EGcx5MOfcl3rcl3rwcAcPd/BwF0HG77z9gjkP5pz7Ug8e7iLJYM6DOee+1OO+1IOHO3i4g4e74Ps8+D4P5jyYc+5LPXi4C77PgzkP5pz7Uo/7Ug8e7uDhDh7uosloPg/mHD/c4Yc7eLjDD3f44Q4/3OGHO/xwBw938HAHD3f44Q4/3OGHu2DOuS/14OEOP9zhhzv8cIcf7vDDHTzcwcMdPNzhhzv8cIcf7oI5577Ug4c7/HCHH+7wwx1+uMMPd/BwBw938HCHH+7wwx1+uEvmnPtSDx7u8MMdfrjDD3f44Q4/3MHDHTzcwcMdfrjDD3f44S6Z82TO4eEOP9zhhzv8cIcf7vDDHTzcwcMdPNzhhzv8cIcf7pI5T+YcHu7wwx1+uMMPd/jhDj/cwcMdPNzBwx1+uMMPd/jhLpnzZM7h4Q4/3OGHO/xwhx/u8MMdPNzBwx083OGHO/xwhx/ukjlP5hwe7vDDHX64ww93+OEOP9zBwx083MHDHX64ww93+OEumXPuSz14uMMPd/jhDj/c4Yc7/HAHD3fwcAcPd/jhDj/c4Ye7ZM65L/Xg4Q4/3OGHO/xwhx/u8MMdPNzBwx083OGHO/xwhx/ukjnnvtSDhzv8cIcf7vDDHX64ww938HAHD3fwcIcf7vDDHX64K+ac+1IPHu7wwx1+uMMPd/jhDj/cwcMdPNzBwx1+uMMPd/jhrphz7ks9eLjDD3f44Q4/3OGHO/xwBw938HAHD3f44Q4/3OGHu2LOuS/14OEOHu7g4Q4e7vDDHTzcVZHB3+fwcAcPd/BwBw93fzzc/W/1O2f44+H+Wz1Wv3OG+nEyVz9O5urHyVz9OJmrHydz9eNkroaMIWPIGDKWjCVjyVgylowlY8lYMpaMJeOR8ch4ZDwyHhmPjEfGI+OR8cjgvb34+xw/3MHDHTzcwcMdPNzBwx33pR73pR483OGHO/xwhx/u8MMdPNzBwx083OGHO/xwhx/umjnnvtSDhzv8cIcf7vDDHX64ww938HAHD3fwcIcf7vDDHX64a+ac+1IPHu7wwx1+uMMPd/jhDj/cwcMdPNzBwx1+uMMPd/jhrplz7ks9eLjDD3f44Q4/3OGHO/xwBw933Jd63Jd68HCHH+7g4Q4e7uDhDh7u4OEOHu7g4Q4/3OGHO/xwx32px32phx/u8MMdfrjrYa/4PscPd/jhDj/c4Yc7/HCHH+7wwx33pR73pR5+uMMPd/jhrh97xfc5frjDD3f44Q4/3OGHO/xwhx/uuC/1uC/18MMdfriDhzt4uIOHO3i4g4c7eLiDhzt4uMMPd/jhjvtSDx7u8MMdfrjDD3fDnHNf6sHDHX64ww93+OEOP9zhhzt4uIOHO3i4ww93+OEOP9wNc859qQcPd/jhDj/c4Yc7/HCHH+7g4Q4e7uDhDj/c4Yc7/HA3zDn3pR483OGHO/xwhx/u8MMdfriDhzt4uIOHO/xwhx/u8MPdMOf44Q4e7obvc/xwN8w596Ue96UePNzBwx083A3ncMN5+zDnw5xzX+rBw93w9/kw58Occ1/qcV/qwcMdPNzBw91wDjectw9zPsw596UePNwNf58Pcz7MOfelHvelHjzcwcMdPNwN3+fD9/kw58Occ1/qwcPd8H0+zPkw59yXetyXevBwBw938HC3nMMt5+344Q4/3OGHO3i4ww93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7tlzrkv9eDhDj/c4Yc7/HCHH+7wwx083MHDHTzc4Yc7/HCHH+6WOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrhb5pz7Ug8e7vDDHX64ww93+OEOP9zBwx083MHDHX64ww93+OFumfNlzuHhDj/c4Yc7/HCHH+7wwx083MHDHTzc4Yc7/HCHH+6WOV/mHB7u8MMdfrjDD3f44Q4/3MHDHTzcwcMdfrjDD3f44W6Z82XO4eEOP9zhhzv8cIcf7vDDHTzcwcMdPNzhhzv8cIcf7h5z/phzeLjDD3f44Q4/3OGHO/xwBw938HAHD3f44Q4/3OGHu8ecc1/qwcMdfrjDD3f44Q4/3OGHO3i4g4c7eLjDD3f44Q4/3D3mnPtSDx7u8MMdfrjDD3f44Q4/3MHDHTzcwcMdfrjDD3f44e4x59yXevBwhx/u8MMdfrjDD3f44Q4e7uDhDh7u8MMdfrjDD3ePOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrh7zDn3pR483OGHO/xwhx/u8MMdfriDhzt4uIOHO/xwhx/u8MPdY865L/Xg4Q4e7uDhDh7u8MMdPNw9zuHwwx083MHDHTzcwcPdHw93/1v9zhn+eLj/VsNqWT1Wv3OGg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4mYOTOTiZg5M5OJmDkzk4GXi4O/4+xw938HAHD3fwcAcPd/Bwx32px32pBw93+OEOP9zhhzv8cAcPd/BwBw93+OEOP9zhh7tjzrkv9eDhDj/c4Yc7/HCHH+7wwx083MHDHTzc4Yc7/HCHH+6OOee+1IOHO/xwhx/u8MMdfrjDD3fwcAcPd/Bwhx/u8MMdfrg75pz7Ug8e7vDDHX64ww93+OEOP9zBwx33pR73pR483P38cN+/fz8g7m/5uQyX/8v5W5bLdjku1+VzeSz/+2r/W34uTfvv9P1vWS7b5bg07TPtMy1MC9P++5r/W/ps4bOFzxam/XcW/7d8Lt3JdCfTtDQtTUvT0rR0J9NnS58tfbYyrfzcyp0sd7LcyTKtTCvTyrQyrd3J9tnaZ2ufrU1rP7d2J9udbHeyTRvTxrQxbUwbd3J8tvHZxmcb08bPbd3JdSfXnVzT1rQ1bU1b09adXJ/t+WzPZ3umPT+3504+d/K5k8+0Z9oz7Uw7086dPJ/tfLbz2c6083M7d9Iu+eySH3X3twyX6bJctstxuS6fS57t+0z7PpfhMl2WS9M+0+ySzy757JLPLvnsks8u+eySL0yLdjku1+VzaVqaZpd8dslnl3x2yWeXfHbJZ5d8aVr6udkln13y2SU/Pu9vaZpd8tkln13y2SWfXfLZJZ9d8rVp7edml3x2yWeX/Gi9v6Vpdslnl3x2yWeXfHbJZ5d8dslPY/e39HOzSz675LNLfuze39I0u+SzSz675LNLPrvks0s+u+Qntftb+rnZJZ9d8tklP5Lvb2maXfLZJZ9d8tkln13y2SWfXfJT3P0t/dzsks8u+eySH9f3/d9X9z+Xn8twmS7LZbscl+uStJ/x7v+WdknYJWGX/Ci/v6VpdknYJWGXhF0SdknYJWGX/PR3f8t0WS7b5bg0LUyzS8IuCbsk7JKwS8IuCbvkJ8P7W65Ld9IuCbvkRwD+LU2zS8IuCbsk7JKwS8IuCbvkp8b7W/q52SVhl4Rd8uMB/5am2SVhl4RdEnZJ2CVhl4Rd8hPl/S393OySsEvCLvnRgf+3XNPskrBLwi4JuyTskrBLwi75afP+ln5udknYJWGX/FjBv6VpdknYJWGXhF0SdknYJWGX/CR6f0s/N7sk7JKwS37k4N/SNLsk7ZK0S9IuSbsk7ZK0S35Kvb/lunwu2cm0S9K/cX5ivb+laXZJ2iVpl6RdknZJ2iU/wd7f8nMZLtNluTQtTLNL0i5JuyTtkrRL0i5Ju+Sn2/tbtkt30i5JuyT9GyftkvS9JH0vSbsk/Rsny7QyzS5JuyTtkvS95I83vP+W/zvI+Vumy3LZLsflunwuj+V/QNLf8nNp2pg2po1pY9qYNqaNaWvamramrWlr2pq2pq1pa9qa9kx7pj3TnmnPtGeaf+Pk83/J83+JXZJ2Sdol6XtJ+l6SdknaJWmXpF2SdknaJWWXlF1SdknZJT9p39+yXY7LdflcmuZ5SdklZZeUXVJ2SdklZZeUXfJT+P0taa6yS8ouKbuk/BunPC8pu6TskrJLyi4pu6TskrJLfkK/v2W6dCftkrJLyr9xyvOSskt+Yr+/pWm+l5RdUr6XlO8lZZf8/H5/S3ey3EnfS8q/ccrzkvK85Ic1/i1N872kfC8p30vK95Kf7O9v6ec27uS4k76XlH/jlOcl5XnJT/r3tzTN95LyvaR8LynfS37qv7+ln9u6k+tO+l5S/o1TnpeU5yU/BeDf0jTfS8r3kvK9pHwvKbvkZwL8v+W5k+dO+l5Sdkl5XlKel/wAyL+laXZJ2SVtl7Rd0p69/ryAf8ty2S7H5fovPJem2SVtl7Rd0nZJ2yVtl7Rnrz9L4N/yuWQn2y5p/8Zpz0vaLmm7pO2StkvaLmm7pO2S9uz15wz8W7qTdknbJe3fOO15SdslbZe0XdJ2SdslbZe0XdK+l7TvJW2XtF3Sdkn7XtK+l7Rd0nZJ2yVtl7Rd0nZJ2yXt2Wu3n5td0nZJ2yXt3zjteUnbJW2XtF3SdknbJW2XtF3Snr32+rnZJW2XtF3S/o3Tnpe0XdJ2SdslbZe0XdJ2Sdsl7XtJ+17SdknbJW2XtO8l7XtJ2yVtl7Rd0nZJ2yVtl7RdMp69jr/jjF0ydsnYJePfOON5ydglY5eMXTJ2ydglY5eMXTKevY6/44xdMnbJ2CXj3zjjecnYJWOXjF0ydsnYJWOXjF0ynr2Ov+OMXTJ2ydgl498443nJ2CVjl4xdMnbJ2CVjl4xdMv6NM/6OM3bJ2CVjl4x/44x/44xdMnbJ2CVjl4xdMnbJ2CXj2ev4O87YJWOXjF0ynpeM5yVjl4xdMnbJ2CVjl4xdMnbJePY6/o4zdsnYJWOXjOcl43nJ2CVjl4xdMnbJ2CVjl4xdMp69jr/jjF0ydsnYJePfOOPfOGOXjF0ydsnYJWOXjF0ydsl49jr+jrN2ydola5esf+Os5yVrl6xdsnbJ2iVrl6xdsnbJeva6/o6zdsnaJWuXrH/jrOcla5esXbJ2ydola5esXbJ2yXr2uv6Os3bJ2iVrl6x/46znJWuXrF2ydsnaJWuXrF2ydsl6XrKel6xdsnbJ2iXr3zjr2evaJWuXrF2ydsnaJWuXrF2ynr2uv+OsXbJ2ydol698469nr2iVrl6xdsnbJ2iVrl6xdsp69rr/jrF2ydsnaJevfOOvZ69ola5esXbJ2ydola5esXbKeva6/46xdsnbJ2iXr3zhrl6zvJet7ydol698469nrel6ydsnaJWuXrO8lf7zo/87P/oDR+m/5uQyX6bJctstxuS6fS06e3mfaZ9pn2mfaZ9pn2mfaZ9pn2mdamBamhWlhWpgWpoVpYVqYFqalaWlampam+TfO87zkeV7y7JJnlzy75Ple8nwveXbJs0ueXfLskmeXPLvk2SXPLnl2ybNLnr/jPH/HeXbJs0ueXfL8G+d5XvLskmeXPLvk2SXPLnl2ybNLnr/jPH/HeXbJs0ueXfL8G+d5XvLskmeXPLvk2SXPLnl2ybNLnr/jPH/HeXbJs0ueXfL8G+d5XvLskufvOM/3kud7ybNLnu8lz/eSZ5c8z16fZ6/P34Sf7yXPv3HO85LzvOQ8ez3fS873kvO95HwvOd9LzrPX83ec83ec8zfh873k/BvnPC85z0vOs9fzveR8LznfS873kvO95Dx7PX/HOX/HOX8TPt9Lzr9xzvOS87zkPHs930vO95LzveR8LznfS84uOX/HOX/HOX8TPt9Lzi45z0vO85Lz7PXskrNLzi45u+TskvPs9fxN+OySs0vOLjn/xjnPS84uObvk7JKzS84uObvk7JLz7PX8TfjskrNLzi45/8Y5z0vOLjm75OySs0vOLjm75OyS8+z1/E347JKzS84uOf/GOc9Lzi45u+TskrNLzi45u+TskvO95HwvObvk7JKzS873kvO95OiS7x9d8v2jS75/dMkn9/rJvX5yr98/zl6/f/yO8/2jS75/dMn3jy755F6/f59pn2mfaZ9pdMkn9/rJvX5yr9+/MI3fcb5/dMn3jy75/tEln9zr9y9MC9PCtDAt3cn02dJnS58tTeO95PuX7mS6k+lOpmllWplWppVp5U6Wz1Y+W/lsZVr5ubU72e5ku5NtWpvWprVpbVq7k+2zjc82PtuYNn5u406OOznu5Jg2po1pa9qatu7k+mzrs63Ptqatn9u6k+tOPnfymfZMe6Y9055pz518Ptvz2Z7Pdqadn9u5k+dOnjt5pp1pZ9qZZpd8donc6yf3+sm9fh9nr9/H7zjfZ5d8dslnl8i9ft9nml3y2SWfXfLZJXKvn9zrJ/f6fZ9p/I7zfXbJZ5d8donc6/eFaXbJZ5d8dslnl8i9fnKvn9zr96Vp/I7zfXbJZ5d8donc6/elaXbJZ5d8dslnl8i9fnKvn9zr95Vp5edml3x2yWeXyL1+X5tml3x2yWeXfHaJ3Osn9/rJvX7fmDZ+bnbJZ5d8donc6/eNaXbJZ5d8dslnl8i9fnKvn9zr961p6+dml3x2yWeXyL1+3zPNLvnsks8u+ewSuddP7vWTe/2+Z9rzc7NLPrvks0vkXr/vTLNLPrvks0s+u0Tu9ZN7/eRev+Ds9Qt+x/nCLgm7JOwSudcvOHv9wi4JuyTskrBL5F4/uddP7vWLzzR+x/nCLgm7JOwSudcvwjS7JOySsEvCLpF7/eReP7nXL9I0fsf5wi4JuyTsErnXT+71k3v95F6/sEvkXr8o08o0u0Tu9ZN7/eRevz/u9f5b/s6Cvj/u9b9l/3P5uQyX6bJctstxuS5Na9PGtDFtTBvTxrQxbUwb08a0MW1NW9PWtDVtTVvT1rQ1bU1b055pz7Tn5/b8X/L8X2KXyL1+cq+f3Osn9/qFXRJ2idzrF3ZJ2CVhl4RdIvf6yb1+cq9f8jvOl/yO86VdknZJ2iVyr19yXvKlXZJ2SdolaZfIvX5yr5/c65efafyO86VdknZJ2iVyr1+GaXZJ2iVpl6RdIvf6yb1+cq9fhmn8jvOlXZJ2Sdolcq9fpml2SaZpvpek7yVyr1/6XpK+l8i9fll+buVOljvpe4nc6yf3+sm9fnKvX/pekr6XpO8l6XtJ+l6SbVr7ubU72e6k7yXp3zg5po1pY5rvJel7Sfpekr6XpO8luaatn9u6k+tO+l6S/o2Ta9qatqb5XpK+l6TvJel7SfpeknZJPj+3504+d9L3ErnXT+71k3v95F4/udcv7ZK0S9IukXv98kzjN+Gv7JKyS8oukXv9yvOSskvKLim7pOwSuddP7vWTe/3qM43fhL+yS8ouKbtE7vUrz0vKLim7pOySskvkXj+510/u9aswjd+Ev7JLyi4pu0Tu9SvPS8ouKbuk7JKyS+ReP7nXT+71K99LyveSskvKLim7RO71K99Lyi4pu6TskrJL5F4/uddP7vWrNq393OySskvKLpF7/crzkrJLyi4pu6TsErnXT+71k3v9akwbPze7pOySskvkXr/yvKTskrJLyi4pu0Tu9ZN7/eRev/K9pHwvKbuk7JKyS+Rev/K9pOySskvKLim7RO71k3v95F6/OtPOz80uKbuk7RK51689L2m7pO2StkvaLpF7/eReP7nXrz17bX7H+douabuk7RK51689L2m7pO2StkvaLpF7/eReP7nXrz17bX7H+douabuk7RK51689L2m7pO2StkvaLpF7/eReP7nXr/0bp9PPzS5pu6TtErnXr/0bp+2StkvaLmm7RO71k3v95F6/9uy128/NLmm7pO0SudevPS9pu6TtkrZL2i6Re/3kXj+51689e+3xc7NL2i5pu0Tu9WvPS9ouabuk7ZK2S+ReP7nXT+71a89e+/m52SVtl7RdIvf6tX/jtF3SdknbJW2XyL1+cq+f3OvXnr32+bnZJW2XtF0i9/qN5yVjl4xdMnbJ2CVyr5/c6yf3+o1nr+PvOGOXjF0ydonc6zeel4xdMnbJ2CVjl8i9fnKvn9zrN569jr/jjF0ydsnYJXKv33heMnbJ2CVjl4xdIvf6yb1+cq/feF4ynpeMXTJ2ydglcq/fePY6dsnYJWOXjF0i9/rJvX5yr9949jr+jjN2ydglY5fIvX7j2evYJWOXjF0ydonc6yf3+sm9fuPZ6/g7ztglY5eMXSL3+o1nr2OXjF0ydsnYJXKvn9zrJ/f6jWev4+84Y5eMXTJ2idzrJ/f6yb1+cq/f2CVyr9949jqel8i9fnKvn9zrJ/f6/XGv99+Ss6A/7vW3fC45C1pYtW9h1b6FVfsWVu1bWLVvYdW+hVX7FlbtW1i1b/+Z9pn2mfaZ9pn2mfaZ9pn2mfaZ9pkWpoVpYVqYFqaFaWFamBamhWn+jbOel6znJXKvn9zrJ/f6yb1+cq/f2iVrl8i9fmuXrF2ydsnaJXKvn9zrJ/f6rb/jrL/jrF2ydsnaJXKv33pesnbJ2iVrl6xdIvf6yb1+cq/f+jvO+jvO2iVrl6xdIvf6recla5esXbJ2ydolcq+f3Osn9/qtv+Osv+OsXbJ2ydolcq/fel6ydsn6O876XrK+l8i9fut7yfpeIvf6rWevcq+f3Osn9/rJvX5yr5/c6yf3+q3vJc/3kud7yfO95Ple8jx7ff6O8/wd5/mb8PO95Pk3zvO85Hle8jx7fb6XPN9Lnu8lz/eS53vJ8+z1+TvO83ec52/Cz/eS5984z/OS53nJ8+z1+V7yfC95vpc830ue7yXPLnn+jiP3+sm9fnKvn9zrJ/f6yb1+cq+f3Ov37JJnlzy7RO71e569Pn8TfnbJs0ueXSL3+j3PS55d8uySZ5c8u0Tu9ZN7/eRev+fZ6/M34WeXPLvk2SVyr9/zvOTZJc8ueXbJs0vkXj+510/u9XuevT5/E352ybNLnl0i9/o9z0ueXfLskmeXPLtE7vWTe/3kXr/ne8nzveTZJc8ueXaJ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a+p7TX2vqe819b2m3GvKvabca+p7TX2vqe810y5Ju0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l4z7ZK0S+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXTLkm7RO419b2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XrPskrJL5F5T32vqe019r6nvNfW9ptxryr2m3Gvqe019r6nvNcsuKbtE7jX1vaa+19T3mvpeU99ryr2m3GvKvaa+19T3mvpes+ySskvkXlPfa+p7TX2vqe819b2m3GvKvabca+p7TX2vqe81yy4pu0TuNfW9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7JKyS+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXLLim7RO415V5T7jXlXlPfa8q9Zj3TPC+Re02515R7TbnX/ONe778lZ0F/3Ot/y/vn8nMZLtNluWyX43Jdmgarlg2rlg2rlg2rlg2rlg2rlg2rlg2rlg2rlg2rlv3PtM+0z7TPtM+0z7TPtM+0z7TPtM+0MC1M82+c9rxE32vKvabca8q9ptxryr1m2yVtl8i9pr7X1Pea+l5T32vKvabca8q9pr7X1Pea+l6z7ZK2S+ReU99r6ntNfa+p7zX1vabca8q9ptxr6ntNfa+p7zXbLmm7RO419b2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XrPtkrZL5F5T32vqe019r6nvNfW9ptxrtu8l7XuJ3Gvqe02515R7TbnXlHtNudeUe02519T3mvpeU99rtu8l7XuJvtfU95r6XrP5TTjH9xJ9r6nvNfW9pr7X1Pea+l5T32uO7yXje4m+19T3mvpec/hNOMf3En2vqe819b2mvtfU95r6XlPfa47vJeN7ib7X1Peacq8p95pyryn3mnKvKfeacq8p95r6XlPfa45dIvea+l5T32vqe82xS8YukXtNfa+p7zX1vaa+19T3mnKvKfeacq+p7zX1vaa+1xy7ZOwSudfU95r6XlPfa+p7TX2vKfeacq8p95r6XlPfa+p7zbFLxi6Re019r6nvNfW9pr7X1Peacq8p95pyr6nvNfW9pr7XHLtE32vKveb4XqLvNccuGbtk7BK515R7TbnXHM9ex99xxi4Zu2TsErnXXM9L1i5Zu2TtkrVL5F5T7jXlXnM9e11/x1m7ZO2StUvkXnM9L1m7ZO2StUvWLpF7TbnXlHvN9b1kfS9Zu2TtkrVL5F5zfS9Zu2TtkrVL1i6Re02515R7zfXsdf0dR99r6ntNfa8p95r6XlPfa+p7TX2vqe815V5T7jXlXlPfa+p7TX2vuXbJ2iVyr6nvNfW9pr7X1Pea+l5T7jXlXlPuNfW9pr7X1Peaa5esXSL3mvpeU99r6ntNfa+p7zXlXlPuNeVeU99r6ntNfa+5dsnaJXKvqe819b2mvtfU95r6XlPuNeVeU+419b2mvtfU95prl6xdIvea+l5T32vqe019r6nvNeVeU+415V5T32vqe019r/nskmeXyL2mvtfU95r6XlPfa+p7TbnXlHtNudfU95r6XlPfaz675Nklcq+p7zX1vaa+19T3mvpeU+415V5T7jX1vaa+19T3ms8ueXaJ3Gvqe019r6nvNfW9pr7XlHtNudeUe019r6nvNfW95rNLnl0i95r6XlPfa+p7TX2vqe815V5T7jXlXlPfa+p7TX2v+eySZ5fIvaa+19T3mvpeU99r6ntNudeUe02519T3mvpeU99rPrvk2SVyr6nvNfW9pr7X1Pea+l5T7jXlXlPuNfW9pr7X1Peazy55donca+p7TX2vqe819b2mvteUe02515R7TX2vqe819b3m2SVnl8i9pr7X1Pea+l5T32vqe02515R7TbnX1Pea+l5T32ueXXJ2idxryr2m3GvKvaa+15R7zfPsVd9ryr2m3GvKvabca/5xr/ffkrOgP+71t3wuOQs6WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1U7WbWTVTtZtZNVO1m1k1WTe83zvETfa8q9ptxryr2m3GvKvebZJWeXyL2mvtfU95r6XlPfa8q9ptxryr2mvtfU95r6XvPskrNL5F5T32vqe019r6nvNfW9ptxryb2W3Gvpey19r6Xvtf7RJfWPLim519L3WvpeS99r6Xstfa8l91pyryX3WvpeS99r6Xutf3RJ/aNLSu619L2WvtfS91r6Xkvfa8m91r/w2cJnS9M4ey2515J7LbnXknstudeSey2519L3WvpeS99r/SufrXy2Mq383MqdLHey3MkyrU1r09q0Nq3dyfbZ2mdrn61Naz+3cSfHnRx3ckwb08a0MW1MG3dyfLb12dZnW9PWz23dyXUn151c09a0Ne2Z9kx77uTz2Z7P9ny2Z9rzc3vu5HMnz5080860M+1MO9POnTyf7Xw2u0Tfa+l7rc8u+eySzy6Rey19r6XvtfS9lr7X0vdacq8l91pyr6XvtfS9lr7X+uySzy6Rey19r6XvtfS9lr7X0vdacq8l91pyr6XvtfS9lr7X+uwSfa8l91pfmmaXfHbJZ5d8donca8m9ltxrfWVa+bnZJZ9d8tklcq/1lWl2yWeXfHbJZ5fIvZbca8m91temtZ+bXfLZJZ9dIvda35hml3x2yWeXfHaJ3GvJvZbca31r2vq52SWfXfLZJXKv9a1pdslnl3x2yWeXyL2W3GvJvdb3THt+bnaJvtfS91pyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaYZeEXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa8VdknYJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91phl4RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19rxV2Sdglcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmGXhF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vFXZJ2CVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaYZeEXSL3WvpeS99r6Xstfa+l77XkXkvuteReS99r6Xstfa8VdknaJXKvpe+19L2WvtfS91r6XkvuteReS+619L2WvtfS91ppl6RdIvda+l5L32vpey19r6XvteReS+615F5L32vpey19r5V2Sdolcq+l77X0vZa+19L3WvpeS+615F5L7rX0vZa+19L3WmmXpF0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2vlXZJ2iVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaaZekXSL3WnKvJfdacq+l77XkXivXtDXNLpF7LbnXknutP+71/lv+zoLqj3v9LcflunwujyWsWiWsWiWsWiWsWuWZdqadaWfamQarVgWrVgWrVgWrVgWrVgWrVgWrVgWrVgWrVgWrVvXPtM+0z7TPtM+0z7TPtM+0zzT/xinPS/S9ltxryb2W3GvJvZbca5VdUnaJ3Gvpey19r6XvtfS9ltxryb2W3Gvpey19r6XvtcouKbtE7rX0vZa+19L3WvpeS99ryb2W3GvJvZa+19L3Wvpeq+ySskvkXkvfa+l7LX2vpe+19L2W3GvJvZbca+l7LX2vpe+1yi4pu0TutfS9lr7X0vda+l5L32vJvVb5XlK+l8i9lr7XknstudeSey2515J7LbnXknstfa+l77X0vVb5XlK+l+h7LX2vpe+16txJ30v0vZa+19L3WvpeS99r6Xstfa/Vvpe07yX6Xkvfa+l7reY34WrfS/S9lr7X0vda+l5L32vpey19r9W+l7TvJfpeS99ryb2W3GvJvZbca8m9ltxryb2W3Gvpey19r9V2idxr6Xstfa+l77XaLmm7RO619L2WvtfS91r6Xkvfa8m9ltxryb2WvtfS91r6XqvtkrZL5F5L32vpey19r6XvtfS9ltxryb2W3Gvpey19r6XvtdouabtE7rX0vZa+19L3WvpeS99ryb2W3GvJvZa+19L3Wvpeq+0Sfa8l91rte4m+12q7pO2StkvkXkvuteReqz177fNzs0vaLmm7RO612vOStkvaLmm7ZOwSudeSey251xrPXsffccYuGbtk7BK51xrPS8YuGbtk7JKxS+ReS+615F5rfC8Z30vGLhm7ZOwSudca30vGLhm7ZOySsUvkXkvuteReazx7HX/H0fda+l5L32vJvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rjV0ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2CVjl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32uNXTJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbYJWOXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa61dsnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91tola5fIvZa+19L3WvpeS99r6XstudeSey2519L3WvpeS99rrV2ydonca+l7LX2vpe+19L2WvteSey2515J7LX2vpe+19L3W2iVrl8i9lr7X0vda+l5L32vpey2515J7LbnX0vda+l5L32utXbJ2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbaJWuXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa61dsnaJ3Gvpey19r6XvtfS9lr7XknstudeSey19r6XvtfS91rNLnl0i91r6Xkvfa+l7LX2vpe+15F5L7rXkXkvfa+l7LX2v9eySZ5fIvZbca8m9ltxr6Xstudd6nr3qey2515J7LbnXknutP+71/ltyFvTHvf6W5bJdjst1+Vxy8vRg1erBqtUr08q0Mq1MK9PKtDKtTGvT2rQ2rU1r09q0Nq1Na9PatDFtTBvTxrQxbUzzb5zneYm+15J7LbnXknstudeSe61nlzy7RO619L2WvtfS91r6XkvuteReS+619L2WvtfS91rPLnl2idxr6Xstfa+l77X0vZa+15J7LbnXknstfa+l77X0vdbZJWeXyL2WvtfS91r6Xkvfa+l7LbnXknstudfS91r6Xkvfa51dcnaJ3Gvpey19r6XvtfS9lr7Xknut873kfC+Rey19ryX3WnKvJfdacq8l91pyryX3WvpeS99r6Xut873kfC/R91r6Xkvfa52/CZ/vJfpeS99r6Xstfa+l77X0vZa+1zrfS873En2vpe+19L3W+Zvw+V6i77X0vZa+19L3WvpeS99r6Xut873kfC/R91r6XkvuteReS+615F5L7rXkXkvuteReS99r6Xuts0vkXkvfa+l7LX2vdXbJ2SVyr6XvtfS9lr7X0vda+l5L7rXkXkvutfS9lr7X0vdaR5f0P7qk5V5b32vre219r63vtfW9ttxry7223Gvre219r63vtf/RJf2PLmm519b32vpeW99r63ttfa8t99pyry332vpeW99r63vtf3RJ63ttudf+l6alaWlampbuZPps6bOlz5ampZ9buZPlTpY7WaaVaWVamVamlTtZPlv7bO2ztWnt59buZLuT7U62aW1amzamjWnjTo7PNj7b+Gxj2vi5jTs57uS6k2vamramrWlr2rqT67Otz7Y+2zPt+bk9d/K5k8+dfKY9055pz7Rn2rmT57Odz3Y+25l2fm7nTp47ee4kf+O0vtfW99r6XvuzSz67RO615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32p9d8tklcq+t77X1vba+19b32vpeW+615V5b7rX1vba+19b32mGXhF0i99r6Xlvfa+t7bX2vre+15V5b7rXlXlvfa+t7bX2vHXZJ2CVyr63vtfW9tr7X1vfa+l5b7rXlXlvutfW9tr7X1vfaYZeEXSL32vpeW99r63ttfa+t77XlXlvuteVeW99r63ttfa8ddknYJXKvre+19b22vtfW99r6XlvuteVeW+619b22vtfW99phl4RdIvfacq8t99pyr63vteVeO9a0Nc0ukXttudeWe+0/7vX+t3y/s6D+415/y3CZLstluxyX6/K5PJZn2pl2pp1pZ9qZdqadaWcarFonrFonrFonrFonrFonrFonrFonrFonrFonrFrnP9M+0z7TPtM+0/wbJzkvaX2vLffacq8t99pyry332mmXpF0i99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bRL0i6Re219r63vtfW9tr7X1vfacq8t99pyr63vtfW9tr7XTrsk7RK519b32vpeW99r63ttfa8t99pyry332vpeW99r63vttEvSLpF7bX2vre+19b22vtfW99pyr52+l6TvJXKvre+15V5b7rXlXlvuteVeW+615V5b32vre219r52+l6TvJfpeW99r63vtPHfS9xJ9r63vtfW9tr7X1vfa+l5b32uX7yXle4m+19b32vpeu/hNuMv3En2vre+19b22vtfW99r6Xlvfa5fvJeV7ib7X1vfacq8t99pyry332nKvLffacq8t99r6Xlvfa5ddIvfa+l5b32vre+2yS8oukXttfa+t77X1vba+19b32nKvLffacq+t77X1vba+1y67pOwSudfW99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bJLyi6Re219r63vtfW9tr7X1vfacq8t99pyr63vtfW9tr7XLrtE32vLvXb5XqLvtcsuKbuk7BK515Z7bbnXrmfa83OzS8ouKbtE7rXL85KyS8ouKbuk7BK515Z7bbnXbs9em99xuu2StkvaLpF77fa8pO2StkvaLmm7RO615V5b7rXb95L2vaTtkrZL2i6Re+32vaTtkrZL2i5pu0TuteVeW+6127PX5nec1vfa+l5b32vLvba+19b32vpeW99r63ttudeWe22519b32vpeW99rt13Sdonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b122yVtl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32u3XdJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vXbbJW2XyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa49dMnaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99tglY5fIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rj10ydonca+t7bX2vre+19b22vteWe22515Z7bX2vre+19b322CVjl8i9tr7X1vfa+l5b32vre22515Z7bbnX1vfa+l5b32uPXTJ2idxr63ttfa+t77X1vba+15Z7bbnXlnttfa+t77X1vfbYJWOXyL22vtfW99r6Xlvfa+t7bbnXlnttudfW99r6Xlvfa49dMnaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99tgla5fIvba+19b32vpeW99r63ttudeWe22519b32vpeW99rr12ydonca8u9ttxry722vteWe+317FXfa8u9ttxry7223Gv/ca/335KzoD/u9b9l/nP5uQyX6bJctstxuS5NS9PKtDKtTCvTyrQyrUwr08q0Mq1Na9PatDatTWvT2rQ2rU1r08a0Mc2/cdbzEn2vLffacq8t99pyry332muXrF0i99r6Xlvfa+t7bX2vLffacq8t99r6Xlvfa+t77bVL1i6Re219r63vtfW9tr7X1vfacq8t99pyr63vtfW9tr7XXrtk7RK519b32vpeW99r63ttfa8t99pyry332vpeW99r63vtZ5c8u0TutfW9tr7X1vfa+l5b32vLvfbzveT5XiL32vpeW+615V5b7rXlXlvuteVeW+619b22vtfW99rP95Lne4m+19b32vpe+/mb8PO9RN9r63ttfa+t77X1vba+19b32s/3kud7ib7X1vfa+l77+Zvw871E32vre219r63vtfW9tr7X1vfaz/eS53uJvtfW99pyry332nKvLffacq8t99pyry332vpeW99rP7tE7rX1vba+19b32s8ueXaJ3Gvre219r63vtfW9tr7XlnttudeWe219r63vtfW99rNLnl0i99r6Xlvfa+t7bX2vre+15V5b7rXlXlvfa+t7bX2vfXbJ2SVyr63vtfW9tr7X1vfa+l5b7rXlXlvutfW9tr7X1vfaZ5foe2251z7fS/S99tklZ5ecXSL32nKvLffa59nr+TvO2SVnl5xdIvfa53nJ2SVnl5xdcnaJ3GvLvbbca59nr+fvOGeXnF1ydonca5/nJWeXnF1ydsnZJXKvLffacq99vpec7yVnl5xdcnaJ3Guf7yVnl5xdcnbJ2SVyry332nKvfZ69nr/j6Httfa+t77XlXlvfa+t7bX2vre+19b223GvLvbbca+t7bX2vre+1zy45u0TutfW9tr7X1vfa+l5H3+vIvY7c68i9jr7X0fc6+l7nH10y/+iSkXsdfa+j73X0vY6+19H3OnKvI/c6cq+j73X0vY6+1/lHl8w/umTkXkff6+h7HX2vo+919L2O3OvIvY7c6+h7HX2vo+91/qU7me5kmpampWllWplW7mT5bOWzlc9WppWfW7mT5U62O9mmtWltWpvWprU72T5b+2zts41p4+c27uS4k+NOjmlj2pg2po1p606uz7Y+2/psa9r6ua07ue7kupNr2jPtmfZMe6Y9d/L5bM9nez7bM+35uZ07ee7kuZNn2pl2pp1pZ9q5k3aJ3OvIvY6+19H3Op9d8tkln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zr6Xkff6+h7HX2vo+915F5H7nXkXkff6+h7HX2v89kln10i9zpyryP3OnKvo+915F7nG9PWNLtE7nXkXkfudf641/tv+TsLmj/u9bd8Lo8lrNp8sGrzwarNB6s2H6zafLBq8z3TnmnPtGfamXamnWln2pl2pp1pZ9qZBqs2Aas2Aas2Aas2Aas2Aas2Aas2Aas2Aas2Aas28c80/saZ4Lxk9L2O3OvIvY7c68i9jtzrhF0Sdonc6+h7HX2vo+919L2O3OvIvY7c6+h7HX2vo+91wi4J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AksCS3ivHWsbliSWJJYklvBem/favNdO55J0LkksSSxJLOG9djqXJJYkliSWJJbwXpv32rzXzrDt+47Teq+t99p6r817bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332okliSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r51YkljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qJJYklvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq+dWJJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffaiSWJJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvXVhSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332oUlhSW819Z7bb3X1nttvdfWe23ea/Nem/faeq+t99p6r11YUljCe22919Z7bb3X1nttvdfmvTbvtXmvrffaeq+t99qFJYUlvNfWe22919Z7bb3X1ntt3mvzXpv32nqvrffaeq9dWFJYwnttvdfWe22919Z7bb3X5r0277V5r6332nqvrffahSWFJbzX1nttvdfWe22919Z7bd5r816b99p6r6332nqvXVhSWMJ7bb3X1nttvdfWe2291+a9Nu+1ea+t99p6r6332hdLLpbwXpv32rzX5r223mvzXvu6e9V7bd5r816b99q81/7jvf77/dkf77X+Go8xjGks4zU+YxvH+N083bQtbUvb0ra0LW1L29K2tC1tK9vKtrKtbCvbyrayrWwr28q2a9u17dp2bfM3znVfovfavNfmvTbvtXmvzXvtiyUXS3ivrffaeq+t99p6r817bd5r815b77X1XlvvtS+WXCzhvbbea+u9tt5r67223mvzXpv32rzX1nttvdfWe+2LJRdLeK+t99p6r6332nqvrffavNfmvTbvtfVeW++19V77YcnDEt5r67223mvrvbbea+u9Nu+1n3PJcy7hvbbea/Nem/favNfmvTbvtXmvzXttvdfWe229137OJc+5RO+19V5b77VfepPOJXqvrffaeq+t99p6r6332nqv/ZxLnnOJ3mvrvbbea7/yJp1L9F5b77X1XlvvtfVeW++19V77OZc85xK919Z7bd5r816b99q81+a9Nu+1ea/Ne22919Z77YclvNfWe22919Z77YclD0t4r6332nqvrffaeq+t99q81+a9Nu+19V5b77X1XvthycMS3mvrvbbea+u9tt5r670277V5r817bb3X1nttvdduLGks4b223mvrvbbea+u9tt5r816b99q819Z7bb3X1nvtxhK91+a9djuX6L12Y0ljSWMJ77V5r8177Xb32r7jNJY0ljSW8F673Zc0ljSWNJY0lvBem/favNdud6/tO05jSWNJYwnvtdt9SWNJY0ljSWMJ77V5r8177XYuaeeSxpLGksYS3mu3c0ljSWNJY0ljCe+1ea/Ne+1299q+4+i9tt5r670277X1XlvvtfVeW++19V6b99q81+a9tt5r67223ms3ljSW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6712Y8lgCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rD5YMlvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u99mDJYAnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeaw+WDJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZgyWAJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msPlgyW8F5b77X1XlvvtfVeW++1ea/Ne23ea+u9tt5r6732YMlgCe+19V5b77X1XlvvtfVem/favNfmvbbea+u9tt5rD5YMlvBeW++19V5b77X1XlvvtXmvzXtt3mvrvbbea+u99mLJYgnvtfVeW++19V5b77X1Xpv32rzX5r223mvrvbbeay+WLJbwXlvvtfVeW++19V5b77V5r817bd5r67223mvrvfZiyWIJ77X1XlvvtfVeW++19V6b99q81+a9tt5r67223msvliyW8F6b99q81+a9tt5r81573b3qvTbvtXmvzXtt3mv/8V73r/G7C/rjvf419o/xGMOYxjJe4zO20Tau2nLVlqu2XLXlqi1Xbblqy1Vbrtpy1Zartly15aotV225astVW67actWWq7Zctf1ctfn5XLX5+Vy14b3Oz3dfMnqvw3sd3uvwXof3OrzX+flYMj8fS4b3Onqvo/c6eq+j9zq81+G9Du919F5H73X0XucnPFt4trAtbAvbwraw7WPJ8F6H9zq819F7Hb3X0Xudn48l8/OxZHivo/c6eq+j9zp6r6P3OrzX4b0O73X0XkfvdfRe5+d6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q/e6eq+r97oXSy6W8F5X73X1XlfvdfVeV+91ea/Le13e6+q9rt7r6r3uxZKLJbzX1XtdvdfVe12919V7Xd7r8l6X97p6r6v3unqv+7DkYQnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6z4seVjCe12919V7Xb3X1XtdvdflvS7vdXmvq/e6eq+r97oPSx6W8F5X73X1XlfvdfVeV+91ea/Le13e6+q9rt7r6r3uw5KHJbzX1XtdvdfVe12919V7Xd7r8l6X97p6r6v3unqv+7DkYQnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6z4seVjCe12919V7Xb3X1XtdvdflvS7vdXmvq/e6eq+r97oPSx6W8F5X73X1XlfvdfVeV+91ea/Le13e6+q9rt7r6r1uY0ljCe919V5X73X1XlfvdfVel/e6vNflva7e6+q9rt7rNpY0lvBeV+919V5X73X1XlfvdXmvy3td3uvqva7e6+q9bmNJYwnvdfVeV+919V5X73X1Xpf3urzX5b2u3uvqva7e6zaWNJbwXpf3urzX5b2u3uvyXrfdveq9Lu91ea/Le13e6/7xXv/9/uyP91p/jccYxjSW8RqfsY1j/G6eum1r29q2tq1ta9vatratbWvbxraxbWwb28a2sW1sG9vGtrFtbVvb1ra1zd847b5E73V5r8t7Xd7r8l6X97qDJYMlvNfVe12919V7Xb3X5b0u73V5r6v3unqvq/e6gyWDJbzX1XtdvdfVe12919V7Xd7r8l6X97p6r6v3unqvO1gyWMJ7Xb3X1XtdvdfVe1291+W9Lu91ea+r97p6r6v3uoMlgyW819V7Xb3X1XtdvdfVe13e645zyTiX8F5X73V5r8t7Xd7r8l6X97q81+W9rt7r6r2u3uuOc8k4l+i9rt7r6r3u+CY8ziV6r6v3unqvq/e6eq+r97p6rzvOJeNcove6eq+r97rjm/A4l+i9rt7r6r2u3uvqva7e6+q97jiXjHOJ3uvqvS7vdXmvy3td3uvyXpf3urzX5b2u3uvqve5iCe919V5X73X1XnexZLGE97p6r6v3unqvq/e6eq/Le13e6/JeV+919V5X73UXSxZLeK+r97p6r6v3unqvq/e6vNflvS7vdfVeV+919V53sWSxhPe6eq+r97p6r6v3unqvy3td3uvyXlfvdfVe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XlPvNfVek/eavNfkvabea+q9pt5rDpYMlvBeU+819V5T7zX1XlPvNXmvyXtN3mvqvabea+q95mDJYAnvNfVeU+819V5T7zX1XpP3mrzX5L2m3mvqvabeaw6WDJbwXlPvNfVeU+819V5T7zV5rznOJeNcwntNvdfkvSbvNXmvyXtN3mvyXpP3mnqvqfeaeq85ziXjXKL3mnqvqfea65vwOpfovabea+q9pt5r6r2m3mvqveY6l6xzid5r6r2m3muub8LrXKL3mnqvqfeaeq+p95p6r6n3mutcss4leq+p95q81+S9Ju81ea/Je03ea/Jek/eaeq+p95qLJbzX1HtNvdfUe83FksUS3mvqvabea+q9pt5r6r0m7zV5r8l7Tb3X1HtNvddcLFks4b2m3mvqvabea+q9pt5r8l6T95q819R7Tb3X1HvNxZLFEt5r6r2m3mvqvabea+q9Ju81ea/Je02919R7Tb3XXCzRe03ea65zid5rLpYsliyW8F6T95q811x3r/t9x6mfjyX187Gkfj6WFO+1fr77kvr5WFI/H0vq52NJ/XwsKd5r8V6L91o/x7bvO079fCypn48l9fOxpHiv9XNsO7aFbWHbx5LivRbvtXiv9RO2feeS+vlYUj/hTaY3mbalbWlb2pa2pTeZni09W3q2sq38buVNljdZ3mTZVraVbWVb2Xa9yevZrme7nu3adv1u15u83uT1Jq9tz7Zn27Pt2fa8yefZnmd7nu3Z9vxu7U22N9neZNvWtrVtbVvb1t5ke7bxbOPZxrbxu403Od7keJNj29g2tq1ta9t6k+vZ1rOtZ1vb1u+23iSWHCzhvZbea+m9lt5r6b2W3mvxXov3WrzX0nstvdc6WHKw5GAJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3msdLDlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaB0sOlvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m91sGSgyW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r3Ww5GAJ77X0XkvvtfReS++19F6L91q81+K9lt5r6b2W3msdLDlYwnstvdfSey2919J7Lb3X4r0W77V4r6X3WnqvpfdaB0sOlvBeS++19F5L77X0XkvvtXivxXst3mvpvZbea+m9VmBJYAnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbeawWWBJbwXov3WrzX4r2W3mvxXivStrQNS3ivxXst3mv98V7338f6+y6o/nivf49hTGMZr/EZ2zjG/cZr27Xt2nZtu7Zd265t17Zr27Xt2fZse7Y9255tz7Zn27Pt2fZsa9vatratbWu/W/u3pP1bgiW81+K9Fu+1eK8VWBJYwnstvdfSey2919J7Ld5r8V6L91p6r6X3WnqvFVgSWMJ7Lb3X0nstvdfSey291+K9Fu+1eK+l91p6r6X3WokliSW819J7Lb3X0nstvdfSey3ea/Fei/daeq+l91p6r5VYkljCey2919J7Lb3X0nstvdfivVY6l6RzCe+19F6L91q81+K9Fu+1eK/Fey3ea+m9lt5r6b1WOpekc4nea+m9lt5r5fUmnUv0XkvvtfReS++19F5L77X0XiudS9K5RO+19F5L77XyeZPOJXqvpfdaeq+l91p6r6X3Wnqvlc4l6Vyi91p6r8V7Ld5r8V6L91q81+K9Fu+1eK+l91p6r5VYwnstvdfSey2910osSSzhvZbea+m9lt5r6b2W3mvxXov3WrzX0nstvdfSe63CksIS3mvpvZbea+m9lt5r6b0W77V4r8V7Lb3X0nstvdcqLCks4b2W3mvpvZbea+m9lt5r8V6L91q819J7Lb3X0nutwhK91+K9VjmX6L1WYUlhSWEJ77V4r8V7rSrbyu+GJYUlhSW81yr3JYUlhSWFJYUlvNfivRbvterZ9vxuWFJYUljCe61yX1JYUlhSWFJYwnst3mvxXqucS8q5pLCksKSwhPda5VxSWFJYUlhSWMJ7Ld5r8V6rxrbxu2GJ3mvpvRbvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbea10suVjCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91oXSy6W8F5L77X0XkvvtfReS++1eK/Fey3ea+m9lt5r6b3WxZKLJbzX0nstvdfSey2919J7Ld5r8V6L91p6r6X3WnqvdbHkYgnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbea10suVjCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91oXSy6W8F5L77X0XkvvtfReS++1eK/Fey3ea+m9lt5r6b3WxZKLJbzX0nstvdfSey2919J7Ld5r8V6L91p6r6X3Wnqv9bDkYQnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbeaz0seVjCey2919J7Lb3X0nstvdfivRbvtXivpfdaeq+l91oPSx6W8F5L77X0XkvvtfReS++1eK/Fey3ea+m9lt5r6b3Ww5KHJbzX0nstvdfSey2919J7Ld5r8V6L91p6r6X3Wnqv9bDkYQnvtfReS++19F5L77X0Xov3WrzX4r2W3mvpvZbeaz0seVjCey3ea/Fei/daeq/Fe63n7lXvtXivxXst3mvxXuuP97p/jf/YduLf/rf/8P/+p3/9p//0n//5v/4//+F/////8R//r//53/7L//inf/lvf/3H//H//fe//5v//K//9M///E//93/87//6L//lv/6f//Nf/+t//Od/+S9//rt/+z/+7X8B", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "50": { - "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake3_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake3_hashed = std::hash::blake3(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake3_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = blake3_to_field(hash_input_flattened);\n blake3_digest\n}\n", + "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake2s_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake2s_hashed = std::hash::blake2s(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake2s_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake2s_digest = blake2s_to_field(hash_input_flattened);\n blake2s_digest\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 1505dee4bac..ddf16fd5316 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -52,16 +52,16 @@ expression: artifact "return value indices : [_256]", "BRILLIG CALL func 0: inputs: [Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(3))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(4))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(5))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(6))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(7))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(8))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(9))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(11))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(12))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(13))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(14))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(17))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(20))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(23))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(26))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(29))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(32))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(35))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(38))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(41))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(45))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(46))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(47))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(48))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(49))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(50))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(51))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(52))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(53))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(54))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(55))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(56))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(57))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(58))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(60))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(61))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(62))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(63))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(64))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(65))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(66))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(67))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(68))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(69))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(71))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(72))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(73))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(74))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(75))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(76))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(77))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(78))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(79))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(80))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(82))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(83))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(84))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(85))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(86))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(87))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(88))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(89))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(90))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(91))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(92))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(93))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(94))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(95))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(96))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(97))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(98))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(100))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(101))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(102))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(103))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(104))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(105))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(106))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(107))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(108))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(109))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(110))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(111))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(112))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(113))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(114))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(115))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(116))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(117))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(118))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(119))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(120))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(121))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(122))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(124))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(125))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(126))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(127))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(128))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(129))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(130))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(131))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(132))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(133))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(135))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(136))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(137))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(138))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(139))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(140))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(141))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(142))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(143))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(144))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(148))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(149))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(150))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(151))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(153))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(154))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(155))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(156))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(157))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(158))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(159))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(160))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(161))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(162))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(163))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(167))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(168))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(169))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(170))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(171))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(172))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(173))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(174))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(175))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(177))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(178))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(179))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(180))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(181))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(182))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(184))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(185))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(186))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(187))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(188))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(189))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(190))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(191))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(192))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(193))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(194))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(195))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(196))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(197))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(198))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(199))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(200))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(201))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(202))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(203))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(204))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(205))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(206))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(207))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(208))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(209))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(210))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(211))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(212))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(213))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(214))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(215))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(216))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(217))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(218))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(219))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(220))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(221))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(222))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(223))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(224))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(225))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(226))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(227))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(228))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(229))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(230))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(231))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(232))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(233))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(234))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(235))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(236))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(237))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(238))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(239))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(240))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(241))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(242))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(243))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(244))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(245))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(246))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(247))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(248))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(249))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(250))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(251))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(252))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(253))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(254))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(255))], q_c: 0 }])], outputs: [Simple(Witness(256))]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33097 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32840), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32840 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 257 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 24 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 35 }, Call { location: 41 }, Mov { destination: Direct(33096), source: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33096 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 1 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 34 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 27 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 256 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32837), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 32 }, Return, Call { location: 125 }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 8193 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(7), source: Relative(5) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 57 }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Jump { location: 51 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8192 }, Mov { destination: Relative(2), source: Direct(32836) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(5), location: 83 }, Jump { location: 66 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(3), size: Relative(4) }, output: HeapArray { pointer: Relative(5), size: 32 } }), Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 131 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(5) }, Return, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(6), radix: Direct(32835), output_pointer: Relative(9), num_limbs: Relative(10), output_bits: Relative(8) }), BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32836) }, Jump { location: 97 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32839) }, JumpIf { condition: Relative(8), location: 103 }, Jump { location: 100 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, Mov { destination: Relative(2), source: Relative(5) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 107 }, Call { location: 199 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 114 }, Call { location: 202 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 8193 }, Call { location: 205 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, Store { destination_pointer: Relative(13), source: Relative(9) }, Store { destination_pointer: Relative(3), source: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Mov { destination: Relative(5), source: Relative(8) }, Jump { location: 97 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 130 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 125 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(3), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Field, value: 0 }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 30 }, Const { destination: Relative(8), bit_size: Field, value: 256 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(2), source: Direct(32836) }, Jump { location: 149 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(10), location: 166 }, Jump { location: 152 }, Load { destination: Relative(2), source_pointer: Relative(6) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 16 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Cast { destination: Relative(1), source: Relative(7), bit_size: Field }, Load { destination: Relative(5), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(1), rhs: Relative(5) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(2), rhs: Relative(3) }, Store { destination_pointer: Relative(6), source: Relative(1) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(5) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Load { destination: Relative(10), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(11), op: Sub, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Direct(32839) }, JumpIf { condition: Relative(12), location: 171 }, Call { location: 202 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Field }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(10), rhs: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(11) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(12), rhs: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Sub, bit_size: U32, lhs: Relative(9), rhs: Relative(2) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(9) }, JumpIf { condition: Relative(13), location: 186 }, Call { location: 227 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(13), location: 189 }, Call { location: 202 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Field }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(12), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(10), op: Add, lhs: Relative(11), rhs: Relative(13) }, Store { destination_pointer: Relative(4), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, Mov { destination: Relative(2), source: Relative(10) }, Jump { location: 149 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 209 }, Jump { location: 211 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 226 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 223 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 216 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 226 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33097 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32840), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32840 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 257 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 24 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 35 }, Call { location: 41 }, Mov { destination: Direct(33096), source: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33096 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 1 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 34 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 27 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 256 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32837), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 32 }, Return, Call { location: 125 }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 8193 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(7), source: Relative(5) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 57 }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Jump { location: 51 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8192 }, Mov { destination: Relative(2), source: Direct(32836) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(5), location: 83 }, Jump { location: 66 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(3), size: Relative(4) }, output: HeapArray { pointer: Relative(5), size: 32 } }), Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 131 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(5) }, Return, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(6), radix: Direct(32835), output_pointer: Relative(9), num_limbs: Relative(10), output_bits: Relative(8) }), BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, Mov { destination: Relative(5), source: Direct(32836) }, Jump { location: 97 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32839) }, JumpIf { condition: Relative(8), location: 103 }, Jump { location: 100 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, Mov { destination: Relative(2), source: Relative(5) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 107 }, Call { location: 199 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 114 }, Call { location: 202 }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 8193 }, Call { location: 205 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, Store { destination_pointer: Relative(13), source: Relative(9) }, Store { destination_pointer: Relative(3), source: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Mov { destination: Relative(5), source: Relative(8) }, Jump { location: 97 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 130 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 125 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(4), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(3), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Field, value: 0 }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 30 }, Const { destination: Relative(8), bit_size: Field, value: 256 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(2), source: Direct(32836) }, Jump { location: 149 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(10), location: 166 }, Jump { location: 152 }, Load { destination: Relative(2), source_pointer: Relative(6) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 16 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Cast { destination: Relative(1), source: Relative(7), bit_size: Field }, Load { destination: Relative(5), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(1), rhs: Relative(5) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(2), rhs: Relative(3) }, Store { destination_pointer: Relative(6), source: Relative(1) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(3), op: Mul, lhs: Relative(2), rhs: Relative(5) }, BinaryFieldOp { destination: Relative(2), op: Add, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Load { destination: Relative(10), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(11), op: Sub, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Direct(32839) }, JumpIf { condition: Relative(12), location: 171 }, Call { location: 202 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Field }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(11), op: Add, lhs: Relative(10), rhs: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(11) }, BinaryFieldOp { destination: Relative(10), op: Mul, lhs: Relative(12), rhs: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Sub, bit_size: U32, lhs: Relative(9), rhs: Relative(2) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(2), rhs: Relative(9) }, JumpIf { condition: Relative(13), location: 186 }, Call { location: 227 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, JumpIf { condition: Relative(13), location: 189 }, Call { location: 202 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Field }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(12), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(10), op: Add, lhs: Relative(11), rhs: Relative(13) }, Store { destination_pointer: Relative(4), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32838) }, Mov { destination: Relative(2), source: Relative(10) }, Jump { location: 149 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 209 }, Jump { location: 211 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 226 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 223 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 216 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 226 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZfdbqMwEIXfhWsu7LHHP32VVVSlKa0iIRLRZKVVlXdfH8ZD2wtWK3PT81E4x2MzdsRn9zq83N+fz9Pb5aN7+vXZvczncTy/P4+X0/F2vkzlv5+dwR9P3ZPtO+9EvAiLBJEokkTyImxErIiksKSwpLCksKSwpLCksKSEYqAi5RFXpDzCRZJIXiQaEStCIk7Ei5SBQpEgEkWSSF4kGRErUuyxiBdhEdRpisaqqWoWzaaqrUpVXVXMuswpw18mZY1ZZmUNHljAK7BCUIDJA5JCrmCNglUgBafgZSjLVUPVWDVVzaJUSyNblUQdkhngFLwCK6DmAIgKSSFX8Kg5AqwCKeCZVGDpmQxAExiAV2CFMhZZQFQoYxFWFx1EqDkYBatQkgnLsrQXakaDLYOixQgVoskEcgU0mgByUCqaTcApoELkoOUEUCFmgbZzqBmNJ4DFRs1oPgGrgPXGLNCJAl6BFYJCVEgKSMZM0ZMCVgHJmDva0mHuS1+iwswKWI38ePSdngfPt3kYcBx8OyDKsXE9zsN0656m+zj23e/jeF8e+rgep0Vvx7ncLXMdpteiJfDtPA6gR//lNtvWnLiacwqrnf/bX7aUBpQt5FoSyARNIKaWBIdekwQX7FaC306ILtWAGE2LP6s/udQyA2vXVbTe703gzTeZthOYkvYRU/5KsOlHQt5OCBHnwpIQok9bCf/sBWzy2guNK5nyug7ZNvXjtxq4LYHXd0GpJYG8vgryTf6gL4Jiy46irH5nWvwOvxTip5Yzge3aij62+LMeCMHwPr/1TX63+nOLP8Vd/uDWjehNi5/CLr+36vfU8v68Sas/7fO7tvF1/b2nJr/d5+d1/ULT/lnfHztq2n9p9bt9ft82ftzY/4dydTyd5x8fUg8kzefjyzjUy7f7dPp29/bnqnf0Q+w6X07D630ekPT1NVb+/CLDPVE49J3Dle+dP+B7oFyUo723zuDS4l75qSDKhwcK+ws=", + "debug_symbols": "pZfdbuIwEIXfJde5sMce//RVKlRRmlZIEaAUVloh3n19Mp5AV8pqZW44X0jO8diZGHLtPob3y9fb/vB5/O5eXq/d+7Qfx/3X23jcbc/746F8e+0MPjx1L7bvvBPxIiwSRKJIEsmzsBGxIpLCksKSwpLCksKSwpLCkhKKgYqUS1yRcgkXSSJ5lmhErAiJOBEvUgYKRYJIFEkieZZkRKxIscciXoRFUKcpGqumqlk0m6q2KlV1VTHrMqcMf5mUNWaelTW4YAavwApBASYPSAq5gjUKVoEUnIKXoSxXDVVj1VQ1i1ItjWxVEnVIZoBT8AqsgJoDICokhVzBo+YIsAqkgGtSgblnMgBNYABegRXKWGQBUaGMRVhddBCh5mAUrEJJJizL3F6oGQ02D4oWI1SIJhPIFdBoAshBqWg2AaeACpGDlhNAhZgF2s6hZjSeABYbNaP5BKwC1huzQCcKeAVWCApRISkgGTNFTwpYBSRj7mhLh7nPfYkKMytgNfLt1ne6H7ydp2HAdvCwQZRt47SdhsO5ezlcxrHvfm3Hy3zR92l7mPW8ncrZMtfh8FG0BH7uxwF06+9us27NKVdzznc7/7e/PFIaUB6h2JJAVuu3xKElwdFSgwurNfj1hOi1hBhdgz8ZW/3JU8sMrF1mYH16NiGs3sm0nsCUdBGY8v0+2PQjIa8nhIh9YU4I8WEWfyX8sxecXXqhcSWzW9Yhc1M/PtTAbQm83AtKLQm09CN52+IPeiMotqwiZfU70+J3pEvoyDX4edkS2LfsKZy9NqLh5/zWN/nd4s8t/hSf8ge3PIi+ZVcP+Bl+wu+t+j213D9v0uJPz/ld2/i6/r5pF/LL70Gjn5f1C03Pz3L/2FHT85cWv3vO79vGjyvP/6YcbXf76ceL1A1J0377Pg718PNy2D2cPf8+6Rl9ETtNx93wcZkGJN3fxsrHKxnuicKm7xyOfO/8Bu8D5aBs7b11BocW58p/UqK8uaGwPw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "50": { - "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake3_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake3_hashed = std::hash::blake3(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake3_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = blake3_to_field(hash_input_flattened);\n blake3_digest\n}\n", + "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake2s_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake2s_hashed = std::hash::blake2s(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake2s_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake2s_digest = blake2s_to_field(hash_input_flattened);\n blake2s_digest\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_0.snap index 13400bd4b77..2826a9a1112 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_0.snap @@ -52,16 +52,16 @@ expression: artifact "return value indices : [_256]", "BRILLIG CALL func 0: inputs: [Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(3))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(4))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(5))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(6))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(7))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(8))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(9))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(11))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(12))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(13))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(14))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(17))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(20))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(23))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(26))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(29))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(32))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(35))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(38))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(41))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(45))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(46))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(47))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(48))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(49))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(50))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(51))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(52))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(53))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(54))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(55))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(56))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(57))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(58))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(60))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(61))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(62))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(63))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(64))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(65))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(66))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(67))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(68))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(69))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(71))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(72))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(73))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(74))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(75))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(76))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(77))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(78))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(79))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(80))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(82))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(83))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(84))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(85))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(86))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(87))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(88))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(89))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(90))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(91))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(92))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(93))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(94))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(95))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(96))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(97))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(98))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(100))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(101))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(102))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(103))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(104))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(105))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(106))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(107))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(108))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(109))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(110))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(111))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(112))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(113))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(114))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(115))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(116))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(117))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(118))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(119))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(120))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(121))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(122))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(124))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(125))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(126))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(127))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(128))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(129))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(130))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(131))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(132))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(133))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(135))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(136))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(137))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(138))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(139))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(140))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(141))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(142))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(143))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(144))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(148))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(149))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(150))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(151))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(153))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(154))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(155))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(156))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(157))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(158))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(159))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(160))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(161))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(162))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(163))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(167))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(168))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(169))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(170))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(171))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(172))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(173))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(174))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(175))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(177))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(178))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(179))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(180))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(181))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(182))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(184))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(185))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(186))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(187))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(188))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(189))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(190))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(191))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(192))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(193))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(194))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(195))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(196))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(197))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(198))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(199))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(200))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(201))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(202))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(203))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(204))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(205))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(206))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(207))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(208))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(209))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(210))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(211))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(212))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(213))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(214))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(215))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(216))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(217))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(218))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(219))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(220))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(221))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(222))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(223))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(224))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(225))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(226))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(227))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(228))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(229))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(230))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(231))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(232))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(233))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(234))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(235))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(236))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(237))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(238))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(239))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(240))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(241))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(242))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(243))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(244))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(245))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(246))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(247))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(248))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(249))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(250))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(251))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(252))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(253))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(254))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(255))], q_c: 0 }])], outputs: [Simple(Witness(256))]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33093 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 257 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 24 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 35 }, Call { location: 37 }, Mov { destination: Direct(33092), source: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33092 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 1 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 34 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 27 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 256 }, Return, Call { location: 183 }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 8193 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(7), source: Relative(5) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 53 }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Jump { location: 47 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 8192 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(2), source: Relative(4) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(9), location: 141 }, Jump { location: 66 }, Load { destination: Relative(2), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(6), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 32 } }), Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Store { destination_pointer: Relative(6), source: Relative(9) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 30 }, Const { destination: Relative(12), bit_size: Field, value: 256 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 92 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(9) }, JumpIf { condition: Relative(4), location: 108 }, Jump { location: 95 }, Load { destination: Relative(1), source_pointer: Relative(10) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 16 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Cast { destination: Relative(3), source: Relative(5), bit_size: Field }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(3), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(3), op: Add, lhs: Relative(1), rhs: Relative(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, Load { destination: Relative(1), source_pointer: Relative(6) }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(3), rhs: Relative(2) }, Return, Load { destination: Relative(4), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, JumpIf { condition: Relative(15), location: 113 }, Call { location: 189 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(14), source: Relative(15), bit_size: Field }, Load { destination: Relative(15), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(14), op: Add, lhs: Relative(4), rhs: Relative(16) }, Store { destination_pointer: Relative(10), source: Relative(14) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Load { destination: Relative(14), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, JumpIf { condition: Relative(16), location: 128 }, Call { location: 192 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, JumpIf { condition: Relative(16), location: 131 }, Call { location: 189 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(16), bit_size: Field }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(15), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(4), op: Add, lhs: Relative(14), rhs: Relative(16) }, Store { destination_pointer: Relative(6), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 92 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Const { destination: Relative(12), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(10), radix: Direct(32835), output_pointer: Relative(13), num_limbs: Relative(14), output_bits: Relative(12) }), BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Mov { destination: Relative(9), source: Relative(4) }, Jump { location: 155 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 161 }, Jump { location: 158 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, Mov { destination: Relative(2), source: Relative(9) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 165 }, Call { location: 195 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 172 }, Call { location: 189 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 8193 }, Call { location: 198 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, Store { destination_pointer: Relative(17), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Mov { destination: Relative(9), source: Relative(12) }, Jump { location: 155 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 188 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 202 }, Jump { location: 204 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 219 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 216 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 209 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 219 }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33093 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 257 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 24 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 35 }, Call { location: 37 }, Mov { destination: Direct(33092), source: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33092 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 1 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 34 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 27 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 256 }, Return, Call { location: 183 }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 8193 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(7), source: Relative(5) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 53 }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Jump { location: 47 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 8192 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(2), source: Relative(4) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(9), location: 141 }, Jump { location: 66 }, Load { destination: Relative(2), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(6), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 32 } }), Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Store { destination_pointer: Relative(6), source: Relative(9) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 30 }, Const { destination: Relative(12), bit_size: Field, value: 256 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 92 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(9) }, JumpIf { condition: Relative(4), location: 108 }, Jump { location: 95 }, Load { destination: Relative(1), source_pointer: Relative(10) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 16 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Cast { destination: Relative(3), source: Relative(5), bit_size: Field }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(3), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(3), op: Add, lhs: Relative(1), rhs: Relative(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, Load { destination: Relative(1), source_pointer: Relative(6) }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(3), rhs: Relative(2) }, Return, Load { destination: Relative(4), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, JumpIf { condition: Relative(15), location: 113 }, Call { location: 189 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(14), source: Relative(15), bit_size: Field }, Load { destination: Relative(15), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(14), op: Add, lhs: Relative(4), rhs: Relative(16) }, Store { destination_pointer: Relative(10), source: Relative(14) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Load { destination: Relative(14), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, JumpIf { condition: Relative(16), location: 128 }, Call { location: 192 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, JumpIf { condition: Relative(16), location: 131 }, Call { location: 189 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(16), bit_size: Field }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(15), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(4), op: Add, lhs: Relative(14), rhs: Relative(16) }, Store { destination_pointer: Relative(6), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 92 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Const { destination: Relative(12), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(10), radix: Direct(32835), output_pointer: Relative(13), num_limbs: Relative(14), output_bits: Relative(12) }), BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Mov { destination: Relative(9), source: Relative(4) }, Jump { location: 155 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 161 }, Jump { location: 158 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, Mov { destination: Relative(2), source: Relative(9) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 165 }, Call { location: 195 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 172 }, Call { location: 189 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 8193 }, Call { location: 198 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, Store { destination_pointer: Relative(17), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Mov { destination: Relative(9), source: Relative(12) }, Jump { location: 155 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 188 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 202 }, Jump { location: 204 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 219 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 216 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 209 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 219 }, Return]" ], - "debug_symbols": "pZfdbuJADIXfJddcjO358fRVVqiiNK2QIkAprLSqePe14zhtL8KuhhvOF5JzMs54GPLZvfYv1/fnw/Ht9NE9/frsXsbDMBzen4fTfnc5nI7y7WcX9IO4e4JNR3WSGEzABE3IJJokk2xSTCwlWkqylGQpyVKSpSRLSZaS5UsUkTASkbAkwiZ1khJMwARNyCSaSFgRySbFhE0khTcdBxMwQRNJqSLRJE1SdbhBVEcoQ6xaqIyxlll5Vq1VBg0hOGi9UUEjkgI5RAdNzQoaWxTY7gdBA2VUAMEBHNBBA6tCdEgOEoiaA8VBkhEUJBllyIDBQZJRx4zoQA6SjFoFJofsUBzYoc5AwUGTtVJCB3LQZK2dNFlrp2zPGKg48AzagqglaxMakIPk0HRNcsgOxYEd6gzalAbgIMmkT0ObkbT2xFMfQtZLtJqMDuQQHdSkZU3NO0FxYIc6gzaxATig3Uo7edI4a5o1z1pmnYem/ayqDU2326bzJf18GfteV/S3NS4r/7wb++Olezpeh2HT/d4N1+mij/PuOOllN8pZaZf++CoqgW+HoVe6bb7cYd1aOc3mynmxp//2y9rwAAiFWhIwZE/AhC0JpL1rCZRhLSGuJxTiOaCU0OKv7mfiNX9e92P0KcQILf6M7i/Y4q/up9DiJ/2hMj9Sgz+B159iafFXb4Ac0mN+iE1+Wvy1xc/lIX8mn78cQ4sf80P+CO6P2DJ/MfDi58f81HZ/f/4xYpMfHvOn5fnlpvWzzF8ibFp/vPjpMX9su3/59/q/twMALLuQ/MF4NCGt7oRY700CL79iWL8igH9E0J1R5ILLQi6R1yLu7qZYlt10fS+6+yS4Lk+iQtOO/m0MqS0hLbOB/DNhK0e7/WH88TZ006zxsHsZ+vnw7Xrcfzt7+XP2M/42dR5P+/71Ovaa9PVKJR+/QPZzhLqVNys5kn8XFLf6H19PMW2AWQ9huhI3UOP2pgP7Cw==", + "debug_symbols": "pZfdbqNADIXfhWsuxvb89lWqqkpTWkVCSUSTlVZV3n1tjCfpSmRXk5ucj8A5eMDDwHf3PrydP193+4/DV/f0/N29Tbtx3H2+joft5rQ77Pnf787JD+XuCfqOyizeqYAKqpCKVwkqUSWpaIrXlKApQVOCpgRNCZoSNCXyn8jCYcTCYYElq5RZklMBFVQhFa/CYYklqiSVrMIpue+yUwEVVOGUwuJVwixFynWsUiGXWGSgXGNJi+ZFZaxcNDhnIOP1AhIRBMjAG0hqFJDYJJD1fOAkkKsCcAZggAYSWAS8QTDgQJQcSAacjCDAycglAzoDTkapGdGADDgZZRQYDKJBMsgGZQFyBpIsIyU0IANJlrGTJMvYKeo1BkoGeQFpQZQhSxMqkAHn0HxMMIgGySAblAWkKRXAgJNJroY0I8nYQ577EKIcIqOJaEAG3kBMMqy5eWdIBtmgLCBNrAAGqKeSTp7VLxoWjYumRZfSpJ9FpaHpcuk7m9Kvp2kYZEbfzHGe+cfNNOxP3dP+PI5992sznueDvo6b/aynzcR7uV2G/TsrB37sxkHo0l/dbt1aclnMpVzt4b/9PDcsAFxKLQkIVj83bWxJIKw1UFytwa8nJG8lpEQN/uxg8WePa/647sd6fvTQ4o9o/tR0/mJ+ci1+Qhs/ITX4Q22B4FOLv/jFH114zA++yU/VX1r8OT3kj2T3L3rX4pcH+wN+D+b32HL/vMvVnx/zU9v57fr7pvnr6/xv9Id6/WLT/Kn3LxA2zb9c/fSY37edP/17/t9bAQDqCsAvD48mxNU5IAvN+k3I9SmG5bqQQf4RQXeqiAnrRE434/gr4u5qSlBX0/V7cfdK1IcZY2ha0W9qCG0Jod4NzD8TXnhrs91NP76GLpI17TZv47Bsfpz325u9p99H22NfU8fpsB3ez9MgSddPKv55hpJ7hPLCX1a8xW/G5F/kHV92ZeohZ9mE+UjsofiXixT2Bw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "50": { - "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake3_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake3_hashed = std::hash::blake3(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake3_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = blake3_to_field(hash_input_flattened);\n blake3_digest\n}\n", + "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake2s_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake2s_hashed = std::hash::blake2s(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake2s_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake2s_digest = blake2s_to_field(hash_input_flattened);\n blake2s_digest\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 13400bd4b77..2826a9a1112 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -52,16 +52,16 @@ expression: artifact "return value indices : [_256]", "BRILLIG CALL func 0: inputs: [Array([Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(3))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(4))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(5))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(6))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(7))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(8))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(9))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(11))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(12))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(13))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(14))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(17))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(20))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(23))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(26))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(29))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(32))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(35))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(38))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(41))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(45))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(46))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(47))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(48))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(49))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(50))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(51))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(52))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(53))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(54))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(55))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(56))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(57))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(58))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(60))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(61))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(62))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(63))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(64))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(65))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(66))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(67))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(68))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(69))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(71))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(72))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(73))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(74))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(75))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(76))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(77))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(78))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(79))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(80))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(82))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(83))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(84))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(85))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(86))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(87))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(88))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(89))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(90))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(91))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(92))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(93))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(94))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(95))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(96))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(97))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(98))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(100))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(101))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(102))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(103))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(104))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(105))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(106))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(107))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(108))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(109))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(110))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(111))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(112))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(113))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(114))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(115))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(116))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(117))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(118))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(119))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(120))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(121))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(122))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(124))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(125))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(126))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(127))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(128))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(129))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(130))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(131))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(132))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(133))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(135))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(136))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(137))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(138))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(139))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(140))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(141))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(142))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(143))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(144))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(148))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(149))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(150))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(151))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(153))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(154))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(155))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(156))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(157))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(158))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(159))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(160))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(161))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(162))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(163))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(167))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(168))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(169))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(170))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(171))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(172))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(173))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(174))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(175))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(177))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(178))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(179))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(180))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(181))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(182))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(184))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(185))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(186))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(187))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(188))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(189))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(190))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(191))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(192))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(193))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(194))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(195))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(196))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(197))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(198))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(199))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(200))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(201))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(202))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(203))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(204))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(205))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(206))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(207))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(208))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(209))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(210))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(211))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(212))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(213))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(214))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(215))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(216))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(217))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(218))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(219))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(220))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(221))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(222))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(223))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(224))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(225))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(226))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(227))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(228))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(229))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(230))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(231))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(232))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(233))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(234))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(235))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(236))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(237))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(238))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(239))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(240))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(241))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(242))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(243))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(244))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(245))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(246))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(247))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(248))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(249))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(250))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(251))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(252))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(253))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(254))], q_c: 0 }, Expression { mul_terms: [], linear_combinations: [(1, Witness(255))], q_c: 0 }])], outputs: [Simple(Witness(256))]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33093 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 257 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 24 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 35 }, Call { location: 37 }, Mov { destination: Direct(33092), source: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33092 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 1 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 34 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 27 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 256 }, Return, Call { location: 183 }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 8193 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(7), source: Relative(5) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 53 }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Jump { location: 47 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 8192 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(2), source: Relative(4) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(9), location: 141 }, Jump { location: 66 }, Load { destination: Relative(2), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(6), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 32 } }), Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Store { destination_pointer: Relative(6), source: Relative(9) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 30 }, Const { destination: Relative(12), bit_size: Field, value: 256 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 92 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(9) }, JumpIf { condition: Relative(4), location: 108 }, Jump { location: 95 }, Load { destination: Relative(1), source_pointer: Relative(10) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 16 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Cast { destination: Relative(3), source: Relative(5), bit_size: Field }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(3), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(3), op: Add, lhs: Relative(1), rhs: Relative(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, Load { destination: Relative(1), source_pointer: Relative(6) }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(3), rhs: Relative(2) }, Return, Load { destination: Relative(4), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, JumpIf { condition: Relative(15), location: 113 }, Call { location: 189 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(14), source: Relative(15), bit_size: Field }, Load { destination: Relative(15), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(14), op: Add, lhs: Relative(4), rhs: Relative(16) }, Store { destination_pointer: Relative(10), source: Relative(14) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Load { destination: Relative(14), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, JumpIf { condition: Relative(16), location: 128 }, Call { location: 192 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, JumpIf { condition: Relative(16), location: 131 }, Call { location: 189 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(16), bit_size: Field }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(15), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(4), op: Add, lhs: Relative(14), rhs: Relative(16) }, Store { destination_pointer: Relative(6), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 92 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Const { destination: Relative(12), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(10), radix: Direct(32835), output_pointer: Relative(13), num_limbs: Relative(14), output_bits: Relative(12) }), BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Mov { destination: Relative(9), source: Relative(4) }, Jump { location: 155 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 161 }, Jump { location: 158 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, Mov { destination: Relative(2), source: Relative(9) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 165 }, Call { location: 195 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 172 }, Call { location: 189 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 8193 }, Call { location: 198 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, Store { destination_pointer: Relative(17), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Mov { destination: Relative(9), source: Relative(12) }, Jump { location: 155 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 188 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 202 }, Jump { location: 204 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 219 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 216 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 209 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 219 }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 33093 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 256 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 256 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 257 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 24 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 35 }, Call { location: 37 }, Mov { destination: Direct(33092), source: Relative(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 33092 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 1 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 34 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 27 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 256 }, Return, Call { location: 183 }, Const { destination: Relative(3), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 8193 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Mov { destination: Relative(7), source: Relative(5) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 53 }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Jump { location: 47 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 8192 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(2), source: Relative(4) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(9), location: 141 }, Jump { location: 66 }, Load { destination: Relative(2), source_pointer: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 8192 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(Blake2s { message: HeapVector { pointer: Relative(6), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 32 } }), Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(6), bit_size: Field, value: 1 }, Store { destination_pointer: Relative(2), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Field, value: 0 }, Store { destination_pointer: Relative(6), source: Relative(9) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 30 }, Const { destination: Relative(12), bit_size: Field, value: 256 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 92 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(9) }, JumpIf { condition: Relative(4), location: 108 }, Jump { location: 95 }, Load { destination: Relative(1), source_pointer: Relative(10) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 16 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Cast { destination: Relative(3), source: Relative(5), bit_size: Field }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(3), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(3), op: Add, lhs: Relative(1), rhs: Relative(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, Load { destination: Relative(1), source_pointer: Relative(6) }, BinaryFieldOp { destination: Relative(2), op: Mul, lhs: Relative(1), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Add, lhs: Relative(3), rhs: Relative(2) }, Return, Load { destination: Relative(4), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Sub, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, JumpIf { condition: Relative(15), location: 113 }, Call { location: 189 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Cast { destination: Relative(14), source: Relative(15), bit_size: Field }, Load { destination: Relative(15), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(14), op: Add, lhs: Relative(4), rhs: Relative(16) }, Store { destination_pointer: Relative(10), source: Relative(14) }, BinaryFieldOp { destination: Relative(4), op: Mul, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Load { destination: Relative(14), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, JumpIf { condition: Relative(16), location: 128 }, Call { location: 192 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, JumpIf { condition: Relative(16), location: 131 }, Call { location: 189 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Cast { destination: Relative(15), source: Relative(16), bit_size: Field }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(15), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(4), op: Add, lhs: Relative(14), rhs: Relative(16) }, Store { destination_pointer: Relative(6), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 92 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Const { destination: Relative(12), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 32 }, BlackBox(ToRadix { input: Relative(10), radix: Direct(32835), output_pointer: Relative(13), num_limbs: Relative(14), output_bits: Relative(12) }), BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Mov { destination: Relative(9), source: Relative(4) }, Jump { location: 155 }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 161 }, Jump { location: 158 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(8) }, Mov { destination: Relative(2), source: Relative(9) }, Jump { location: 63 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 165 }, Call { location: 195 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 172 }, Call { location: 189 }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 8193 }, Call { location: 198 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, Store { destination_pointer: Relative(17), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Mov { destination: Relative(9), source: Relative(12) }, Jump { location: 155 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 188 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 202 }, Jump { location: 204 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 219 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 216 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 209 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 219 }, Return]" ], - "debug_symbols": "pZfdbuJADIXfJddcjO358fRVVqiiNK2QIkAprLSqePe14zhtL8KuhhvOF5JzMs54GPLZvfYv1/fnw/Ht9NE9/frsXsbDMBzen4fTfnc5nI7y7WcX9IO4e4JNR3WSGEzABE3IJJokk2xSTCwlWkqylGQpyVKSpSRLSZaS5UsUkTASkbAkwiZ1khJMwARNyCSaSFgRySbFhE0khTcdBxMwQRNJqSLRJE1SdbhBVEcoQ6xaqIyxlll5Vq1VBg0hOGi9UUEjkgI5RAdNzQoaWxTY7gdBA2VUAMEBHNBBA6tCdEgOEoiaA8VBkhEUJBllyIDBQZJRx4zoQA6SjFoFJofsUBzYoc5AwUGTtVJCB3LQZK2dNFlrp2zPGKg48AzagqglaxMakIPk0HRNcsgOxYEd6gzalAbgIMmkT0ObkbT2xFMfQtZLtJqMDuQQHdSkZU3NO0FxYIc6gzaxATig3Uo7edI4a5o1z1pmnYem/ayqDU2326bzJf18GfteV/S3NS4r/7wb++Olezpeh2HT/d4N1+mij/PuOOllN8pZaZf++CoqgW+HoVe6bb7cYd1aOc3mynmxp//2y9rwAAiFWhIwZE/AhC0JpL1rCZRhLSGuJxTiOaCU0OKv7mfiNX9e92P0KcQILf6M7i/Y4q/up9DiJ/2hMj9Sgz+B159iafFXb4Ac0mN+iE1+Wvy1xc/lIX8mn78cQ4sf80P+CO6P2DJ/MfDi58f81HZ/f/4xYpMfHvOn5fnlpvWzzF8ibFp/vPjpMX9su3/59/q/twMALLuQ/MF4NCGt7oRY700CL79iWL8igH9E0J1R5ILLQi6R1yLu7qZYlt10fS+6+yS4Lk+iQtOO/m0MqS0hLbOB/DNhK0e7/WH88TZ006zxsHsZ+vnw7Xrcfzt7+XP2M/42dR5P+/71Ovaa9PVKJR+/QPZzhLqVNys5kn8XFLf6H19PMW2AWQ9huhI3UOP2pgP7Cw==", + "debug_symbols": "pZfdbqNADIXfhWsuxvb89lWqqkpTWkVCSUSTlVZV3n1tjCfpSmRXk5ucj8A5eMDDwHf3PrydP193+4/DV/f0/N29Tbtx3H2+joft5rQ77Pnf787JD+XuCfqOyizeqYAKqpCKVwkqUSWpaIrXlKApQVOCpgRNCZoSNCXyn8jCYcTCYYElq5RZklMBFVQhFa/CYYklqiSVrMIpue+yUwEVVOGUwuJVwixFynWsUiGXWGSgXGNJi+ZFZaxcNDhnIOP1AhIRBMjAG0hqFJDYJJD1fOAkkKsCcAZggAYSWAS8QTDgQJQcSAacjCDAycglAzoDTkapGdGADDgZZRQYDKJBMsgGZQFyBpIsIyU0IANJlrGTJMvYKeo1BkoGeQFpQZQhSxMqkAHn0HxMMIgGySAblAWkKRXAgJNJroY0I8nYQ577EKIcIqOJaEAG3kBMMqy5eWdIBtmgLCBNrAAGqKeSTp7VLxoWjYumRZfSpJ9FpaHpcuk7m9Kvp2kYZEbfzHGe+cfNNOxP3dP+PI5992sznueDvo6b/aynzcR7uV2G/TsrB37sxkHo0l/dbt1aclnMpVzt4b/9PDcsAFxKLQkIVj83bWxJIKw1UFytwa8nJG8lpEQN/uxg8WePa/647sd6fvTQ4o9o/tR0/mJ+ci1+Qhs/ITX4Q22B4FOLv/jFH114zA++yU/VX1r8OT3kj2T3L3rX4pcH+wN+D+b32HL/vMvVnx/zU9v57fr7pvnr6/xv9Id6/WLT/Kn3LxA2zb9c/fSY37edP/17/t9bAQDqCsAvD48mxNU5IAvN+k3I9SmG5bqQQf4RQXeqiAnrRE434/gr4u5qSlBX0/V7cfdK1IcZY2ha0W9qCG0Jod4NzD8TXnhrs91NP76GLpI17TZv47Bsfpz325u9p99H22NfU8fpsB3ez9MgSddPKv55hpJ7hPLCX1a8xW/G5F/kHV92ZeohZ9mE+UjsofiXixT2Bw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n __assert_max_bit_size(self, BIT_SIZE);\n }\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = __to_le_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = __to_be_bits(self);\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_le_radix(self, radix)\n }\n\n fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n __to_be_radix(self, radix)\n }\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(apply_range_constraint)]\nfn __assert_max_bit_size(value: Field, bit_size: u32) {}\n\n// `_radix` must be less than 256\n#[builtin(to_le_radix)]\nfn __to_le_radix(value: Field, radix: u32) -> [u8; N] {}\n\n// `_radix` must be less than 256\n#[builtin(to_be_radix)]\nfn __to_be_radix(value: Field, radix: u32) -> [u8; N] {}\n\n/// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n/// This slice will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_le_bits)]\nfn __to_le_bits(value: Field) -> [u1; N] {}\n\n/// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n/// This array will be zero padded should not all bits be necessary to represent `self`.\n///\n/// # Failures\n/// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n/// be able to represent the original `Field`.\n///\n/// # Safety\n/// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n/// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n/// wrap around due to overflow when verifying the decomposition.\n#[builtin(to_be_bits)]\nfn __to_be_bits(value: Field) -> [u1; N] {}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", "path": "std/field/mod.nr" }, "50": { - "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake3_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake3_hashed = std::hash::blake3(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake3_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake3_digest = blake3_to_field(hash_input_flattened);\n blake3_digest\n}\n", + "source": "global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 256;\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\npub fn blake2s_to_field(bytes_to_hash: [u8; N]) -> Field {\n let blake2s_hashed = std::hash::blake2s(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(blake2s_hashed);\n\n hash_in_a_field\n}\n\nfn main(tx_effects_hash_input: [Field; TX_EFFECTS_HASH_INPUT_FIELDS]) -> pub Field {\n let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32];\n for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS {\n let input_as_bytes: [u8; 32] = tx_effects_hash_input[offset].to_be_bytes();\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let blake2s_digest = blake2s_to_field(hash_input_flattened);\n blake2s_digest\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__stdout.snap b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__stdout.snap index 66252e6f0a5..6f4b7de52e5 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__stdout.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__stdout.snap @@ -2,4 +2,4 @@ source: tooling/nargo_cli/tests/execute.rs expression: stdout --- -[ram_blowup_regression] Circuit output: Field(195519420996967279214567556002032723913921938566949722646157209227447699488) +[ram_blowup_regression] Circuit output: Field(387019072746874033871663166450370497041337936686368559213842580820036284132) diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_1144_1169_2399_6609/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_1144_1169_2399_6609/execute__tests__expanded.snap index 72c96604048..dd3e0110f67 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_1144_1169_2399_6609/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_1144_1169_2399_6609/execute__tests__expanded.snap @@ -36,12 +36,12 @@ fn compact_decode(input: [u8; N], length: Field) -> ([U4; 16], Field if (i as u32) < (length as u32) { let x: u8 = input[i]; { - let i_3797: u32 = (2 * i) - 1; - nibble[i_3797] = U4::from_u8(x >> 4); + let i_3800: u32 = (2 * i) - 1; + nibble[i_3800] = U4::from_u8(x >> 4); }; { - let i_3798: u32 = 2 * i; - nibble[i_3798] = U4::from_u8(x & 15); + let i_3801: u32 = 2 * i; + nibble[i_3801] = U4::from_u8(x & 15); } } } @@ -50,12 +50,12 @@ fn compact_decode(input: [u8; N], length: Field) -> ([U4; 16], Field if (i as u32) < ((length as u32) - 1) { let x: u8 = input[i + 1]; { - let i_3801: u32 = 2 * i; - nibble[i_3801] = U4::from_u8(x >> 4); + let i_3804: u32 = 2 * i; + nibble[i_3804] = U4::from_u8(x >> 4); }; { - let i_3802: u32 = (2 * i) + 1; - nibble[i_3802] = U4::from_u8(x & 15); + let i_3805: u32 = (2 * i) + 1; + nibble[i_3805] = U4::from_u8(x & 15); } } } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 2e62faaafbe..19396f7f123 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -679,8 +679,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// Regression test for issue #4449\nfn main(x: u8, result: [u8; 32]) {\n let x = x % 31;\n let mut digest = [0; 32];\n for i in 0..70 {\n let y = x + i;\n let a = [y, x, 32, 0, y + 1, y - 1, y - 2, 5];\n digest = std::hash::blake3(a);\n }\n\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_0.snap index 2e62faaafbe..19396f7f123 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_0.snap @@ -679,8 +679,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// Regression test for issue #4449\nfn main(x: u8, result: [u8; 32]) {\n let x = x % 31;\n let mut digest = [0; 32];\n for i in 0..70 {\n let y = x + i;\n let a = [y, x, 32, 0, y + 1, y - 1, y - 2, 5];\n digest = std::hash::blake3(a);\n }\n\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 2e62faaafbe..19396f7f123 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -679,8 +679,12 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(10), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(11), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(10), offset_address: Direct(11) }, BinaryFieldOp { destination: Direct(2), op: IntegerDiv, lhs: Direct(0), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Mul, lhs: Direct(2), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(1), op: Sub, lhs: Direct(0), rhs: Direct(1) }, Mov { destination: Direct(0), source: Direct(2) }, Stop { return_data: HeapVector { pointer: Direct(11), size: Direct(10) } }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// Regression test for issue #4449\nfn main(x: u8, result: [u8; 32]) {\n let x = x % 31;\n let mut digest = [0; 32];\n for i in 0..70 {\n let y = x + i;\n let a = [y, x, 32, 0, y + 1, y - 1, y - 2, 5];\n digest = std::hash::blake3(a);\n }\n\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 2b982a00ee1..05589c5ece8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -60,12 +60,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32869 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U8) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U8) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U8) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Mov { destination: Relative(1), source: Direct(32836) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 57 }, Mov { destination: Relative(2), source: Relative(3) }, Call { location: 68 }, Call { location: 70 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32869 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 67 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 60 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Return, Call { location: 165 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 31 }, BinaryIntOp { destination: Relative(6), op: Div, bit_size: U8, lhs: Relative(1), rhs: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U8, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U8, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(1), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Mov { destination: Relative(8), source: Relative(6) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 90 }, Store { destination_pointer: Relative(8), source: Relative(1) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Jump { location: 84 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 70 }, Const { destination: Relative(7), bit_size: Integer(U8), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U8), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U8), value: 32 }, Const { destination: Relative(10), bit_size: Integer(U8), value: 5 }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 100 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U8, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 116 }, Jump { location: 103 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(1) }, Mov { destination: Relative(7), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 171 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(6) }, JumpIf { condition: Relative(3), location: 115 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, Return, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U8, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U8, lhs: Relative(5), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 120 }, Call { location: 206 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U8, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U8, lhs: Relative(11), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 124 }, Call { location: 206 }, BinaryIntOp { destination: Relative(13), op: Sub, bit_size: U8, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U8, lhs: Relative(7), rhs: Relative(11) }, JumpIf { condition: Relative(14), location: 128 }, Call { location: 209 }, BinaryIntOp { destination: Relative(14), op: Sub, bit_size: U8, lhs: Relative(11), rhs: Relative(8) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U8, lhs: Relative(8), rhs: Relative(11) }, JumpIf { condition: Relative(15), location: 132 }, Call { location: 209 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(9) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(1) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(13) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(10) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(12), size: Relative(13) }, output: HeapArray { pointer: Relative(14), size: 32 } }), Store { destination_pointer: Relative(6), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U8, lhs: Relative(3), rhs: Relative(7) }, Mov { destination: Relative(3), source: Relative(11) }, Jump { location: 100 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 170 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 165 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 181 }, Call { location: 212 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 188 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, JumpIf { condition: Relative(5), location: 193 }, Jump { location: 191 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U8, lhs: Relative(6), rhs: Relative(9) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(10) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(8) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 188 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZbLrqJAEIbfhbWLruq7r2KMQcUTEoKGo5NMDO8+XVYVOAuTkz4bvx+wPvoKPJtzd3x8Hfrxcv1utrtnc5z6Yei/DsP11N7761jOPhtDPxGaLWyaiAzLcAzfbLEgMCIjMfILyTCAgQzLcAy2JLYktiS2JLZktmS2ZLaAKWctsegcsfg80QuDMAqTMDPBCEGIQisUHxRPIEZhEmYmFk8kghCFVlg8ieiFQRiFxZeJmWmNEIQ09oaC1eA0eA1BQ9SQNGQJzmgADWp2anZqdmp2anZqdmp2avZq9mr2avYyOd4JvTAIozAJMzMYIQiRGWWSokxSlEmitQhAIWiIGpKGLIFWJQfQgBr0z7TYgJZZtnqGxoYWXPYagga6FzUvJw2ZA9IqhUBBhGhQA5lxnjeN7rvDfeo62nZvG7Fsz1s7deO92Y6PYdg0f9rh8frT960dX7y3U7lahrsbz4VFeOmHjtK8WavN59KEUpvSUux/XA2g5WXv1NTboPW25v641KMPNfVxqc9Y034ftf2hqj47rc+5pv0GtP2mqv8maX3V/CH4pT5U9T+9DYBbDT/vgMnLCNhcI4BVgKFGYM3agvTbFnzqAg30x1FEWJYhWvNu2JeD9tRP/73fZ1JNfXscOjm8PMbT29X735te0e+D23Q9defH1JFp/Ugoz7Fd2QMh7un1Wg4g+A1EQ4flqbfDMj0IsJ+pKf8A", + "debug_symbols": "pZbNrqJAEEbfhbWLrv4vX8UYg4o3JAQNVyaZGN59uqwqcBbeGO7G8wHWoemuVh7VuTmOX4e2v1y/q+3uUR2Htuvar0N3PdX39tqXs4/K0EeCagubKlmGY3hGqLa2IDISIzPwiWwYwLAMx/AMtmS2ZLZktmS2IFuQLcgWMOWsIxadJxZfIAZhFCZhFiITjBCEVuiE4oPiicQkzEJk2uJJRBBaoRMWTyYGYRQmYfEhEZnOCEFIc28oOA1eQ9AQNSQNWQNK8EYDaFCzV7NXs1ezV7NXs1ezV3NQc1BzUHMgM1DwGoKGqCFpyBpQQjQagBc5WmaSxUqyWEkWi3oSqDuoKzkkDVkDSqDu5AAarAb9MjUdUJuh0zP0JDQGDBqiBroXDQOzBuRgqVshURChNVYDmd00bSrdf4f70DS0/V42ZNmmt3po+nu17ceu21R/6m58fun7VvdP3uuhXC3T3vTnwiK8tF1Dados1eZ9abZSm/NcHD6uBtDysofW1Luo9W7N/e1cb0NcU5/merRrxh+Sjj+uqkev9Yhrxm9Ax29WPb/JWr9q/Sw1utS/vb//cf1hboC0GAA/n8H8MoV+GcPnU2BwnkOHawSwCGxcI3BmGUH+7QjePQLEH2bRwtzI1plXw74c1Kd2+O9NYSLV0NbHrpHDy9ifXq7e/970ir5p3IbrqTmPQ0Om5XWj/BLuyi6KaU9/1OUAYthAMnRYfjd3tiyPBdhPNJR/", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// Regression test for issue #4449\nfn main(x: u8, result: [u8; 32]) {\n let x = x % 31;\n let mut digest = [0; 32];\n for i in 0..70 {\n let y = x + i;\n let a = [y, x, 32, 0, y + 1, y - 1, y - 2, 5];\n digest = std::hash::blake3(a);\n }\n\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_0.snap index 1507e8be16d..f843ecf9221 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_0.snap @@ -60,12 +60,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32869 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U8) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U8) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U8) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Mov { destination: Relative(1), source: Direct(32836) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 57 }, Mov { destination: Relative(2), source: Relative(3) }, Call { location: 68 }, Call { location: 69 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32869 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 67 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 60 }, Return, Return, Call { location: 190 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 31 }, BinaryIntOp { destination: Relative(6), op: Div, bit_size: U8, lhs: Relative(1), rhs: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U8, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U8, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(1), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Mov { destination: Relative(8), source: Relative(6) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 89 }, Store { destination_pointer: Relative(8), source: Relative(1) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Jump { location: 83 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 70 }, Const { destination: Relative(7), bit_size: Integer(U8), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U8), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U8), value: 32 }, Const { destination: Relative(10), bit_size: Integer(U8), value: 5 }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 99 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U8, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 141 }, Jump { location: 102 }, Load { destination: Relative(3), source_pointer: Relative(6) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Store { destination_pointer: Relative(4), source: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 113 }, Call { location: 196 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 120 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, JumpIf { condition: Relative(6), location: 128 }, Jump { location: 123 }, Load { destination: Relative(1), source_pointer: Relative(4) }, JumpIf { condition: Relative(1), location: 127 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, Load { destination: Relative(6), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(7), rhs: Relative(10) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(6), rhs: Relative(11) }, Store { destination_pointer: Relative(4), source: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(9) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 120 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U8, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U8, lhs: Relative(5), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 145 }, Call { location: 199 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U8, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U8, lhs: Relative(11), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 149 }, Call { location: 199 }, BinaryIntOp { destination: Relative(13), op: Sub, bit_size: U8, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U8, lhs: Relative(7), rhs: Relative(11) }, JumpIf { condition: Relative(14), location: 153 }, Call { location: 202 }, BinaryIntOp { destination: Relative(14), op: Sub, bit_size: U8, lhs: Relative(11), rhs: Relative(8) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U8, lhs: Relative(8), rhs: Relative(11) }, JumpIf { condition: Relative(15), location: 157 }, Call { location: 202 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(9) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(1) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(13) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(10) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(12), size: Relative(13) }, output: HeapArray { pointer: Relative(14), size: 32 } }), Store { destination_pointer: Relative(6), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U8, lhs: Relative(3), rhs: Relative(7) }, Mov { destination: Relative(3), source: Relative(11) }, Jump { location: 99 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 195 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tZbNjqpAEEbfhTWL7up/X8UYg4oTEoKG0ZvcGN/9VlFV4CycTLiZjecDrEPTVAOP6tQe7h/7bjhfPqvN9lEdxq7vu499fzk2t+4y4N5HZegn4a+tq2QZwHAMX20AERiRkRiZUSZkw7AMYDgGWzJbMlsyWzJbMlsKWwpbCu50dWUN2jwRdZHohUEYhahMxCwsTGuEVghCJ/RMkP8B7s9E3B+IQRiF4gf0F6QzQiukOTQUnAavAVUWKEQ+h0vCzPR0G+iiPWhwGrwGktCE+KghacgacGyWBhuMBqsBNJCZJi54DUFD1EBmutiQNRQJ0WiwGkCD0+A1BA1Rg5qjmqOak5qTmpOak5qTmpOak5qTmqlFaTKoR4nUpBOtUBqL+nSiFwZhFKLQP591patnfxvblhbPy3LCRXZtxna4VZvh3vd19afp79OfPq/NMPHWjHgU+6AdTkgUnru+pfSsl2rzvjSD1OY8F4cfV1ur5dj6a+pd1Hq35vww10OIa+rTXF/gXX34vXpbstcJKMUvhh8PwJiiIzCurBHYRQBxjcCZZQT5f0fw7hKs/WYWgdYmzyI488bwXRuGuT7CmjYuL3dxTRsaO8/AqjY2WetXLUOgh7fUfz3/DreaYzd+ecs/yTR2zaFvZfN8H44vR29/r3pEvxKu4+XYnu5jS6blUwEfk1uc/Jh29HbFDVtMbUugTXykbrEjajB+96Sh/AM=", + "debug_symbols": "tZbLrqJAEIbfhTWLruq7r2KMQcUTEoKGo5NMDO8+VVYXOAvNCZPZ+P1c6qNpqpFHdWoP9699N5wv39Vm+6gOY9f33de+vxybW3cZaO+jMvwT6RfqKoIABVbgqg0SvCAIoiAJ8hPJCECAAisQSxJLEksSSxJLEksWSxZLpp22rsCQzTFJF5iu0BeGQlJGZirMQjCFUIiFttAJsZyHtD8xab9n+sJQWPxI/ky0phAKeQ4NB6vBaSAVIIcg17CxMAkdPwa+aYcarAangSU8IS5oiBqSBhob8GC90QAaUAObeeK80+A1BA1s5pv1SUMuIRgNoAE1WA1Og9cQNKg5qDmoOao5qjmqOao5qjmqOao5qplbFHhWuUmfgdtUAmhADVaD0+A1BGlA7lk3TXWlq2h/G9uWF9HLsqLFdm3GdrhVm+He93X1q+nvz5O+r83w5K0Z6Sj1QzuciCQ8d33LaaqXavO+NGGpTWku9j+uBtByWgJr6m3Qervm+jjXow9r6uNcn/Fdvf9/9ZCT0wnI2S2GHw/AmKwjMDavEcAiwLBGYM0ygvSvI3h3CwAfZhF5jcosojVvDJ/a0M/1Ade0cX55imva0MA8A6va2CStX7UMkV/ipf7t9d3HZQzzOo6LAfI07WirOXbjX98LE7vGrjn0bdk834fjy9Hb76se0e+N63g5tqf72LJp+eigd+2WHl+IO/6fpg3IpobseZPezFvqqRqN2008lD8=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// Regression test for issue #4449\nfn main(x: u8, result: [u8; 32]) {\n let x = x % 31;\n let mut digest = [0; 32];\n for i in 0..70 {\n let y = x + i;\n let a = [y, x, 32, 0, y + 1, y - 1, y - 2, 5];\n digest = std::hash::blake3(a);\n }\n\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 1507e8be16d..f843ecf9221 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -60,12 +60,16 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32869 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 33 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U8) }, Cast { destination: Direct(32837), source: Direct(32837), bit_size: Integer(U8) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U8) }, Cast { destination: Direct(32839), source: Direct(32839), bit_size: Integer(U8) }, Cast { destination: Direct(32840), source: Direct(32840), bit_size: Integer(U8) }, Cast { destination: Direct(32841), source: Direct(32841), bit_size: Integer(U8) }, Cast { destination: Direct(32842), source: Direct(32842), bit_size: Integer(U8) }, Cast { destination: Direct(32843), source: Direct(32843), bit_size: Integer(U8) }, Cast { destination: Direct(32844), source: Direct(32844), bit_size: Integer(U8) }, Cast { destination: Direct(32845), source: Direct(32845), bit_size: Integer(U8) }, Cast { destination: Direct(32846), source: Direct(32846), bit_size: Integer(U8) }, Cast { destination: Direct(32847), source: Direct(32847), bit_size: Integer(U8) }, Cast { destination: Direct(32848), source: Direct(32848), bit_size: Integer(U8) }, Cast { destination: Direct(32849), source: Direct(32849), bit_size: Integer(U8) }, Cast { destination: Direct(32850), source: Direct(32850), bit_size: Integer(U8) }, Cast { destination: Direct(32851), source: Direct(32851), bit_size: Integer(U8) }, Cast { destination: Direct(32852), source: Direct(32852), bit_size: Integer(U8) }, Cast { destination: Direct(32853), source: Direct(32853), bit_size: Integer(U8) }, Cast { destination: Direct(32854), source: Direct(32854), bit_size: Integer(U8) }, Cast { destination: Direct(32855), source: Direct(32855), bit_size: Integer(U8) }, Cast { destination: Direct(32856), source: Direct(32856), bit_size: Integer(U8) }, Cast { destination: Direct(32857), source: Direct(32857), bit_size: Integer(U8) }, Cast { destination: Direct(32858), source: Direct(32858), bit_size: Integer(U8) }, Cast { destination: Direct(32859), source: Direct(32859), bit_size: Integer(U8) }, Cast { destination: Direct(32860), source: Direct(32860), bit_size: Integer(U8) }, Cast { destination: Direct(32861), source: Direct(32861), bit_size: Integer(U8) }, Cast { destination: Direct(32862), source: Direct(32862), bit_size: Integer(U8) }, Cast { destination: Direct(32863), source: Direct(32863), bit_size: Integer(U8) }, Cast { destination: Direct(32864), source: Direct(32864), bit_size: Integer(U8) }, Cast { destination: Direct(32865), source: Direct(32865), bit_size: Integer(U8) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U8) }, Cast { destination: Direct(32867), source: Direct(32867), bit_size: Integer(U8) }, Cast { destination: Direct(32868), source: Direct(32868), bit_size: Integer(U8) }, Mov { destination: Relative(1), source: Direct(32836) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(5) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 57 }, Mov { destination: Relative(2), source: Relative(3) }, Call { location: 68 }, Call { location: 69 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32869 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 67 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 60 }, Return, Return, Call { location: 190 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 31 }, BinaryIntOp { destination: Relative(6), op: Div, bit_size: U8, lhs: Relative(1), rhs: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U8, lhs: Relative(6), rhs: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U8, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(1), bit_size: Integer(U8), value: 0 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 32 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Mov { destination: Relative(8), source: Relative(6) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 89 }, Store { destination_pointer: Relative(8), source: Relative(1) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Jump { location: 83 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 70 }, Const { destination: Relative(7), bit_size: Integer(U8), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U8), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U8), value: 32 }, Const { destination: Relative(10), bit_size: Integer(U8), value: 5 }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 99 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U8, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(11), location: 141 }, Jump { location: 102 }, Load { destination: Relative(3), source_pointer: Relative(6) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Const { destination: Relative(5), bit_size: Integer(U1), value: 1 }, Store { destination_pointer: Relative(4), source: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 113 }, Call { location: 196 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 32 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 120 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, JumpIf { condition: Relative(6), location: 128 }, Jump { location: 123 }, Load { destination: Relative(1), source_pointer: Relative(4) }, JumpIf { condition: Relative(1), location: 127 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, Load { destination: Relative(6), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U8, lhs: Relative(7), rhs: Relative(10) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(6), rhs: Relative(11) }, Store { destination_pointer: Relative(4), source: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(9) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 120 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U8, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U8, lhs: Relative(5), rhs: Relative(11) }, JumpIf { condition: Relative(12), location: 145 }, Call { location: 199 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U8, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U8, lhs: Relative(11), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 149 }, Call { location: 199 }, BinaryIntOp { destination: Relative(13), op: Sub, bit_size: U8, lhs: Relative(11), rhs: Relative(7) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U8, lhs: Relative(7), rhs: Relative(11) }, JumpIf { condition: Relative(14), location: 153 }, Call { location: 202 }, BinaryIntOp { destination: Relative(14), op: Sub, bit_size: U8, lhs: Relative(11), rhs: Relative(8) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U8, lhs: Relative(8), rhs: Relative(11) }, JumpIf { condition: Relative(15), location: 157 }, Call { location: 202 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(11) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(9) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(1) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(13) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(10) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 33 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BlackBox(Blake3 { message: HeapVector { pointer: Relative(12), size: Relative(13) }, output: HeapArray { pointer: Relative(14), size: 32 } }), Store { destination_pointer: Relative(6), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U8, lhs: Relative(3), rhs: Relative(7) }, Mov { destination: Relative(3), source: Relative(11) }, Jump { location: 99 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 195 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tZbNjqpAEEbfhTWL7up/X8UYg4oTEoKG0ZvcGN/9VlFV4CycTLiZjecDrEPTVAOP6tQe7h/7bjhfPqvN9lEdxq7vu499fzk2t+4y4N5HZegn4a+tq2QZwHAMX20AERiRkRiZUSZkw7AMYDgGWzJbMlsyWzJbMlsKWwpbCu50dWUN2jwRdZHohUEYhahMxCwsTGuEVghCJ/RMkP8B7s9E3B+IQRiF4gf0F6QzQiukOTQUnAavAVUWKEQ+h0vCzPR0G+iiPWhwGrwGktCE+KghacgacGyWBhuMBqsBNJCZJi54DUFD1EBmutiQNRQJ0WiwGkCD0+A1BA1Rg5qjmqOak5qTmpOak5qTmpOak5qTmqlFaTKoR4nUpBOtUBqL+nSiFwZhFKLQP591patnfxvblhbPy3LCRXZtxna4VZvh3vd19afp79OfPq/NMPHWjHgU+6AdTkgUnru+pfSsl2rzvjSD1OY8F4cfV1ur5dj6a+pd1Hq35vww10OIa+rTXF/gXX34vXpbstcJKMUvhh8PwJiiIzCurBHYRQBxjcCZZQT5f0fw7hKs/WYWgdYmzyI488bwXRuGuT7CmjYuL3dxTRsaO8/AqjY2WetXLUOgh7fUfz3/DreaYzd+ecs/yTR2zaFvZfN8H44vR29/r3pEvxKu4+XYnu5jS6blUwEfk1uc/Jh29HbFDVtMbUugTXykbrEjajB+96Sh/AM=", + "debug_symbols": "tZbLrqJAEIbfhTWLruq7r2KMQcUTEoKGo5NMDO8+VVYXOAvNCZPZ+P1c6qNpqpFHdWoP9699N5wv39Vm+6gOY9f33de+vxybW3cZaO+jMvwT6RfqKoIABVbgqg0SvCAIoiAJ8hPJCECAAisQSxJLEksSSxJLEksWSxZLpp22rsCQzTFJF5iu0BeGQlJGZirMQjCFUIiFttAJsZyHtD8xab9n+sJQWPxI/ky0phAKeQ4NB6vBaSAVIIcg17CxMAkdPwa+aYcarAangSU8IS5oiBqSBhob8GC90QAaUAObeeK80+A1BA1s5pv1SUMuIRgNoAE1WA1Og9cQNKg5qDmoOao5qjmqOao5qjmqOao5qplbFHhWuUmfgdtUAmhADVaD0+A1BGlA7lk3TXWlq2h/G9uWF9HLsqLFdm3GdrhVm+He93X1q+nvz5O+r83w5K0Z6Sj1QzuciCQ8d33LaaqXavO+NGGpTWku9j+uBtByWgJr6m3Qervm+jjXow9r6uNcn/Fdvf9/9ZCT0wnI2S2GHw/AmKwjMDavEcAiwLBGYM0ygvSvI3h3CwAfZhF5jcosojVvDJ/a0M/1Ade0cX55imva0MA8A6va2CStX7UMkV/ipf7t9d3HZQzzOo6LAfI07WirOXbjX98LE7vGrjn0bdk834fjy9Hb76se0e+N63g5tqf72LJp+eigd+2WHl+IO/6fpg3IpobseZPezFvqqRqN2008lD8=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { $crate::cmp::Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::cmp::Ord };\n let signature = quote { fn cmp(_self: Self, _other: Self) -> $crate::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == $crate::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = $crate::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", "path": "std/cmp.nr" }, + "19": { + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "path": "std/hash/mod.nr" + }, "50": { "source": "// Regression test for issue #4449\nfn main(x: u8, result: [u8; 32]) {\n let x = x % 31;\n let mut digest = [0; 32];\n for i in 0..70 {\n let y = x + i;\n let a = [y, x, 32, 0, y + 1, y - 1, y - 2, 5];\n digest = std::hash::blake3(a);\n }\n\n assert(digest == result);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__expanded.snap index b8d47deec0a..26f61c7ab7f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__expanded.snap @@ -16,8 +16,8 @@ impl BoundedVec4 { pub fn push(&mut self, elem: Field) { { - let i_3791: u32 = self.len; - self.storage[i_3791] = elem; + let i_3794: u32 = self.len; + self.storage[i_3794] = elem; }; self.len = self.len + 1; } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__expanded.snap index 68f9c1675c5..26e19a040ba 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__expanded.snap @@ -16,8 +16,8 @@ impl BoundedVec4 { pub fn push(&mut self, elem: Field) { { - let i_3791: u32 = self.len; - self.storage[i_3791] = elem; + let i_3794: u32 = self.len; + self.storage[i_3794] = elem; }; self.len = self.len + 1; } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__expanded.snap index 64972f600fb..e6ddf096fed 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__expanded.snap @@ -8,8 +8,8 @@ fn main(expected: pub Field, first: Field, input: [Field; 20]) { assert(hasher_slice[0] == expected); if (expected as u32) > 10 { { - let i_3773: Field = expected - 10; - hasher_slice[i_3773] = 100; + let i_3776: Field = expected - 10; + hasher_slice[i_3776] = 100; } } else { hasher_slice[expected] = 100; diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index d15be9b3d10..fa25b07ef5f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -129,7 +129,7 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(5), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(6), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(7), bit_size: Integer(U32), value: 3 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(7), offset_address: Direct(5) }, Cast { destination: Direct(1), source: Direct(1), bit_size: Integer(U32) }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(7), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(3), op: IntegerDiv, lhs: Direct(0), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Mul, lhs: Direct(3), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Sub, lhs: Direct(0), rhs: Direct(4) }, Store { destination_pointer: Direct(9), source: Direct(4) }, BinaryIntOp { destination: Direct(9), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(6) }, Mov { destination: Direct(0), source: Direct(3) }, BinaryIntOp { destination: Direct(8), op: LessThan, bit_size: U32, lhs: Direct(9), rhs: Direct(7) }, JumpIf { condition: Direct(8), location: 7 }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, Stop { return_data: HeapVector { pointer: Direct(9), size: Direct(1) } }]" ], - "debug_symbols": "pZjbbtswDIbfRde+EEXqlFcZisJN3cKA4QRuUmAo8u6jaslLtknQrJswtMwvEsWfsfUlXoeX6/vzOL+dPsThx5d4WcZpGt+fp9Oxv4ynma9+CRk+wIiD6gTY1ThxQDZeHKgTiu+g260TKez5sgxDiLrjMP3cL8N8EYf5Ok2d+Oyn6/dNH+d+/raXfuFR2YlhfmXLwLdxGsK3W/c7WuZDnVQx2CmzhYN9iId8vCGK8UbjnngHKd65XfFp8VZmf7+wftp+X5Pd4vVj/nQ+XkswCSDvCGBqCeS92wja5wi2QNA+bQIZks0EzBEKeTSQ6sgYyuURCgAAwkgAcHeJ9I+IQi2AxlQMoHUeofIINJTqAY2jXQhr0kLQSdiH0LYZQb4GUUwnuC2daueOuKQOeOgPfyBcYSHSbLmA+xb1H7Mw2m+z8DqHULJZYvWIPRqzKmnMepnTmMJmjSlq1pjSzRorIuo0VkZUaayMqNJYOZ1VGisjqjSG0Kyx4izqNIbYrLF6xB6NOZMAXqmcxtA0awxts8bQNWusiKjTWBlRpbEyokpj5XRWaayIqKtuoubqrkfsqW6QcusVrPlcfVMpFYo2hDJZiZArIuhfCHD1s0BMlQWo5a6FUOjtK4JwXy7uhWp99vWh8JwGTm0Ip12usnSh6SnUaUcUuuwfgKbmdlFE1LWLMqKqXZQRVe2imE7acqFI70MYTE9qypDeh7ApncoqbEdk/9UL7cJ7zHWLJ/b647j8de7BuocgSj7jCJ2pE7h6tHqaJ8PpDUcj7IWjEd4vt3p+9UCuLkD0GYS858AkDD6jKJyo6Oib6NvQIteTllAF30ctPp61BAvRqmiZp/l+xTzN01Y6WhOtjeMu+j685vKC5HodYb2OKlqMluJ45KGJcZGHkYd+tSSjhXWcIo9wjSPmmVABn/0y9i/TEFIdNuM6H1Pm2b38PKeRdCZ1Xk7H4fW6DGGX7g6m+PMHP8wp/3QLO/kL", + "debug_symbols": "pZjdbusgDMffhetc4A8I9FWmacq6bIoUpVXWTjqa+u7HLJC1OgeEkpu6TuJfwfhvGr7VW/96/XgZpvfTpzo8favXeRjH4eNlPB27y3Ca5Oq30uEDrDpgo6BdjFMHEuPVgRuF8gTfbo1KYS+Xue9D1B1H6Odu7qeLOkzXcWzUVzdefx76PHfTj710s9zVjeqnN7ECfB/GPny7Nb/ROh/qNMZgh3YNh/YhHvLxljnGW0Nb4h2keOc2xafJtzr7+4X58/r7hts13jzmz+TjjQabAPqOALaWwN67lWB8jtAWCManRWDLejeBcoRCHi2kOrKWc3mEAgAspJUAa8zvEPwjolAL8JtJ1JhHYCERoH1KBBjchEBKE2G0fhsCzW4EtDWIYjpdKm3J7KYVQW1SXSEgZBEujyBDKRckVbppFIDtOgpLOQTq3RKrR2zRWItJY63XOY0h7dYY8m6NodmtsSKiTmNlRJXGyogqjZXTWaWxEqJSYwS7NVYcRZ3GiHZrrB6xRWPOJoBHzGmM7G6NUbtbY+R2a6yIqNNYGVGlsTKiSmPldFZprISorG7m3dVdj9hS3aD1mgpts/93uZRN5BWBNisRdkUE/w8Brn4URGlBgIzeNBFeixOYtuXCUHr7ANP67OtD4X8aolu1TvdvYI+VZQpNDx2uG4Az2Q3A8O52UUTUtYsyoqpdlBFV7aKYTr/mAj1sQpDoLO2nALQNwbAiPOxHZHf1QrvwnnLd4lm87jjM/5x7SDVDEKWccYTO1ChaPF48Ezpoo8LRiHjhaESS7RbPLx7oxQWIvoBI1hyERMHnsLhiTfRt9NvQIpeTFvbxqMXHs5ZgIVqMVnhGnkfhGRk2mmhttG2876Lvw2uuTEgv1wmW64TRUrQc70ce2RgXeRR55BfLOlpY7nPkMS1xLLyfPeerm4fudexDqsNiXKdjyry4lz/ndCedSZ3n07F/u859WKW7gyn5fJKegf75FlbyLw==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -144,7 +144,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_0.snap index d15be9b3d10..fa25b07ef5f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_0.snap @@ -129,7 +129,7 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(5), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(6), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(7), bit_size: Integer(U32), value: 3 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(7), offset_address: Direct(5) }, Cast { destination: Direct(1), source: Direct(1), bit_size: Integer(U32) }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(7), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(3), op: IntegerDiv, lhs: Direct(0), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Mul, lhs: Direct(3), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Sub, lhs: Direct(0), rhs: Direct(4) }, Store { destination_pointer: Direct(9), source: Direct(4) }, BinaryIntOp { destination: Direct(9), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(6) }, Mov { destination: Direct(0), source: Direct(3) }, BinaryIntOp { destination: Direct(8), op: LessThan, bit_size: U32, lhs: Direct(9), rhs: Direct(7) }, JumpIf { condition: Direct(8), location: 7 }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, Stop { return_data: HeapVector { pointer: Direct(9), size: Direct(1) } }]" ], - "debug_symbols": "pZjbbtswDIbfRde+EEXqlFcZisJN3cKA4QRuUmAo8u6jaslLtknQrJswtMwvEsWfsfUlXoeX6/vzOL+dPsThx5d4WcZpGt+fp9Oxv4ynma9+CRk+wIiD6gTY1ThxQDZeHKgTiu+g260TKez5sgxDiLrjMP3cL8N8EYf5Ok2d+Oyn6/dNH+d+/raXfuFR2YlhfmXLwLdxGsK3W/c7WuZDnVQx2CmzhYN9iId8vCGK8UbjnngHKd65XfFp8VZmf7+wftp+X5Pd4vVj/nQ+XkswCSDvCGBqCeS92wja5wi2QNA+bQIZks0EzBEKeTSQ6sgYyuURCgAAwkgAcHeJ9I+IQi2AxlQMoHUeofIINJTqAY2jXQhr0kLQSdiH0LYZQb4GUUwnuC2daueOuKQOeOgPfyBcYSHSbLmA+xb1H7Mw2m+z8DqHULJZYvWIPRqzKmnMepnTmMJmjSlq1pjSzRorIuo0VkZUaayMqNJYOZ1VGisjqjSG0Kyx4izqNIbYrLF6xB6NOZMAXqmcxtA0awxts8bQNWusiKjTWBlRpbEyokpj5XRWaayIqKtuoubqrkfsqW6QcusVrPlcfVMpFYo2hDJZiZArIuhfCHD1s0BMlQWo5a6FUOjtK4JwXy7uhWp99vWh8JwGTm0Ip12usnSh6SnUaUcUuuwfgKbmdlFE1LWLMqKqXZQRVe2imE7acqFI70MYTE9qypDeh7ApncoqbEdk/9UL7cJ7zHWLJ/b647j8de7BuocgSj7jCJ2pE7h6tHqaJ8PpDUcj7IWjEd4vt3p+9UCuLkD0GYS858AkDD6jKJyo6Oib6NvQIteTllAF30ctPp61BAvRqmiZp/l+xTzN01Y6WhOtjeMu+j685vKC5HodYb2OKlqMluJ45KGJcZGHkYd+tSSjhXWcIo9wjSPmmVABn/0y9i/TEFIdNuM6H1Pm2b38PKeRdCZ1Xk7H4fW6DGGX7g6m+PMHP8wp/3QLO/kL", + "debug_symbols": "pZjdbusgDMffhetc4A8I9FWmacq6bIoUpVXWTjqa+u7HLJC1OgeEkpu6TuJfwfhvGr7VW/96/XgZpvfTpzo8favXeRjH4eNlPB27y3Ca5Oq30uEDrDpgo6BdjFMHEuPVgRuF8gTfbo1KYS+Xue9D1B1H6Odu7qeLOkzXcWzUVzdefx76PHfTj710s9zVjeqnN7ECfB/GPny7Nb/ROh/qNMZgh3YNh/YhHvLxljnGW0Nb4h2keOc2xafJtzr7+4X58/r7hts13jzmz+TjjQabAPqOALaWwN67lWB8jtAWCManRWDLejeBcoRCHi2kOrKWc3mEAgAspJUAa8zvEPwjolAL8JtJ1JhHYCERoH1KBBjchEBKE2G0fhsCzW4EtDWIYjpdKm3J7KYVQW1SXSEgZBEujyBDKRckVbppFIDtOgpLOQTq3RKrR2zRWItJY63XOY0h7dYY8m6NodmtsSKiTmNlRJXGyogqjZXTWaWxEqJSYwS7NVYcRZ3GiHZrrB6xRWPOJoBHzGmM7G6NUbtbY+R2a6yIqNNYGVGlsTKiSmPldFZprISorG7m3dVdj9hS3aD1mgpts/93uZRN5BWBNisRdkUE/w8Brn4URGlBgIzeNBFeixOYtuXCUHr7ANP67OtD4X8aolu1TvdvYI+VZQpNDx2uG4Az2Q3A8O52UUTUtYsyoqpdlBFV7aKYTr/mAj1sQpDoLO2nALQNwbAiPOxHZHf1QrvwnnLd4lm87jjM/5x7SDVDEKWccYTO1ChaPF48Ezpoo8LRiHjhaESS7RbPLx7oxQWIvoBI1hyERMHnsLhiTfRt9NvQIpeTFvbxqMXHs5ZgIVqMVnhGnkfhGRk2mmhttG2876Lvw2uuTEgv1wmW64TRUrQc70ce2RgXeRR55BfLOlpY7nPkMS1xLLyfPeerm4fudexDqsNiXKdjyry4lz/ndCedSZ3n07F/u859WKW7gyn5fJKegf75FlbyLw==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -144,7 +144,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index d15be9b3d10..fa25b07ef5f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -129,7 +129,7 @@ expression: artifact "unconstrained func 1", "[Const { destination: Direct(5), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(6), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(7), bit_size: Integer(U32), value: 3 }, CalldataCopy { destination_address: Direct(0), size_address: Direct(7), offset_address: Direct(5) }, Cast { destination: Direct(1), source: Direct(1), bit_size: Integer(U32) }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(7), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(1) }, BinaryFieldOp { destination: Direct(3), op: IntegerDiv, lhs: Direct(0), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Mul, lhs: Direct(3), rhs: Direct(2) }, BinaryFieldOp { destination: Direct(4), op: Sub, lhs: Direct(0), rhs: Direct(4) }, Store { destination_pointer: Direct(9), source: Direct(4) }, BinaryIntOp { destination: Direct(9), op: Add, bit_size: U32, lhs: Direct(9), rhs: Direct(6) }, Mov { destination: Direct(0), source: Direct(3) }, BinaryIntOp { destination: Direct(8), op: LessThan, bit_size: U32, lhs: Direct(9), rhs: Direct(7) }, JumpIf { condition: Direct(8), location: 7 }, Const { destination: Direct(9), bit_size: Integer(U32), value: 10 }, Stop { return_data: HeapVector { pointer: Direct(9), size: Direct(1) } }]" ], - "debug_symbols": "pZjbbtswDIbfRde+EEXqlFcZisJN3cKA4QRuUmAo8u6jaslLtknQrJswtMwvEsWfsfUlXoeX6/vzOL+dPsThx5d4WcZpGt+fp9Oxv4ynma9+CRk+wIiD6gTY1ThxQDZeHKgTiu+g260TKez5sgxDiLrjMP3cL8N8EYf5Ok2d+Oyn6/dNH+d+/raXfuFR2YlhfmXLwLdxGsK3W/c7WuZDnVQx2CmzhYN9iId8vCGK8UbjnngHKd65XfFp8VZmf7+wftp+X5Pd4vVj/nQ+XkswCSDvCGBqCeS92wja5wi2QNA+bQIZks0EzBEKeTSQ6sgYyuURCgAAwkgAcHeJ9I+IQi2AxlQMoHUeofIINJTqAY2jXQhr0kLQSdiH0LYZQb4GUUwnuC2daueOuKQOeOgPfyBcYSHSbLmA+xb1H7Mw2m+z8DqHULJZYvWIPRqzKmnMepnTmMJmjSlq1pjSzRorIuo0VkZUaayMqNJYOZ1VGisjqjSG0Kyx4izqNIbYrLF6xB6NOZMAXqmcxtA0awxts8bQNWusiKjTWBlRpbEyokpj5XRWaayIqKtuoubqrkfsqW6QcusVrPlcfVMpFYo2hDJZiZArIuhfCHD1s0BMlQWo5a6FUOjtK4JwXy7uhWp99vWh8JwGTm0Ip12usnSh6SnUaUcUuuwfgKbmdlFE1LWLMqKqXZQRVe2imE7acqFI70MYTE9qypDeh7ApncoqbEdk/9UL7cJ7zHWLJ/b647j8de7BuocgSj7jCJ2pE7h6tHqaJ8PpDUcj7IWjEd4vt3p+9UCuLkD0GYS858AkDD6jKJyo6Oib6NvQIteTllAF30ctPp61BAvRqmiZp/l+xTzN01Y6WhOtjeMu+j685vKC5HodYb2OKlqMluJ45KGJcZGHkYd+tSSjhXWcIo9wjSPmmVABn/0y9i/TEFIdNuM6H1Pm2b38PKeRdCZ1Xk7H4fW6DGGX7g6m+PMHP8wp/3QLO/kL", + "debug_symbols": "pZjdbusgDMffhetc4A8I9FWmacq6bIoUpVXWTjqa+u7HLJC1OgeEkpu6TuJfwfhvGr7VW/96/XgZpvfTpzo8favXeRjH4eNlPB27y3Ca5Oq30uEDrDpgo6BdjFMHEuPVgRuF8gTfbo1KYS+Xue9D1B1H6Odu7qeLOkzXcWzUVzdefx76PHfTj710s9zVjeqnN7ECfB/GPny7Nb/ROh/qNMZgh3YNh/YhHvLxljnGW0Nb4h2keOc2xafJtzr7+4X58/r7hts13jzmz+TjjQabAPqOALaWwN67lWB8jtAWCManRWDLejeBcoRCHi2kOrKWc3mEAgAspJUAa8zvEPwjolAL8JtJ1JhHYCERoH1KBBjchEBKE2G0fhsCzW4EtDWIYjpdKm3J7KYVQW1SXSEgZBEujyBDKRckVbppFIDtOgpLOQTq3RKrR2zRWItJY63XOY0h7dYY8m6NodmtsSKiTmNlRJXGyogqjZXTWaWxEqJSYwS7NVYcRZ3GiHZrrB6xRWPOJoBHzGmM7G6NUbtbY+R2a6yIqNNYGVGlsTKiSmPldFZprISorG7m3dVdj9hS3aD1mgpts/93uZRN5BWBNisRdkUE/w8Brn4URGlBgIzeNBFeixOYtuXCUHr7ANP67OtD4X8aolu1TvdvYI+VZQpNDx2uG4Az2Q3A8O52UUTUtYsyoqpdlBFV7aKYTr/mAj1sQpDoLO2nALQNwbAiPOxHZHf1QrvwnnLd4lm87jjM/5x7SDVDEKWccYTO1ChaPF48Ezpoo8LRiHjhaESS7RbPLx7oxQWIvoBI1hyERMHnsLhiTfRt9NvQIpeTFvbxqMXHs5ZgIVqMVnhGnkfhGRk2mmhttG2876Lvw2uuTEgv1wmW64TRUrQc70ce2RgXeRR55BfLOlpY7nPkMS1xLLyfPeerm4fudexDqsNiXKdjyry4lz/ndCedSZ3n07F/u859WKW7gyn5fJKegf75FlbyLw==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -144,7 +144,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index fefe6945775..bb92adcc14f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -85,7 +85,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32857 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32847), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32847) }, Mov { destination: Relative(2), source: Direct(32848) }, Mov { destination: Relative(3), source: Direct(32849) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32850 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(8) }, Call { location: 35 }, Mov { destination: Relative(4), source: Relative(7) }, Mov { destination: Relative(5), source: Direct(32853) }, Mov { destination: Relative(6), source: Direct(32854) }, Call { location: 46 }, Call { location: 59 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32855 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 35 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32855 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 45 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 38 }, Return, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Const { destination: Direct(32836), bit_size: Integer(U1), value: 0 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32838), bit_size: Field, value: 0 }, Const { destination: Direct(32839), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32840), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32841), bit_size: Integer(U32), value: 3 }, Const { destination: Direct(32842), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Direct(32843), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Direct(32844), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Const { destination: Direct(32845), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Direct(32846), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Return, Call { location: 407 }, Const { destination: Relative(8), bit_size: Field, value: 1 }, Const { destination: Relative(9), bit_size: Field, value: 17631683881184975370165255887551781615748388533673675138860 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32836) }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Relative(1) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32838) }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(11), size: Relative(12) }, scalars: HeapVector { pointer: Relative(13), size: Relative(14) }, outputs: HeapArray { pointer: Relative(15), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32839) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32840) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(10) }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, Store { destination_pointer: Relative(11), source: Direct(32838) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32838) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32838) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32838) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(8) }, Mov { destination: Relative(7), source: Direct(32837) }, Jump { location: 123 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32840) }, JumpIf { condition: Relative(8), location: 373 }, Jump { location: 126 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(9) }, Store { destination_pointer: Relative(11), source: Direct(32843) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32845) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32836) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32846) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32836) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(11), size: Relative(12) }, scalars: HeapVector { pointer: Relative(13), size: Relative(14) }, outputs: HeapArray { pointer: Relative(15), size: 3 } }), BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32839) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(1) }, Mov { destination: Relative(7), source: Direct(32837) }, Jump { location: 189 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 339 }, Jump { location: 192 }, Const { destination: Relative(7), bit_size: Field, value: -9101662836674550326256996212378706138142399878494295154626728833686305224889 }, Const { destination: Relative(10), bit_size: Field, value: 1658946642478826263901298755938807527017017780224674388532518006781615929512 }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Direct(32843) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32845) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32836) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32846) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32836) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32836) }, Load { destination: Relative(7), source_pointer: Relative(11) }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(11), size: Relative(13) }, scalars: HeapVector { pointer: Relative(14), size: Relative(15) }, outputs: HeapArray { pointer: Relative(16), size: 3 } }), BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32839) }, Load { destination: Relative(7), source_pointer: Relative(11) }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(5) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(6) }, Store { destination_pointer: Relative(11), source: Direct(32838) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32838) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32838) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32838) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Mov { destination: Relative(1), source: Direct(32837) }, Jump { location: 257 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, JumpIf { condition: Relative(5), location: 305 }, Jump { location: 260 }, Load { destination: Relative(1), source_pointer: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 266 }, Call { location: 413 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(10), size: Relative(11) }, scalars: HeapVector { pointer: Relative(12), size: Relative(13) }, outputs: HeapArray { pointer: Relative(14), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32839) }, Load { destination: Relative(1), source_pointer: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(9) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 416 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(11) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(6) }, JumpIf { condition: Relative(3), location: 294 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Relative(7) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, Mov { destination: Relative(1), source: Relative(2) }, Return, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Cast { destination: Relative(12), source: Relative(5), bit_size: Integer(U128) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Field }, BinaryFieldOp { destination: Relative(12), op: Sub, lhs: Relative(5), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(12), rhs: Direct(32844) }, BinaryFieldOp { destination: Relative(12), op: Mul, lhs: Direct(32835), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(14), op: Add, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(5), rhs: Relative(14) }, JumpIf { condition: Relative(12), location: 318 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Load { destination: Relative(5), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 665 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(11) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 665 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Store { destination_pointer: Relative(15), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(11) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Relative(5) }, Jump { location: 257 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, Load { destination: Relative(1), source_pointer: Relative(13) }, Cast { destination: Relative(13), source: Relative(1), bit_size: Integer(U128) }, Cast { destination: Relative(12), source: Relative(13), bit_size: Field }, BinaryFieldOp { destination: Relative(13), op: Sub, lhs: Relative(1), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(14), op: Mul, lhs: Relative(13), rhs: Direct(32844) }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Direct(32835), rhs: Relative(14) }, BinaryFieldOp { destination: Relative(15), op: Add, lhs: Relative(12), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(1), rhs: Relative(15) }, JumpIf { condition: Relative(13), location: 352 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Load { destination: Relative(1), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 665 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(12) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32839) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 665 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Store { destination_pointer: Relative(11), source: Relative(12) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32839) }, Mov { destination: Relative(7), source: Relative(1) }, Jump { location: 189 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(12) }, Cast { destination: Relative(12), source: Relative(8), bit_size: Integer(U128) }, Cast { destination: Relative(11), source: Relative(12), bit_size: Field }, BinaryFieldOp { destination: Relative(12), op: Sub, lhs: Relative(8), rhs: Relative(11) }, BinaryFieldOp { destination: Relative(13), op: Mul, lhs: Relative(12), rhs: Direct(32844) }, BinaryFieldOp { destination: Relative(12), op: Mul, lhs: Direct(32835), rhs: Relative(13) }, BinaryFieldOp { destination: Relative(14), op: Add, lhs: Relative(11), rhs: Relative(12) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(8), rhs: Relative(14) }, JumpIf { condition: Relative(12), location: 386 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 665 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(16), source: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32839) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 665 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(13) }, Store { destination_pointer: Relative(10), source: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32839) }, Mov { destination: Relative(7), source: Relative(8) }, Jump { location: 123 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 412 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 407 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BlackBox(ToRadix { input: Relative(2), radix: Relative(6), output_pointer: Relative(8), num_limbs: Relative(9), output_bits: Relative(7) }), Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(10) }, Call { location: 687 }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U1), value: 1 }, Const { destination: Relative(6), bit_size: Field, value: 2 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(9), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(11), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(4), source: Direct(32837) }, Jump { location: 444 }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32841) }, JumpIf { condition: Relative(14), location: 449 }, Jump { location: 447 }, Load { destination: Relative(1), source_pointer: Relative(2) }, Return, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(4) }, Load { destination: Relative(16), source_pointer: Relative(18) }, JumpIf { condition: Relative(16), location: 461 }, Jump { location: 454 }, Load { destination: Relative(16), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(4) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Mov { destination: Relative(14), source: Relative(16) }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 468 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(4) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Load { destination: Relative(17), source_pointer: Relative(2) }, Mov { destination: Relative(14), source: Relative(16) }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 468 }, Mov { destination: Relative(17), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Mov { destination: Relative(19), source: Relative(18) }, Store { destination_pointer: Relative(19), source: Relative(14) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(15) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(15) }, Store { destination_pointer: Relative(18), source: Direct(32838) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32838) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32838) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32838) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32838) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32838) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(19), source: Relative(18) }, Store { destination_pointer: Relative(19), source: Direct(32838) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32838) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(1) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32838) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32838) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(1) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32838) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32838) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(14) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(19) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(20), source: Relative(19) }, Store { destination_pointer: Relative(20), source: Direct(32843) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32845) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32836) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32842) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32846) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32836) }, Mov { destination: Relative(16), source: Direct(32837) }, Jump { location: 542 }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(16), rhs: Direct(32840) }, JumpIf { condition: Relative(19), location: 595 }, Jump { location: 545 }, Load { destination: Relative(14), source_pointer: Relative(15) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 665 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Store { destination_pointer: Relative(17), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 665 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Store { destination_pointer: Relative(17), source: Direct(32838) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(18) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 665 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Store { destination_pointer: Relative(17), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 665 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Store { destination_pointer: Relative(17), source: Relative(11) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 665 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Direct(32836) }, Store { destination_pointer: Relative(18), source: Relative(16) }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(17), size: Relative(18) }, scalars: HeapVector { pointer: Relative(19), size: Relative(20) }, outputs: HeapArray { pointer: Relative(21), size: 3 } }), BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32839) }, Load { destination: Relative(14), source_pointer: Relative(16) }, Store { destination_pointer: Relative(2), source: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, Mov { destination: Relative(4), source: Relative(14) }, Jump { location: 444 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(16) }, Load { destination: Relative(19), source_pointer: Relative(21) }, Cast { destination: Relative(21), source: Relative(19), bit_size: Integer(U128) }, Cast { destination: Relative(20), source: Relative(21), bit_size: Field }, BinaryFieldOp { destination: Relative(21), op: Sub, lhs: Relative(19), rhs: Relative(20) }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(21), rhs: Direct(32844) }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Direct(32835), rhs: Relative(22) }, BinaryFieldOp { destination: Relative(23), op: Add, lhs: Relative(20), rhs: Relative(21) }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(19), rhs: Relative(23) }, JumpIf { condition: Relative(21), location: 608 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(24) } }, Load { destination: Relative(19), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(21), op: Mul, bit_size: U32, lhs: Relative(16), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 665 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Store { destination_pointer: Relative(25), source: Relative(20) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32839) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 665 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(19) }, Store { destination_pointer: Relative(24), source: Relative(22) }, Store { destination_pointer: Relative(15), source: Relative(20) }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(16), rhs: Direct(32841) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(19) }, Load { destination: Relative(20), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(32839) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Load { destination: Relative(22), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(32840) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(23) }, Load { destination: Relative(24), source_pointer: Relative(26) }, Load { destination: Relative(23), source_pointer: Relative(18) }, Mov { destination: Direct(32771), source: Relative(23) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 665 }, Mov { destination: Relative(25), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(19) }, Store { destination_pointer: Relative(27), source: Relative(20) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 665 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(21) }, Store { destination_pointer: Relative(23), source: Relative(22) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32839) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 665 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(20) }, Store { destination_pointer: Relative(23), source: Relative(24) }, Store { destination_pointer: Relative(18), source: Relative(21) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32839) }, Mov { destination: Relative(16), source: Relative(19) }, Jump { location: 542 }, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 669 }, Jump { location: 671 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 686 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 683 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 676 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 686 }, Return, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 705 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 691 }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -100,7 +100,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_0.snap index 9de2a539c7d..1bbbd21d5e6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_0.snap @@ -85,7 +85,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32846 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32839 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(8) }, Call { location: 35 }, Mov { destination: Relative(4), source: Relative(7) }, Mov { destination: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(32843) }, Call { location: 46 }, Call { location: 48 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32844 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 35 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32844 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 45 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 38 }, Return, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 651 }, Const { destination: Relative(8), bit_size: Field, value: 1 }, Const { destination: Relative(9), bit_size: Field, value: 17631683881184975370165255887551781615748388533673675138860 }, Const { destination: Relative(10), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Const { destination: Relative(8), bit_size: Field, value: 0 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(1) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(13), size: Relative(14) }, scalars: HeapVector { pointer: Relative(15), size: Relative(16) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), Const { destination: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(15) }, Store { destination_pointer: Relative(16), source: Relative(11) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(15), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 118 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, JumpIf { condition: Relative(16), location: 617 }, Jump { location: 121 }, Const { destination: Relative(12), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(18), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(19), source: Direct(1) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(20) }, IndirectConst { destination_pointer: Relative(19), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(20) }, Store { destination_pointer: Relative(21), source: Relative(12) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(10) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(17) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(18) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(10) }, Load { destination: Relative(20), source_pointer: Relative(14) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(21), size: Relative(22) }, scalars: HeapVector { pointer: Relative(23), size: Relative(24) }, outputs: HeapArray { pointer: Relative(25), size: 3 } }), BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, Load { destination: Relative(20), source_pointer: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(20) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(3) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(8) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(8) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(8) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(8) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(8) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(8) }, Mov { destination: Relative(21), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 189 }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(1) }, JumpIf { condition: Relative(22), location: 583 }, Jump { location: 192 }, Const { destination: Relative(14), bit_size: Field, value: -9101662836674550326256996212378706138142399878494295154626728833686305224889 }, Const { destination: Relative(22), bit_size: Field, value: 1658946642478826263901298755938807527017017780224674388532518006781615929512 }, Mov { destination: Relative(23), source: Direct(1) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(24) }, IndirectConst { destination_pointer: Relative(23), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Mov { destination: Relative(25), source: Relative(24) }, Store { destination_pointer: Relative(25), source: Relative(12) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(16) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(10) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(17) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(18) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(10) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(14) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(22) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(16), size: Relative(17) }, scalars: HeapVector { pointer: Relative(18), size: Relative(21) }, outputs: HeapArray { pointer: Relative(22), size: 3 } }), BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, Load { destination: Relative(12), source_pointer: Relative(16) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(6) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 257 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, JumpIf { condition: Relative(5), location: 549 }, Jump { location: 260 }, Load { destination: Relative(7), source_pointer: Relative(19) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(7) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 266 }, Call { location: 657 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(16), size: Relative(17) }, scalars: HeapVector { pointer: Relative(18), size: Relative(21) }, outputs: HeapArray { pointer: Relative(22), size: 3 } }), BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(16) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(17), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 3 }, BlackBox(ToRadix { input: Relative(3), radix: Relative(16), output_pointer: Relative(18), num_limbs: Relative(21), output_bits: Relative(17) }), Const { destination: Relative(22), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(18) }, Mov { destination: Direct(32772), source: Relative(22) }, Call { location: 660 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(20) }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(17) }, Store { destination_pointer: Relative(18), source: Relative(8) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(8) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(8) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(8) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(8) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Const { destination: Relative(17), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(20) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(20) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(17) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(17) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(17) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 344 }, Call { location: 657 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Const { destination: Relative(17), bit_size: Field, value: 2 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(23), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(25), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(26), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(27), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(5), source: Relative(11) }, Jump { location: 356 }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, JumpIf { condition: Relative(14), location: 374 }, Jump { location: 359 }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 364 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Relative(12) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Return, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(5) }, Load { destination: Relative(28), source_pointer: Relative(30) }, JumpIf { condition: Relative(28), location: 386 }, Jump { location: 379 }, Load { destination: Relative(28), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Relative(5) }, Load { destination: Relative(29), source_pointer: Relative(31) }, Mov { destination: Relative(14), source: Relative(28) }, Mov { destination: Relative(20), source: Relative(29) }, Jump { location: 393 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(5) }, Load { destination: Relative(28), source_pointer: Relative(30) }, Load { destination: Relative(29), source_pointer: Relative(3) }, Mov { destination: Relative(14), source: Relative(28) }, Mov { destination: Relative(20), source: Relative(29) }, Jump { location: 393 }, Mov { destination: Relative(29), source: Direct(1) }, Const { destination: Relative(30), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(30) }, IndirectConst { destination_pointer: Relative(29), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Mov { destination: Relative(31), source: Relative(30) }, Store { destination_pointer: Relative(31), source: Relative(14) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(20) }, Load { destination: Relative(14), source_pointer: Relative(16) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(30), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(14) }, Not { destination: Relative(30), source: Relative(30), bit_size: U1 }, JumpIf { condition: Relative(30), location: 408 }, Call { location: 657 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(16) }, Load { destination: Relative(30), source_pointer: Relative(18) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(32), op: Equals, bit_size: U32, lhs: Relative(31), rhs: Relative(30) }, Not { destination: Relative(32), source: Relative(32), bit_size: U1 }, JumpIf { condition: Relative(32), location: 419 }, Call { location: 657 }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(30) }, Mov { destination: Relative(30), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(18) }, Mov { destination: Relative(28), source: Relative(11) }, Jump { location: 426 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(28), rhs: Relative(13) }, JumpIf { condition: Relative(20), location: 479 }, Jump { location: 429 }, Load { destination: Relative(20), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(28), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(21) }, Store { destination_pointer: Relative(29), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(28) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(22) }, Store { destination_pointer: Relative(29), source: Relative(8) }, Store { destination_pointer: Relative(14), source: Relative(20) }, Load { destination: Relative(14), source_pointer: Relative(30) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(28), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(24) }, Store { destination_pointer: Relative(29), source: Relative(23) }, Mov { destination: Direct(32771), source: Relative(28) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(26) }, Store { destination_pointer: Relative(29), source: Relative(25) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(28), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(27) }, Store { destination_pointer: Relative(29), source: Relative(10) }, Store { destination_pointer: Relative(30), source: Relative(28) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(29) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Direct(2) }, Const { destination: Relative(30), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(32), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(29), size: Relative(30) }, scalars: HeapVector { pointer: Relative(31), size: Relative(32) }, outputs: HeapArray { pointer: Relative(33), size: 3 } }), BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, Load { destination: Relative(20), source_pointer: Relative(28) }, Store { destination_pointer: Relative(3), source: Relative(20) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, Mov { destination: Relative(5), source: Relative(14) }, Jump { location: 356 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(28) }, Load { destination: Relative(20), source_pointer: Relative(32) }, Cast { destination: Relative(32), source: Relative(20), bit_size: Integer(U128) }, Cast { destination: Relative(31), source: Relative(32), bit_size: Field }, BinaryFieldOp { destination: Relative(32), op: Sub, lhs: Relative(20), rhs: Relative(31) }, BinaryFieldOp { destination: Relative(33), op: Mul, lhs: Relative(32), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(32), op: Mul, lhs: Direct(32835), rhs: Relative(33) }, BinaryFieldOp { destination: Relative(34), op: Add, lhs: Relative(31), rhs: Relative(32) }, BinaryFieldOp { destination: Relative(32), op: Equals, lhs: Relative(20), rhs: Relative(34) }, JumpIf { condition: Relative(32), location: 492 }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(35) } }, Load { destination: Relative(20), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(32), op: Mul, bit_size: U32, lhs: Relative(28), rhs: Relative(13) }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(34), source: Direct(32773) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(35), rhs: Relative(32) }, Store { destination_pointer: Relative(36), source: Relative(31) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(9) }, Mov { destination: Direct(32771), source: Relative(34) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(31), source: Direct(32773) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(20) }, Store { destination_pointer: Relative(35), source: Relative(33) }, Store { destination_pointer: Relative(14), source: Relative(31) }, BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(28), rhs: Relative(1) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(20) }, Load { destination: Relative(31), source_pointer: Relative(33) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(9) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(32) }, Load { destination: Relative(33), source_pointer: Relative(35) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(13) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Relative(34) }, Load { destination: Relative(35), source_pointer: Relative(37) }, Load { destination: Relative(34), source_pointer: Relative(30) }, Mov { destination: Direct(32771), source: Relative(34) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(36), source: Direct(32773) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(37), rhs: Relative(20) }, Store { destination_pointer: Relative(38), source: Relative(31) }, Mov { destination: Direct(32771), source: Relative(36) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(32) }, Store { destination_pointer: Relative(34), source: Relative(33) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(9) }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(32), source: Direct(32773) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(33), rhs: Relative(31) }, Store { destination_pointer: Relative(34), source: Relative(35) }, Store { destination_pointer: Relative(30), source: Relative(32) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(9) }, Mov { destination: Relative(28), source: Relative(20) }, Jump { location: 426 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(17) }, Cast { destination: Relative(17), source: Relative(5), bit_size: Integer(U128) }, Cast { destination: Relative(16), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(17), op: Sub, lhs: Relative(5), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(17), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Direct(32835), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(21), op: Add, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(5), rhs: Relative(21) }, JumpIf { condition: Relative(17), location: 562 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(22) } }, Load { destination: Relative(5), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 679 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(17) }, Store { destination_pointer: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(9) }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 679 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(5) }, Store { destination_pointer: Relative(22), source: Relative(18) }, Store { destination_pointer: Relative(6), source: Relative(16) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(7), source: Relative(5) }, Jump { location: 257 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(7) }, Load { destination: Relative(22), source_pointer: Relative(24) }, Cast { destination: Relative(24), source: Relative(22), bit_size: Integer(U128) }, Cast { destination: Relative(23), source: Relative(24), bit_size: Field }, BinaryFieldOp { destination: Relative(24), op: Sub, lhs: Relative(22), rhs: Relative(23) }, BinaryFieldOp { destination: Relative(25), op: Mul, lhs: Relative(24), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(24), op: Mul, lhs: Direct(32835), rhs: Relative(25) }, BinaryFieldOp { destination: Relative(26), op: Add, lhs: Relative(23), rhs: Relative(24) }, BinaryFieldOp { destination: Relative(24), op: Equals, lhs: Relative(22), rhs: Relative(26) }, JumpIf { condition: Relative(24), location: 596 }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(27) } }, Load { destination: Relative(22), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(24), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(26), source: Direct(32773) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(24) }, Store { destination_pointer: Relative(28), source: Relative(23) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(9) }, Mov { destination: Direct(32771), source: Relative(26) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(22) }, Store { destination_pointer: Relative(27), source: Relative(25) }, Store { destination_pointer: Relative(21), source: Relative(23) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(7), source: Relative(22) }, Jump { location: 189 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(7) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Cast { destination: Relative(18), source: Relative(16), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(18), bit_size: Field }, BinaryFieldOp { destination: Relative(18), op: Sub, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(18), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Direct(32835), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(20), op: Add, lhs: Relative(17), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(18), op: Equals, lhs: Relative(16), rhs: Relative(20) }, JumpIf { condition: Relative(18), location: 630 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, Load { destination: Relative(16), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(18), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 679 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(18) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(9) }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 679 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Store { destination_pointer: Relative(21), source: Relative(19) }, Store { destination_pointer: Relative(14), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(7), source: Relative(16) }, Jump { location: 118 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 656 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 678 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 664 }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 683 }, Jump { location: 685 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 700 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 697 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 690 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 700 }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -100,7 +100,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 9de2a539c7d..1bbbd21d5e6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -85,7 +85,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32846 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32836), size_address: Relative(7), offset_address: Relative(8) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(32837) }, Mov { destination: Relative(3), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32839 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(4) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(8) }, Call { location: 35 }, Mov { destination: Relative(4), source: Relative(7) }, Mov { destination: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(32843) }, Call { location: 46 }, Call { location: 48 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32844 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(2) }, Mov { destination: Direct(32772), source: Relative(3) }, Mov { destination: Direct(32773), source: Relative(4) }, Call { location: 35 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32844 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 2 }, Stop { return_data: HeapVector { pointer: Relative(2), size: Relative(3) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 45 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 38 }, Return, Const { destination: Direct(32835), bit_size: Field, value: 340282366920938463463374607431768211456 }, Return, Call { location: 651 }, Const { destination: Relative(8), bit_size: Field, value: 1 }, Const { destination: Relative(9), bit_size: Field, value: 17631683881184975370165255887551781615748388533673675138860 }, Const { destination: Relative(10), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Const { destination: Relative(8), bit_size: Field, value: 0 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Relative(1) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(13), size: Relative(14) }, scalars: HeapVector { pointer: Relative(15), size: Relative(16) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), Const { destination: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(12), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(15) }, Store { destination_pointer: Relative(16), source: Relative(11) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(15), bit_size: Field, value: 8680525429001239497728366687280168587232520577698044359798894838135247199343 }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 118 }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, JumpIf { condition: Relative(16), location: 617 }, Jump { location: 121 }, Const { destination: Relative(12), bit_size: Field, value: 3728882899078719075161482178784387565366481897740339799480980287259621149274 }, Const { destination: Relative(16), bit_size: Field, value: -9903063709032878667290627648209915537972247634463802596148419711785767431332 }, Const { destination: Relative(17), bit_size: Field, value: 2393473289045184898987089634332637236754766663897650125720167164137088869378 }, Const { destination: Relative(18), bit_size: Field, value: -7135402912423807765050323395026152633898511180575289670895350565966806597339 }, Mov { destination: Relative(19), source: Direct(1) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(20) }, IndirectConst { destination_pointer: Relative(19), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(20) }, Store { destination_pointer: Relative(21), source: Relative(12) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(16) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(10) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(17) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(18) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(10) }, Load { destination: Relative(20), source_pointer: Relative(14) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(21), size: Relative(22) }, scalars: HeapVector { pointer: Relative(23), size: Relative(24) }, outputs: HeapArray { pointer: Relative(25), size: 3 } }), BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, Load { destination: Relative(20), source_pointer: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(20) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(3) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(21) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(22), source: Relative(21) }, Store { destination_pointer: Relative(22), source: Relative(8) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(8) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(8) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(8) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(8) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(8) }, Mov { destination: Relative(21), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 189 }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(1) }, JumpIf { condition: Relative(22), location: 583 }, Jump { location: 192 }, Const { destination: Relative(14), bit_size: Field, value: -9101662836674550326256996212378706138142399878494295154626728833686305224889 }, Const { destination: Relative(22), bit_size: Field, value: 1658946642478826263901298755938807527017017780224674388532518006781615929512 }, Mov { destination: Relative(23), source: Direct(1) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(24) }, IndirectConst { destination_pointer: Relative(23), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Mov { destination: Relative(25), source: Relative(24) }, Store { destination_pointer: Relative(25), source: Relative(12) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(16) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(10) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(17) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(18) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(10) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(14) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(22) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(21) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(16), size: Relative(17) }, scalars: HeapVector { pointer: Relative(18), size: Relative(21) }, outputs: HeapArray { pointer: Relative(22), size: 3 } }), BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, Load { destination: Relative(12), source_pointer: Relative(16) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(6) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 257 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, JumpIf { condition: Relative(5), location: 549 }, Jump { location: 260 }, Load { destination: Relative(7), source_pointer: Relative(19) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(7) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 266 }, Call { location: 657 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(16), size: Relative(17) }, scalars: HeapVector { pointer: Relative(18), size: Relative(21) }, outputs: HeapArray { pointer: Relative(22), size: 3 } }), BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(16) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(17), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 3 }, BlackBox(ToRadix { input: Relative(3), radix: Relative(16), output_pointer: Relative(18), num_limbs: Relative(21), output_bits: Relative(17) }), Const { destination: Relative(22), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(18) }, Mov { destination: Direct(32772), source: Relative(22) }, Call { location: 660 }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(20) }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(17) }, Store { destination_pointer: Relative(18), source: Relative(8) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(8) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(8) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(8) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(8) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Const { destination: Relative(17), bit_size: Integer(U1), value: 1 }, Mov { destination: Relative(18), source: Direct(1) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(20) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Mov { destination: Relative(21), source: Relative(20) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(17) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(17) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(21), source: Relative(17) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 344 }, Call { location: 657 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Const { destination: Relative(17), bit_size: Field, value: 2 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 6 }, Const { destination: Relative(23), bit_size: Field, value: -1094708040843609169356775910874053498301840173462935739639689208799068762676 }, Const { destination: Relative(24), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(25), bit_size: Field, value: -718703907181967287621274717949248537252263842169639534402461291799004475262 }, Const { destination: Relative(26), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(27), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(5), source: Relative(11) }, Jump { location: 356 }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, JumpIf { condition: Relative(14), location: 374 }, Jump { location: 359 }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 364 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(2) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Relative(12) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Return, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(5) }, Load { destination: Relative(28), source_pointer: Relative(30) }, JumpIf { condition: Relative(28), location: 386 }, Jump { location: 379 }, Load { destination: Relative(28), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Relative(5) }, Load { destination: Relative(29), source_pointer: Relative(31) }, Mov { destination: Relative(14), source: Relative(28) }, Mov { destination: Relative(20), source: Relative(29) }, Jump { location: 393 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Relative(5) }, Load { destination: Relative(28), source_pointer: Relative(30) }, Load { destination: Relative(29), source_pointer: Relative(3) }, Mov { destination: Relative(14), source: Relative(28) }, Mov { destination: Relative(20), source: Relative(29) }, Jump { location: 393 }, Mov { destination: Relative(29), source: Direct(1) }, Const { destination: Relative(30), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(30) }, IndirectConst { destination_pointer: Relative(29), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Mov { destination: Relative(31), source: Relative(30) }, Store { destination_pointer: Relative(31), source: Relative(14) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(20) }, Load { destination: Relative(14), source_pointer: Relative(16) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(30), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(14) }, Not { destination: Relative(30), source: Relative(30), bit_size: U1 }, JumpIf { condition: Relative(30), location: 408 }, Call { location: 657 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(16) }, Load { destination: Relative(30), source_pointer: Relative(18) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(32), op: Equals, bit_size: U32, lhs: Relative(31), rhs: Relative(30) }, Not { destination: Relative(32), source: Relative(32), bit_size: U1 }, JumpIf { condition: Relative(32), location: 419 }, Call { location: 657 }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(30) }, Mov { destination: Relative(30), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(18) }, Mov { destination: Relative(28), source: Relative(11) }, Jump { location: 426 }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(28), rhs: Relative(13) }, JumpIf { condition: Relative(20), location: 479 }, Jump { location: 429 }, Load { destination: Relative(20), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(28), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(21) }, Store { destination_pointer: Relative(29), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(28) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(22) }, Store { destination_pointer: Relative(29), source: Relative(8) }, Store { destination_pointer: Relative(14), source: Relative(20) }, Load { destination: Relative(14), source_pointer: Relative(30) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(28), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(24) }, Store { destination_pointer: Relative(29), source: Relative(23) }, Mov { destination: Direct(32771), source: Relative(28) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(26) }, Store { destination_pointer: Relative(29), source: Relative(25) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(28), source: Direct(32773) }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(27) }, Store { destination_pointer: Relative(29), source: Relative(10) }, Store { destination_pointer: Relative(30), source: Relative(28) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(29) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(28), rhs: Direct(2) }, Const { destination: Relative(30), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Const { destination: Relative(32), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(29), size: Relative(30) }, scalars: HeapVector { pointer: Relative(31), size: Relative(32) }, outputs: HeapArray { pointer: Relative(33), size: 3 } }), BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(9) }, Load { destination: Relative(20), source_pointer: Relative(28) }, Store { destination_pointer: Relative(3), source: Relative(20) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, Mov { destination: Relative(5), source: Relative(14) }, Jump { location: 356 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(28) }, Load { destination: Relative(20), source_pointer: Relative(32) }, Cast { destination: Relative(32), source: Relative(20), bit_size: Integer(U128) }, Cast { destination: Relative(31), source: Relative(32), bit_size: Field }, BinaryFieldOp { destination: Relative(32), op: Sub, lhs: Relative(20), rhs: Relative(31) }, BinaryFieldOp { destination: Relative(33), op: Mul, lhs: Relative(32), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(32), op: Mul, lhs: Direct(32835), rhs: Relative(33) }, BinaryFieldOp { destination: Relative(34), op: Add, lhs: Relative(31), rhs: Relative(32) }, BinaryFieldOp { destination: Relative(32), op: Equals, lhs: Relative(20), rhs: Relative(34) }, JumpIf { condition: Relative(32), location: 492 }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(35) } }, Load { destination: Relative(20), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(32), op: Mul, bit_size: U32, lhs: Relative(28), rhs: Relative(13) }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(34), source: Direct(32773) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(35), rhs: Relative(32) }, Store { destination_pointer: Relative(36), source: Relative(31) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(9) }, Mov { destination: Direct(32771), source: Relative(34) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(31), source: Direct(32773) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(20) }, Store { destination_pointer: Relative(35), source: Relative(33) }, Store { destination_pointer: Relative(14), source: Relative(31) }, BinaryIntOp { destination: Relative(20), op: Mul, bit_size: U32, lhs: Relative(28), rhs: Relative(1) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(20) }, Load { destination: Relative(31), source_pointer: Relative(33) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(9) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(32) }, Load { destination: Relative(33), source_pointer: Relative(35) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(13) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Relative(34) }, Load { destination: Relative(35), source_pointer: Relative(37) }, Load { destination: Relative(34), source_pointer: Relative(30) }, Mov { destination: Direct(32771), source: Relative(34) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(36), source: Direct(32773) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(37), rhs: Relative(20) }, Store { destination_pointer: Relative(38), source: Relative(31) }, Mov { destination: Direct(32771), source: Relative(36) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(32) }, Store { destination_pointer: Relative(34), source: Relative(33) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(9) }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 10 }, Call { location: 679 }, Mov { destination: Relative(32), source: Direct(32773) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(33), rhs: Relative(31) }, Store { destination_pointer: Relative(34), source: Relative(35) }, Store { destination_pointer: Relative(30), source: Relative(32) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(28), rhs: Relative(9) }, Mov { destination: Relative(28), source: Relative(20) }, Jump { location: 426 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(17) }, Cast { destination: Relative(17), source: Relative(5), bit_size: Integer(U128) }, Cast { destination: Relative(16), source: Relative(17), bit_size: Field }, BinaryFieldOp { destination: Relative(17), op: Sub, lhs: Relative(5), rhs: Relative(16) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(17), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Direct(32835), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(21), op: Add, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(5), rhs: Relative(21) }, JumpIf { condition: Relative(17), location: 562 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(22) } }, Load { destination: Relative(5), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 679 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(17) }, Store { destination_pointer: Relative(23), source: Relative(16) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(9) }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 679 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(5) }, Store { destination_pointer: Relative(22), source: Relative(18) }, Store { destination_pointer: Relative(6), source: Relative(16) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(7), source: Relative(5) }, Jump { location: 257 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Relative(7) }, Load { destination: Relative(22), source_pointer: Relative(24) }, Cast { destination: Relative(24), source: Relative(22), bit_size: Integer(U128) }, Cast { destination: Relative(23), source: Relative(24), bit_size: Field }, BinaryFieldOp { destination: Relative(24), op: Sub, lhs: Relative(22), rhs: Relative(23) }, BinaryFieldOp { destination: Relative(25), op: Mul, lhs: Relative(24), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(24), op: Mul, lhs: Direct(32835), rhs: Relative(25) }, BinaryFieldOp { destination: Relative(26), op: Add, lhs: Relative(23), rhs: Relative(24) }, BinaryFieldOp { destination: Relative(24), op: Equals, lhs: Relative(22), rhs: Relative(26) }, JumpIf { condition: Relative(24), location: 596 }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(27) } }, Load { destination: Relative(22), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(24), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, Mov { destination: Direct(32771), source: Relative(22) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(26), source: Direct(32773) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(24) }, Store { destination_pointer: Relative(28), source: Relative(23) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(9) }, Mov { destination: Direct(32771), source: Relative(26) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 679 }, Mov { destination: Relative(23), source: Direct(32773) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(23), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(22) }, Store { destination_pointer: Relative(27), source: Relative(25) }, Store { destination_pointer: Relative(21), source: Relative(23) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(7), source: Relative(22) }, Jump { location: 189 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(7) }, Load { destination: Relative(16), source_pointer: Relative(18) }, Cast { destination: Relative(18), source: Relative(16), bit_size: Integer(U128) }, Cast { destination: Relative(17), source: Relative(18), bit_size: Field }, BinaryFieldOp { destination: Relative(18), op: Sub, lhs: Relative(16), rhs: Relative(17) }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(18), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Direct(32835), rhs: Relative(19) }, BinaryFieldOp { destination: Relative(20), op: Add, lhs: Relative(17), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(18), op: Equals, lhs: Relative(16), rhs: Relative(20) }, JumpIf { condition: Relative(18), location: 630 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, Load { destination: Relative(16), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(18), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 679 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(18) }, Store { destination_pointer: Relative(22), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(9) }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 679 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Store { destination_pointer: Relative(21), source: Relative(19) }, Store { destination_pointer: Relative(14), source: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(7), source: Relative(16) }, Jump { location: 118 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 656 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Const { destination: Direct(32774), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32773), op: Div, bit_size: U32, lhs: Direct(32772), rhs: Direct(32774) }, Mov { destination: Direct(32776), source: Direct(32772) }, Const { destination: Direct(32777), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Direct(32778), op: LessThan, bit_size: U32, lhs: Direct(32777), rhs: Direct(32773) }, Not { destination: Direct(32778), source: Direct(32778), bit_size: U1 }, JumpIf { condition: Direct(32778), location: 678 }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Load { destination: Direct(32774), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32777) }, Store { destination_pointer: Direct(32779), source: Direct(32775) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Store { destination_pointer: Direct(32779), source: Direct(32774) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 664 }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 683 }, Jump { location: 685 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 700 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 697 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 690 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 700 }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: false,\n };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2_1);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n // Ensure is_infinite is comptime\n let point1_1 = EmbeddedCurvePoint { x: point1.x, y: point1.y, is_infinite: false };\n let point2_1 = EmbeddedCurvePoint { x: point2.x, y: point2.y, is_infinite: false };\n embedded_curve_add_unsafe(point1_1, point2_1)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", @@ -100,7 +100,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "50": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__expanded.snap index d877298541c..a2d13eb6a25 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__expanded.snap @@ -36,8 +36,8 @@ fn dynamic_slice_index_set_if(mut slice: [Field], x: Field, y: Field) { assert(slice[x] == 4); slice[x] = slice[x] - 2; { - let i_3817: Field = x - 1; - slice[i_3817] = slice[x]; + let i_3820: Field = x - 1; + slice[i_3820] = slice[x]; } } else { slice[x] = 0; @@ -56,8 +56,8 @@ fn dynamic_slice_index_set_else(mut slice: [Field], x: Field, y: Field) { assert(slice[x] == 4); slice[x] = slice[x] - 2; { - let i_3818: Field = x - 1; - slice[i_3818] = slice[x]; + let i_3821: Field = x - 1; + slice[i_3821] = slice[x]; } } else { slice[x] = 0; diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 7811498a3ca..75f62dfff4d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -233,7 +233,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32921 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 12 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32909), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32909 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 23 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 34 }, Call { location: 109 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32921 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 33 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 26 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 6 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 3 }, Const { destination: Direct(32837), bit_size: Integer(U1), value: 0 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32839), bit_size: Integer(U64), value: 0 }, Const { destination: Direct(32840), bit_size: Field, value: 0 }, Const { destination: Direct(32841), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32842), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32843), bit_size: Field, value: 1 }, Const { destination: Direct(32844), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32845), bit_size: Field, value: 2 }, Const { destination: Direct(32846), bit_size: Field, value: 3 }, Const { destination: Direct(32847), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32848), bit_size: Integer(U32), value: 5 }, Const { destination: Direct(32849), bit_size: Field, value: 5 }, Const { destination: Direct(32850), bit_size: Field, value: 6 }, Const { destination: Direct(32851), bit_size: Field, value: 7 }, Const { destination: Direct(32852), bit_size: Field, value: 11 }, Const { destination: Direct(32853), bit_size: Field, value: 12 }, Const { destination: Direct(32854), bit_size: Field, value: 13 }, Const { destination: Direct(32855), bit_size: Field, value: 30 }, Const { destination: Direct(32856), bit_size: Integer(U8), value: 32 }, Const { destination: Direct(32857), bit_size: Integer(U8), value: 34 }, Const { destination: Direct(32858), bit_size: Field, value: 42 }, Const { destination: Direct(32859), bit_size: Integer(U8), value: 44 }, Const { destination: Direct(32860), bit_size: Integer(U8), value: 46 }, Const { destination: Direct(32861), bit_size: Integer(U8), value: 49 }, Const { destination: Direct(32862), bit_size: Integer(U8), value: 50 }, Const { destination: Direct(32863), bit_size: Integer(U8), value: 51 }, Const { destination: Direct(32864), bit_size: Field, value: 55 }, Const { destination: Direct(32865), bit_size: Integer(U8), value: 58 }, Const { destination: Direct(32866), bit_size: Integer(U8), value: 65 }, Const { destination: Direct(32867), bit_size: Integer(U8), value: 69 }, Const { destination: Direct(32868), bit_size: Integer(U8), value: 73 }, Const { destination: Direct(32869), bit_size: Field, value: 75 }, Const { destination: Direct(32870), bit_size: Field, value: 77 }, Const { destination: Direct(32871), bit_size: Integer(U8), value: 78 }, Const { destination: Direct(32872), bit_size: Field, value: 79 }, Const { destination: Direct(32873), bit_size: Integer(U8), value: 95 }, Const { destination: Direct(32874), bit_size: Integer(U8), value: 97 }, Const { destination: Direct(32875), bit_size: Integer(U8), value: 98 }, Const { destination: Direct(32876), bit_size: Integer(U8), value: 99 }, Const { destination: Direct(32877), bit_size: Integer(U8), value: 100 }, Const { destination: Direct(32878), bit_size: Integer(U8), value: 101 }, Const { destination: Direct(32879), bit_size: Integer(U8), value: 102 }, Const { destination: Direct(32880), bit_size: Integer(U8), value: 103 }, Const { destination: Direct(32881), bit_size: Integer(U8), value: 104 }, Const { destination: Direct(32882), bit_size: Integer(U8), value: 105 }, Const { destination: Direct(32883), bit_size: Integer(U8), value: 107 }, Const { destination: Direct(32884), bit_size: Integer(U8), value: 108 }, Const { destination: Direct(32885), bit_size: Field, value: 108 }, Const { destination: Direct(32886), bit_size: Integer(U8), value: 109 }, Const { destination: Direct(32887), bit_size: Field, value: 109 }, Const { destination: Direct(32888), bit_size: Integer(U8), value: 110 }, Const { destination: Direct(32889), bit_size: Integer(U8), value: 111 }, Const { destination: Direct(32890), bit_size: Integer(U8), value: 112 }, Const { destination: Direct(32891), bit_size: Field, value: 112 }, Const { destination: Direct(32892), bit_size: Field, value: 113 }, Const { destination: Direct(32893), bit_size: Integer(U8), value: 114 }, Const { destination: Direct(32894), bit_size: Integer(U8), value: 115 }, Const { destination: Direct(32895), bit_size: Field, value: 115 }, Const { destination: Direct(32896), bit_size: Integer(U8), value: 116 }, Const { destination: Direct(32897), bit_size: Integer(U8), value: 117 }, Const { destination: Direct(32898), bit_size: Integer(U8), value: 118 }, Const { destination: Direct(32899), bit_size: Field, value: 118 }, Const { destination: Direct(32900), bit_size: Integer(U8), value: 119 }, Const { destination: Direct(32901), bit_size: Integer(U8), value: 121 }, Const { destination: Direct(32902), bit_size: Integer(U8), value: 123 }, Const { destination: Direct(32903), bit_size: Integer(U8), value: 125 }, Const { destination: Direct(32904), bit_size: Field, value: 134 }, Const { destination: Direct(32905), bit_size: Field, value: 135 }, Const { destination: Direct(32906), bit_size: Field, value: 136 }, Const { destination: Direct(32907), bit_size: Field, value: 138 }, Const { destination: Direct(32908), bit_size: Field, value: 10944121435919637611123202872628637544274182200208017171849102093287904247809 }, Return, Call { location: 188 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32844) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 194 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32847) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 440 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32848) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 750 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 153 }, Call { location: 938 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 941 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 1521 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1690 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2086 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2530 }, Mov { destination: Direct(0), source: Relative(0) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 193 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32842) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 230 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 250 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, JumpIf { condition: Relative(9), location: 255 }, Call { location: 3463 }, Load { destination: Relative(7), source_pointer: Relative(4) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 262 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(9) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Direct(32842) }, Mov { destination: Relative(18), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(15) }, Mov { destination: Relative(12), source: Relative(16) }, JumpIf { condition: Relative(9), location: 277 }, Call { location: 3572 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, Store { destination_pointer: Relative(9), source: Direct(32868) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32888) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32894) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32893) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32896) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32877) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32902) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32898) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32874) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32884) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32897) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32903) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32875) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32897) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32896) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32880) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32889) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32896) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32902) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32880) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32889) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32896) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32903) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32879) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32889) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32893) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32896) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32881) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32894) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32874) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32886) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32883) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32901) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32860) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(2), rhs: Relative(12) }, JumpIf { condition: Relative(7), location: 402 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, Mov { destination: Relative(14), source: Relative(13) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(15) }, Mov { destination: Direct(32772), source: Relative(14) }, Mov { destination: Direct(32773), source: Relative(16) }, Call { location: 23 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(15) }, Store { destination_pointer: Relative(14), source: Direct(32844) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(13), size: Relative(9) } }, Const { destination: Relative(2), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Relative(6) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(6) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 419 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, JumpIf { condition: Relative(5), location: 424 }, Call { location: 3723 }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Direct(32838) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(13) }, Mov { destination: Relative(5), source: Relative(14) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(4), rhs: Direct(32837) }, JumpIf { condition: Relative(1), location: 439 }, Call { location: 3726 }, Return, Call { location: 188 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 476 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 480 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, JumpIf { condition: Relative(4), location: 737 }, Jump { location: 483 }, Load { destination: Relative(3), source_pointer: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 491 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 85 }, Const { destination: Relative(8), bit_size: Integer(U8), value: 72 }, Const { destination: Relative(9), bit_size: Integer(U8), value: 77 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(6) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32894) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32881) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32890) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32884) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32878) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32888) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32880) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32896) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32881) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32886) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32897) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32894) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32896) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32878) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32861) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32859) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32880) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32889) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32896) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32902) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32884) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32878) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32888) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32903) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32860) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, JumpIf { condition: Relative(6), location: 597 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 40 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, Mov { destination: Relative(11), source: Relative(9) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U64), value: 7511829951750337011 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 37 }, Mov { destination: Direct(32771), source: Relative(12) }, Mov { destination: Direct(32772), source: Relative(11) }, Mov { destination: Direct(32773), source: Relative(13) }, Call { location: 23 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Store { destination_pointer: Relative(11), source: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Direct(32842) }, Mov { destination: Relative(13), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(6), source: Relative(11) }, JumpIf { condition: Relative(5), location: 611 }, Call { location: 3572 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Direct(32868) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32888) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32894) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32893) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32896) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32877) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32902) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32898) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32874) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32884) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32897) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32903) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32875) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32897) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32896) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32880) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32889) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32896) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32902) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32880) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32889) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32896) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32903) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32879) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32889) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32893) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32896) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32881) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32894) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32874) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32886) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32883) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32901) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32860) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(6) }, JumpIf { condition: Relative(3), location: 736 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(5) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(8) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 23 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, Store { destination_pointer: Relative(8), source: Direct(32844) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(5), size: Relative(4) } }, Return, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(5) }, Mov { destination: Relative(10), source: Relative(6) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(4) }, Jump { location: 480 }, Call { location: 188 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 786 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 816 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, JumpIf { condition: Relative(6), location: 821 }, Call { location: 3729 }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Direct(32842) }, Mov { destination: Relative(14), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(11) }, Mov { destination: Relative(6), source: Relative(12) }, JumpIf { condition: Relative(5), location: 835 }, Call { location: 3572 }, Const { destination: Relative(1), bit_size: Integer(U8), value: 120 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32867) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32890) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32878) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32876) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32896) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32878) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32877) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32856) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32902) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32888) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32878) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32900) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32873) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32898) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32874) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32884) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32897) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32878) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32903) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32859) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32856) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32875) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32897) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32896) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32856) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32880) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32889) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32896) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32856) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32902) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32880) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32889) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32896) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32903) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32860) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(6), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 937 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 40 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(5) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U64), value: 3316745884754988903 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 36 }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(8) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 23 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, Store { destination_pointer: Relative(8), source: Direct(32844) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(5), size: Relative(4) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32842) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 977 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 985 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Direct(32868) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32888) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32894) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32878) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32893) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32896) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32882) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32888) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32880) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32856) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32902) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32878) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32888) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32896) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32893) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32901) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32903) }, Const { destination: Relative(9), bit_size: Integer(U8), value: 91 }, Const { destination: Relative(10), bit_size: Integer(U8), value: 93 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 96 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Direct(32902) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32888) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32865) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32894) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32896) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32893) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32897) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32876) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32896) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32888) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32874) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32886) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32865) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32888) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32896) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32893) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32901) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32879) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32884) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32894) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32865) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32901) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32902) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32888) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32865) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32879) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32884) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32903) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32898) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32874) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32884) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32897) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32902) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32888) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32865) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32879) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32884) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32903) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32903) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1225 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(7), location: 1481 }, Jump { location: 1228 }, Load { destination: Relative(3), source_pointer: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1236 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, Store { destination_pointer: Relative(11), source: Direct(32902) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32883) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32865) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32897) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32894) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32880) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32896) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32880) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32893) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32859) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32900) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32896) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32881) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32865) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32863) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32862) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32903) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), MemoryAddress(Relative(7)), HeapArray(HeapArray { pointer: Relative(10), size: 37 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Simple(Integer(U32)), Array { value_types: [Simple(Integer(U8))], size: 37 }, Simple(Integer(U1))] }, Load { destination: Relative(8), source_pointer: Relative(3) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1325 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(8) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32835) }, JumpIf { condition: Relative(3), location: 1330 }, Call { location: 3732 }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1336 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Direct(32871) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32889) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32896) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32856) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32879) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32889) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32897) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32856) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32894) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32893) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32896) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32856) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32883) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32901) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32856) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32902) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32896) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32893) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32901) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32873) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32883) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32901) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32903) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32860) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1415 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(7), location: 1431 }, Jump { location: 1418 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(4) }, Mov { destination: Relative(9), source: Relative(5) }, Mov { destination: Relative(10), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3735 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, JumpIf { condition: Relative(2), location: 1430 }, Call { location: 3764 }, Return, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Load { destination: Relative(7), source_pointer: Relative(4) }, Load { destination: Relative(9), source_pointer: Relative(5) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1444 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(13), source: Relative(17) }, JumpIf { condition: Relative(11), location: 1478 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 38 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9862881900111276825 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 35 }, Mov { destination: Direct(32771), source: Relative(14) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(15) }, Call { location: 23 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 35 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, Store { destination_pointer: Relative(10), source: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(7) } }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(7) }, Jump { location: 1415 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(12) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1495 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1503 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(9), size: 17 }), MemoryAddress(Direct(32842)), MemoryAddress(Relative(8)), MemoryAddress(Relative(7)), HeapArray(HeapArray { pointer: Relative(13), size: 95 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 17 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 95 }, Simple(Integer(U1))] }, Const { destination: Relative(9), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Relative(6) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(7) }, Jump { location: 1225 }, Call { location: 188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32842) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32842) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Load { destination: Relative(9), source_pointer: Relative(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1586 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1590 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(9), location: 1659 }, Jump { location: 1593 }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1602 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Load { destination: Relative(11), source_pointer: Relative(6) }, Load { destination: Relative(12), source_pointer: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1613 }, Call { location: 938 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(12) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(4) }, Mov { destination: Relative(18), source: Relative(5) }, Mov { destination: Relative(19), source: Relative(3) }, Mov { destination: Relative(20), source: Relative(10) }, Mov { destination: Relative(21), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 3767 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(16) }, JumpIf { condition: Relative(12), location: 1629 }, Call { location: 3866 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Load { destination: Relative(3), source_pointer: Relative(10) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(8) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(1) }, Mov { destination: Relative(19), source: Relative(3) }, Mov { destination: Relative(20), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 3767 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(15) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(6), rhs: Direct(32837) }, JumpIf { condition: Relative(1), location: 1658 }, Call { location: 3869 }, Return, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(13) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(10) }, Mov { destination: Relative(17), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(8) }, Mov { destination: Relative(15), source: Relative(6) }, Mov { destination: Relative(16), source: Relative(10) }, Mov { destination: Relative(17), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(9) }, Jump { location: 1590 }, Call { location: 188 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 1726 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32849) }, Mov { destination: Relative(12), source: Direct(32852) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32845) }, Mov { destination: Relative(12), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32852) }, Mov { destination: Relative(12), source: Direct(32849) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32907) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3872 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 1775 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, JumpIf { condition: Relative(4), location: 1780 }, Call { location: 4049 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Direct(32844) }, Mov { destination: Relative(12), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(9) }, Mov { destination: Relative(4), source: Relative(10) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(2), rhs: Direct(32837) }, JumpIf { condition: Relative(1), location: 1795 }, Call { location: 4052 }, Return, Call { location: 188 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32845) }, Mov { destination: Relative(10), source: Direct(32846) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32849) }, Mov { destination: Relative(10), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32852) }, Mov { destination: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 1865 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(4) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4055 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(6), source: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 4338 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(10) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1891 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1902 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Direct(32838) }, Mov { destination: Relative(13), source: Direct(32844) }, Mov { destination: Relative(14), source: Direct(32904) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4370 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1920 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4514 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4338 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(14) }, Load { destination: Relative(1), source_pointer: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1946 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(11) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1957 }, Call { location: 938 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32905) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4370 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(11), source_pointer: Relative(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(16) }, Mov { destination: Relative(12), source: Relative(17) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(12) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5097 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(15) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 1993 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2004 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32906) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 5166 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(4) }, Store { destination_pointer: Relative(14), source: Direct(32845) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32849) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32852) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 5310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(16) }, JumpIf { condition: Relative(4), location: 2037 }, Call { location: 5342 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(4) }, Store { destination_pointer: Relative(7), source: Direct(32846) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32851) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(11) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 5310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, JumpIf { condition: Relative(4), location: 2058 }, Call { location: 5345 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(4) }, Store { destination_pointer: Relative(7), source: Direct(32845) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32846) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32849) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32851) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32852) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 5348 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, JumpIf { condition: Relative(4), location: 2085 }, Call { location: 5390 }, Return, Call { location: 188 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32845) }, Mov { destination: Relative(10), source: Direct(32846) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32849) }, Mov { destination: Relative(10), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32852) }, Mov { destination: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32885) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5393 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32887) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5510 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 2173 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4055 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4338 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(10) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2199 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2210 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Direct(32838) }, Mov { destination: Relative(16), source: Direct(32844) }, Mov { destination: Relative(17), source: Direct(32891) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4370 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2228 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 4514 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(16) }, Mov { destination: Relative(13), source: Relative(17) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(13) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 4338 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 2254 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2265 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 4370 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2283 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 15 }, Const { destination: Relative(14), bit_size: Field, value: 33 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Direct(32850) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 5310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(14), source: Relative(18) }, Const { destination: Relative(15), bit_size: Integer(U8), value: 71 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(17) }, Store { destination_pointer: Relative(18), source: Relative(15) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32876) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32893) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32893) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32876) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32893) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32874) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32879) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32883) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32901) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32894) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32865) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32902) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32883) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32901) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32894) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32903) }, JumpIf { condition: Relative(14), location: 2417 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 44 }, Mov { destination: Relative(17), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 44 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, Mov { destination: Relative(18), source: Relative(17) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U64), value: 2386996775688025706 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 39 }, Mov { destination: Direct(32771), source: Relative(19) }, Mov { destination: Direct(32772), source: Relative(18) }, Mov { destination: Direct(32773), source: Relative(20) }, Call { location: 23 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 39 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(19) }, Store { destination_pointer: Relative(18), source: Direct(32842) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(19) }, Mov { destination: Direct(32772), source: Relative(18) }, Mov { destination: Direct(32773), source: Relative(20) }, Call { location: 23 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(19) }, Trap { revert_data: HeapVector { pointer: Relative(17), size: Relative(15) } }, Const { destination: Relative(10), bit_size: Field, value: 35 }, Const { destination: Relative(14), bit_size: Field, value: 65 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(10) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(4) }, Mov { destination: Relative(18), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 5310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(17) }, JumpIf { condition: Relative(5), location: 2440 }, Call { location: 5345 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32895) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5655 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(15) }, Mov { destination: Relative(5), source: Relative(16) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5097 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(15) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 2476 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2487 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32899) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 5166 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(1), bit_size: Field, value: 70 }, Const { destination: Relative(4), bit_size: Field, value: 66 }, Const { destination: Relative(10), bit_size: Field, value: 130 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(15) }, Store { destination_pointer: Relative(16), source: Direct(32853) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32855) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32855) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(10) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5348 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(16) }, JumpIf { condition: Relative(1), location: 2529 }, Call { location: 5390 }, Return, Call { location: 188 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32853) }, Mov { destination: Relative(10), source: Direct(32858) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 2578 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(6), location: 2584 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 2591 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(5) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(32842) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 5760 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2618 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(4), location: 2624 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2641 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(6), location: 2647 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2653 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32843) }, Mov { destination: Relative(16), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(11), source_pointer: Relative(4) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2673 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(4), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 2680 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(1) }, Mov { destination: Relative(17), source: Direct(32843) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(11), source_pointer: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2697 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(11), location: 2703 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2709 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32843) }, Mov { destination: Relative(19), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Field, value: 4 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32846) }, Mov { destination: Relative(19), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32849) }, Mov { destination: Relative(19), source: Direct(32850) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 2750 }, Call { location: 938 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(14) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 2756 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(3) }, Mov { destination: Relative(19), source: Relative(1) }, Mov { destination: Relative(20), source: Direct(32846) }, Mov { destination: Relative(21), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(4) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 2774 }, Call { location: 938 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(14) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 2780 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(2) }, Mov { destination: Relative(19), source: Relative(3) }, Mov { destination: Relative(20), source: Relative(1) }, Mov { destination: Relative(21), source: Direct(32843) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(4) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 2797 }, Call { location: 938 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, JumpIf { condition: Relative(14), location: 2803 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(14) }, Store { destination_pointer: Relative(18), source: Direct(32902) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32883) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32877) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32865) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32897) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32894) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32880) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32877) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32880) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32893) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32859) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32900) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32877) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32881) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32865) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32863) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32862) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32903) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), MemoryAddress(Direct(32842)), HeapArray(HeapArray { pointer: Relative(14), size: 37 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Simple(Integer(U32)), Array { value_types: [Simple(Integer(U8))], size: 37 }, Simple(Integer(U1))] }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 2890 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(2) }, Mov { destination: Relative(20), source: Relative(3) }, Mov { destination: Relative(21), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3735 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 2908 }, Call { location: 938 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(18), location: 2914 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(18) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 2921 }, Call { location: 938 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 23 }, Mov { destination: Relative(23), source: Direct(0) }, Mov { destination: Relative(24), source: Relative(5) }, Mov { destination: Relative(25), source: Relative(4) }, Mov { destination: Relative(26), source: Direct(32838) }, Mov { destination: Relative(27), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(22) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(18), source: Relative(24) }, Mov { destination: Relative(21), source: Relative(25) }, JumpIf { condition: Relative(18), location: 3049 }, Jump { location: 2936 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 55 }, Const { destination: Relative(5), bit_size: Integer(U8), value: 33 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32871) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32889) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32898) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32874) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32884) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32897) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32879) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32889) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32893) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32883) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32901) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 57 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32902) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32883) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32882) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32888) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32877) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32865) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32894) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32896) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32893) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32882) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32888) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32859) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32884) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32888) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32896) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32881) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32865) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32861) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32903) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(4), size: 19 }), HeapArray(HeapArray { pointer: Relative(7), size: 29 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 19 }, Array { value_types: [Simple(Integer(U8))], size: 29 }, Simple(Integer(U1))] }, Jump { location: 3075 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3058 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, JumpIf { condition: Relative(7), location: 3074 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 3075 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3084 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 5783 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3100 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32869) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 5655 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32870) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 5393 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32872) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 5510 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Direct(32855) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3872 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32839) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Const { destination: Relative(7), bit_size: Integer(U64), value: 2 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32843) }, Mov { destination: Relative(16), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6121 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(10), bit_size: Integer(U64), value: 4 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32846) }, Mov { destination: Relative(17), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 6121 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Direct(32846) }, Mov { destination: Relative(17), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 6121 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Direct(32843) }, Mov { destination: Relative(16), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6121 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(7) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6315 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(12) }, JumpIf { condition: Relative(4), location: 3268 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, Return, Call { location: 188 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 6414 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3287 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 6532 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 3305 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Mov { destination: Relative(6), source: Direct(32838) }, Jump { location: 3309 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 3312 }, Jump { location: 3462 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 3320 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(6), rhs: Relative(6) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 3330 }, BinaryIntOp { destination: Relative(16), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 3330 }, Call { location: 6568 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 3334 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(13), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 3339 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 3345 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32847) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(13) }, Mov { destination: Relative(16), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(15) }, Mov { destination: Relative(19), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(18) }, Mov { destination: Relative(20), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32837) }, Not { destination: Relative(21), source: Relative(13), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Or, bit_size: U1, lhs: Relative(18), rhs: Relative(21) }, JumpIf { condition: Relative(13), location: 3389 }, Jump { location: 3384 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 3387 }, Jump { location: 3401 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Jump { location: 3401 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(15), location: 3395 }, Call { location: 6571 }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 3401 }, Load { destination: Relative(12), source_pointer: Relative(20) }, JumpIf { condition: Relative(12), location: 3407 }, Jump { location: 3404 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 3309 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(9) }, Mov { destination: Relative(22), source: Relative(16) }, Mov { destination: Relative(23), source: Relative(19) }, Mov { destination: Relative(24), source: Relative(17) }, Mov { destination: Relative(25), source: Relative(4) }, Mov { destination: Relative(26), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 6577 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(16) }, Load { destination: Relative(6), source_pointer: Relative(19) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, JumpIf { condition: Relative(13), location: 3428 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(10) }, Call { location: 6591 }, Mov { destination: Relative(11), source: Direct(32772) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(4) }, Mov { destination: Direct(32771), source: Relative(11) }, Call { location: 6591 }, Mov { destination: Relative(4), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(4) }, Call { location: 6591 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 6591 }, Mov { destination: Relative(5), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(12) }, Jump { location: 3462 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 4105629585450304037 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3479 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6532 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(12) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(3) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3497 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 3501 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 3504 }, Jump { location: 3569 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3510 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, JumpIf { condition: Relative(10), location: 3520 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 3520 }, Call { location: 6568 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 3524 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(3), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 3529 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(3), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(10), location: 3535 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(3), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(10), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(3) }, JumpIf { condition: Relative(10), location: 3559 }, Jump { location: 3563 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(12), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 3566 }, Jump { location: 3562 }, Jump { location: 3563 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(3) }, Jump { location: 3501 }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 3569 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12632160011611521689 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3585 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 6532 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3603 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 3607 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 3610 }, Jump { location: 3722 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3618 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 3628 }, BinaryIntOp { destination: Relative(15), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, JumpIf { condition: Relative(14), location: 3628 }, Call { location: 6568 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 3632 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(10), op: Div, bit_size: U32, lhs: Relative(12), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 3637 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(12), rhs: Relative(14) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, JumpIf { condition: Relative(12), location: 3643 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(10), rhs: Direct(32847) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Not { destination: Relative(8), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 3667 }, Jump { location: 3671 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(14), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 3674 }, Jump { location: 3670 }, Jump { location: 3671 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 3607 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 3680 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(5) }, Call { location: 6591 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 6591 }, Mov { destination: Relative(5), source: Direct(32772) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, Store { destination_pointer: Relative(9), source: Relative(14) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(5) }, Call { location: 6591 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 6591 }, Mov { destination: Relative(7), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 3717 }, Call { location: 6617 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Jump { location: 3722 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 8082322909743101849 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 11665340019033496436 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 13674703438729013973 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 1359149291226868540 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Direct(32842) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 8591465503772373437 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3777 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3785 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 3790 }, Jump { location: 3805 }, Store { destination_pointer: Relative(7), source: Direct(32841) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3797 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 3801 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(8), location: 3807 }, Jump { location: 3804 }, Jump { location: 3805 }, Load { destination: Relative(1), source_pointer: Relative(7) }, Return, JumpIf { condition: Relative(8), location: 3809 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Not { destination: Relative(13), source: Relative(8), bit_size: U1 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U1, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 3835 }, Jump { location: 3863 }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3841 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(15) }, Mov { destination: Relative(10), source: Relative(16) }, JumpIf { condition: Relative(8), location: 3858 }, Jump { location: 3856 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 3863 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(8), location: 3863 }, Jump { location: 3861 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 3863 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(8) }, Jump { location: 3801 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 6665645948190457319 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14241324264716156348 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3881 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(4), rhs: Direct(32855) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(4), rhs: Direct(32891) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32892) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Direct(32904) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32905) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 3890 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 3894 }, Jump { location: 3893 }, Return, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(13), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 3899 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32847) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(9) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32844) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Load { destination: Relative(19), source_pointer: Relative(21) }, Not { destination: Relative(13), source: Relative(19), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(14) }, JumpIf { condition: Relative(17), location: 3923 }, Jump { location: 4046 }, JumpIf { condition: Relative(7), location: 3989 }, Jump { location: 3925 }, JumpIf { condition: Relative(8), location: 3977 }, Jump { location: 3927 }, JumpIf { condition: Relative(10), location: 3965 }, Jump { location: 3929 }, JumpIf { condition: Relative(11), location: 3953 }, Jump { location: 3931 }, JumpIf { condition: Relative(12), location: 3941 }, Jump { location: 3933 }, BinaryFieldOp { destination: Relative(22), op: Equals, lhs: Relative(4), rhs: Direct(32907) }, JumpIf { condition: Relative(22), location: 3937 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(23) } }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(16), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(23), op: Equals, lhs: Relative(22), rhs: Direct(32864) }, Mov { destination: Relative(21), source: Relative(23) }, Jump { location: 3951 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 24 }, Mov { destination: Relative(24), source: Direct(0) }, Mov { destination: Relative(25), source: Relative(16) }, Mov { destination: Relative(26), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(23) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(22), source: Relative(25) }, Mov { destination: Relative(21), source: Relative(22) }, Jump { location: 3951 }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 3963 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 23 }, Mov { destination: Relative(23), source: Direct(0) }, Mov { destination: Relative(24), source: Relative(16) }, Mov { destination: Relative(25), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(22) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(21), source: Relative(24) }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 3963 }, Mov { destination: Relative(19), source: Relative(20) }, Jump { location: 3975 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 22 }, Mov { destination: Relative(22), source: Direct(0) }, Mov { destination: Relative(23), source: Relative(16) }, Mov { destination: Relative(24), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(21) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(20), source: Relative(23) }, Mov { destination: Relative(19), source: Relative(20) }, Jump { location: 3975 }, Mov { destination: Relative(17), source: Relative(19) }, Jump { location: 3987 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(16) }, Mov { destination: Relative(23), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(19), source: Relative(22) }, Mov { destination: Relative(17), source: Relative(19) }, Jump { location: 3987 }, Mov { destination: Relative(13), source: Relative(17) }, Jump { location: 3996 }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(16), rhs: Direct(32840) }, Not { destination: Relative(19), source: Relative(17), bit_size: U1 }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(18), rhs: Direct(32840) }, Not { destination: Relative(20), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(19), rhs: Relative(20) }, Mov { destination: Relative(13), source: Relative(17) }, Jump { location: 3996 }, JumpIf { condition: Relative(13), location: 4046 }, Jump { location: 3998 }, Load { destination: Relative(13), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(17), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(19), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(13) }, JumpIf { condition: Relative(19), location: 4003 }, Call { location: 6617 }, Load { destination: Relative(13), source_pointer: Relative(1) }, Load { destination: Relative(19), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(17) }, Load { destination: Relative(13), source_pointer: Relative(1) }, Load { destination: Relative(17), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(13) }, JumpIf { condition: Relative(20), location: 4012 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(19) }, Call { location: 6591 }, Mov { destination: Relative(20), source: Direct(32772) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(22) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(22), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(20) }, Call { location: 6591 }, Mov { destination: Relative(9), source: Direct(32772) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(15) }, Store { destination_pointer: Relative(19), source: Relative(16) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(9) }, Call { location: 6591 }, Mov { destination: Relative(15), source: Direct(32772) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Store { destination_pointer: Relative(19), source: Relative(18) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(15) }, Call { location: 6591 }, Mov { destination: Relative(14), source: Direct(32772) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(9) }, Store { destination_pointer: Relative(18), source: Direct(32841) }, Store { destination_pointer: Relative(1), source: Relative(13) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(17) }, Jump { location: 4046 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(9) }, Jump { location: 3890 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16986922238178214607 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 15583592523844085222 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4080 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4084 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 4294 }, Jump { location: 4087 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 4095 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 80 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32901) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4266 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 4292 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 83 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 6693878053340631133 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 79 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 79 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 4296 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 4315 }, Jump { location: 4335 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4323 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 1 }, Call { location: 6624 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Jump { location: 4335 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4084 }, Call { location: 188 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 4345 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(3), location: 4351 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32847) }, Load { destination: Relative(3), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32848) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Call { location: 188 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 4395 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 4398 }, Jump { location: 4513 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4406 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, JumpIf { condition: Relative(7), location: 4512 }, Jump { location: 4411 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4419 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6680 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 4436 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 4444 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(13), location: 4510 }, Jump { location: 4448 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(11) }, Mov { destination: Relative(16), source: Relative(12) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 6717 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 4464 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 4470 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(15), source: Direct(32773) }, Mov { destination: Relative(16), source: Direct(32774) }, Store { destination_pointer: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Direct(32838), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 4484 }, Jump { location: 4508 }, Load { destination: Relative(8), source_pointer: Relative(15) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4490 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 4496 }, Call { location: 6617 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(12), source: Direct(32774) }, Store { destination_pointer: Relative(12), source: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Jump { location: 4508 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 4395 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 4395 }, Jump { location: 4513 }, Return, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4539 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4543 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 4757 }, Jump { location: 4546 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 4554 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4729 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 4755 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 85 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 85 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9965974553718638037 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 81 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 81 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 4759 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 4778 }, Jump { location: 4798 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4786 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 1 }, Call { location: 6624 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Jump { location: 4798 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4543 }, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4826 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4830 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 5046 }, Jump { location: 4833 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 4841 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 5018 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 5044 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 5048 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(13) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 5072 }, Jump { location: 5094 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5080 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(13), source: Direct(32773) }, Mov { destination: Relative(14), source: Direct(32774) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 5094 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4830 }, Call { location: 188 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 5104 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 5110 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(4) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 5132 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(1), location: 5137 }, Jump { location: 5135 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, BinaryIntOp { destination: Relative(1), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 5132 }, Call { location: 188 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 5191 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 5194 }, Jump { location: 5309 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5202 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, JumpIf { condition: Relative(7), location: 5308 }, Jump { location: 5207 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5215 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6680 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5232 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 5240 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(13), location: 5306 }, Jump { location: 5244 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(11) }, Mov { destination: Relative(16), source: Relative(12) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 6906 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 5260 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 5266 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(15), source: Direct(32773) }, Mov { destination: Relative(16), source: Direct(32774) }, Store { destination_pointer: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Direct(32838), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 5280 }, Jump { location: 5304 }, Load { destination: Relative(8), source_pointer: Relative(15) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5286 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 5292 }, Call { location: 6617 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(12), source: Direct(32774) }, Store { destination_pointer: Relative(12), source: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Jump { location: 5304 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 5191 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 5191 }, Jump { location: 5309 }, Return, Call { location: 188 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5320 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 5324 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 5329 }, Jump { location: 5327 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 5324 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16291778408346427203 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 3078107792722303059 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5358 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 5362 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 5367 }, Jump { location: 5365 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(7), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(9), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 5362 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 10951819287827820458 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 5403 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32842) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32870) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Direct(32872) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(4), rhs: Direct(32885) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 5449 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 5459 }, Jump { location: 5452 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Return, JumpIf { condition: Relative(10), location: 5461 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(17) }, Load { destination: Relative(10), source_pointer: Relative(19) }, JumpIf { condition: Relative(12), location: 5494 }, Jump { location: 5473 }, JumpIf { condition: Relative(13), location: 5489 }, Jump { location: 5475 }, JumpIf { condition: Relative(14), location: 5484 }, Jump { location: 5477 }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(4), rhs: Direct(32887) }, JumpIf { condition: Relative(19), location: 5481 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(16), rhs: Direct(32849) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 5487 }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(16), rhs: Direct(32846) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 5487 }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 5492 }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(16), rhs: Direct(32908) }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 5492 }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 5497 }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Relative(16), rhs: Direct(32845) }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 5497 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Relative(8) }, Mov { destination: Relative(20), source: Relative(6) }, Mov { destination: Relative(21), source: Relative(15) }, Mov { destination: Relative(22), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(10) }, Jump { location: 5449 }, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5519 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(4), rhs: Direct(32870) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(4), rhs: Direct(32872) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32885) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 5526 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 5530 }, Jump { location: 5529 }, Return, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(11), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 5535 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32847) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Relative(18), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(16) }, Mov { destination: Relative(19), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Not { destination: Relative(20), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(20), rhs: Relative(12) }, JumpIf { condition: Relative(17), location: 5571 }, Jump { location: 5652 }, JumpIf { condition: Relative(7), location: 5594 }, Jump { location: 5573 }, JumpIf { condition: Relative(8), location: 5589 }, Jump { location: 5575 }, JumpIf { condition: Relative(10), location: 5584 }, Jump { location: 5577 }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(4), rhs: Direct(32887) }, JumpIf { condition: Relative(21), location: 5581 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(22) } }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(16), rhs: Direct(32849) }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 5587 }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(16), rhs: Direct(32846) }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 5587 }, Mov { destination: Relative(17), source: Relative(20) }, Jump { location: 5592 }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Relative(16), rhs: Direct(32908) }, Mov { destination: Relative(17), source: Relative(20) }, Jump { location: 5592 }, Mov { destination: Relative(12), source: Relative(17) }, Jump { location: 5597 }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Relative(16), rhs: Direct(32845) }, Mov { destination: Relative(12), source: Relative(17) }, Jump { location: 5597 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(11) }, Mov { destination: Relative(22), source: Relative(15) }, Mov { destination: Relative(23), source: Relative(18) }, Mov { destination: Relative(24), source: Relative(19) }, Mov { destination: Relative(25), source: Relative(14) }, Mov { destination: Relative(26), source: Relative(12) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 6577 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(12), source_pointer: Relative(11) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(18) }, Load { destination: Relative(15), source_pointer: Relative(19) }, Load { destination: Relative(16), source_pointer: Relative(1) }, Load { destination: Relative(17), source_pointer: Relative(2) }, Load { destination: Relative(18), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(16) }, JumpIf { condition: Relative(19), location: 5618 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(17) }, Call { location: 6591 }, Mov { destination: Relative(19), source: Direct(32772) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(9) }, Store { destination_pointer: Relative(21), source: Relative(12) }, Mov { destination: Direct(32771), source: Relative(19) }, Call { location: 6591 }, Mov { destination: Relative(9), source: Direct(32772) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(9) }, Call { location: 6591 }, Mov { destination: Relative(12), source: Direct(32772) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Store { destination_pointer: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(12) }, Call { location: 6591 }, Mov { destination: Relative(11), source: Direct(32772) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Store { destination_pointer: Relative(14), source: Relative(15) }, Store { destination_pointer: Relative(1), source: Relative(16) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(18) }, Jump { location: 5652 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(9) }, Jump { location: 5526 }, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 5665 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32842) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32869) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 5709 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 5719 }, Jump { location: 5712 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Return, JumpIf { condition: Relative(10), location: 5721 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(16) }, Load { destination: Relative(10), source_pointer: Relative(18) }, JumpIf { condition: Relative(12), location: 5742 }, Jump { location: 5733 }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(4), rhs: Direct(32895) }, JumpIf { condition: Relative(16), location: 5737 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(17) } }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(15), rhs: Direct(32845) }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(10), rhs: Direct(32845) }, Mov { destination: Relative(13), source: Relative(16) }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 5747 }, BinaryFieldOp { destination: Relative(16), op: Add, lhs: Relative(15), rhs: Direct(32843) }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(10), rhs: Direct(32845) }, Mov { destination: Relative(13), source: Relative(16) }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 5747 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Relative(13) }, Mov { destination: Relative(20), source: Relative(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(10) }, Jump { location: 5709 }, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Relative(2) }, Mov { destination: Relative(10), source: Relative(3) }, Mov { destination: Relative(11), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(8) }, Mov { destination: Relative(5), source: Relative(9) }, JumpIf { condition: Relative(4), location: 5774 }, Jump { location: 5782 }, JumpIf { condition: Relative(4), location: 5777 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(5), rhs: Direct(32858) }, JumpIf { condition: Relative(1), location: 5781 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Jump { location: 5782 }, Return, Call { location: 188 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5790 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(7), source: Relative(11) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5808 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U8), value: 45 }, Const { destination: Relative(10), bit_size: Integer(U8), value: 62 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Direct(32902) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32901) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32903) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32902) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32898) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32874) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32884) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32897) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32903) }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(10) }, Store { destination_pointer: Relative(12), source: Direct(32902) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32883) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32882) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32888) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32877) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32865) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32882) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32878) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32884) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32877) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32903) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5892 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 5896 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(6), location: 6082 }, Jump { location: 5899 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5905 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 4055 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(13) }, Mov { destination: Relative(7), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 5923 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5931 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 5935 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 6034 }, Jump { location: 5938 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4514 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(6), source: Relative(11) }, Const { destination: Relative(1), bit_size: Integer(U8), value: 70 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(3) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, Load { destination: Relative(1), source_pointer: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5998 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(1) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 6002 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(1), location: 6006 }, Jump { location: 6005 }, Return, JumpIf { condition: Relative(1), location: 6008 }, Call { location: 6574 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6018 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(8) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6026 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(3), size: 19 }), MemoryAddress(Direct(32842)), MemoryAddress(Relative(1)), HeapArray(HeapArray { pointer: Relative(10), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 19 }, Simple(Integer(U32)), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(1) }, Jump { location: 6002 }, JumpIf { condition: Relative(6), location: 6036 }, Call { location: 6574 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 6046 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(3) }, Mov { destination: Relative(18), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(15) }, Mov { destination: Relative(12), source: Relative(16) }, Load { destination: Relative(13), source_pointer: Relative(11) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 6065 }, Call { location: 938 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(8) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 6073 }, Call { location: 938 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(13), size: 16 }), MemoryAddress(Direct(32844)), MemoryAddress(Relative(6)), MemoryAddress(Relative(12)), HeapArray(HeapArray { pointer: Relative(16), size: 16 }), HeapArray(HeapArray { pointer: Relative(17), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 5935 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 6085 }, Jump { location: 6118 }, JumpIf { condition: Relative(6), location: 6087 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Load { destination: Relative(9), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6103 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 6111 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(10), size: 16 }), MemoryAddress(Direct(32844)), MemoryAddress(Relative(9)), MemoryAddress(Relative(6)), HeapArray(HeapArray { pointer: Relative(14), size: 16 }), HeapArray(HeapArray { pointer: Relative(15), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, Jump { location: 6118 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 5896 }, Call { location: 188 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 7070 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 6139 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 7188 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6157 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Mov { destination: Relative(6), source: Direct(32838) }, Jump { location: 6161 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 6164 }, Jump { location: 6314 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6172 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(6), rhs: Relative(6) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 6182 }, BinaryIntOp { destination: Relative(16), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 6182 }, Call { location: 6568 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 6186 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(13), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 6191 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 6197 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32847) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(13) }, Mov { destination: Relative(16), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(15) }, Mov { destination: Relative(19), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(18) }, Mov { destination: Relative(20), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32837) }, Not { destination: Relative(21), source: Relative(13), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Or, bit_size: U1, lhs: Relative(18), rhs: Relative(21) }, JumpIf { condition: Relative(13), location: 6241 }, Jump { location: 6236 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 6239 }, Jump { location: 6253 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Jump { location: 6253 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(15), location: 6247 }, Call { location: 6571 }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 6253 }, Load { destination: Relative(12), source_pointer: Relative(20) }, JumpIf { condition: Relative(12), location: 6259 }, Jump { location: 6256 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 6161 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(9) }, Mov { destination: Relative(22), source: Relative(16) }, Mov { destination: Relative(23), source: Relative(19) }, Mov { destination: Relative(24), source: Relative(17) }, Mov { destination: Relative(25), source: Relative(4) }, Mov { destination: Relative(26), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 7224 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(16) }, Load { destination: Relative(6), source_pointer: Relative(19) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, JumpIf { condition: Relative(13), location: 6280 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(10) }, Call { location: 6591 }, Mov { destination: Relative(11), source: Direct(32772) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(4) }, Mov { destination: Direct(32771), source: Relative(11) }, Call { location: 6591 }, Mov { destination: Relative(4), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(4) }, Call { location: 6591 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 6591 }, Mov { destination: Relative(5), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(12) }, Jump { location: 6314 }, Return, Call { location: 188 }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6325 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 6333 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 6338 }, Jump { location: 6353 }, Store { destination_pointer: Relative(7), source: Direct(32841) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6345 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 6349 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(8), location: 6355 }, Jump { location: 6352 }, Jump { location: 6353 }, Load { destination: Relative(1), source_pointer: Relative(7) }, Return, JumpIf { condition: Relative(8), location: 6357 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Not { destination: Relative(13), source: Relative(8), bit_size: U1 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U1, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 6383 }, Jump { location: 6411 }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6389 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 7234 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(15) }, Mov { destination: Relative(10), source: Relative(16) }, JumpIf { condition: Relative(8), location: 6406 }, Jump { location: 6404 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 6411 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(8), location: 6411 }, Jump { location: 6409 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 6411 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(8) }, Jump { location: 6349 }, Call { location: 188 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 6423 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 6429 }, Call { location: 6571 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6436 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(4), op: Div, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 6531 }, Jump { location: 6442 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6450 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Div, bit_size: U32, lhs: Relative(7), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, JumpIf { condition: Relative(9), location: 6457 }, Call { location: 6568 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 7340 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(10), source: Relative(15) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(11) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(6) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 6482 }, Call { location: 938 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(12) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(17) }, Mov { destination: Relative(14), source: Relative(18) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 6496 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(12) }, JumpIf { condition: Relative(5), location: 6506 }, Jump { location: 6499 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(9) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Jump { location: 6531 }, JumpIf { condition: Relative(5), location: 6508 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(5), source_pointer: Relative(13) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(6) }, Mov { destination: Relative(20), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 6496 }, Return, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 6553 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Direct(32842) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 7396 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Cast { destination: Relative(7), source: Relative(4), bit_size: Integer(U32) }, Cast { destination: Relative(5), source: Relative(7), bit_size: Field }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(4) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 7233212735005103307 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Load { destination: Relative(7), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Direct(32841) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Return, Load { destination: Direct(32773), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32774), op: Equals, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, JumpIf { condition: Direct(32774), location: 6595 }, Jump { location: 6597 }, Mov { destination: Direct(32772), source: Direct(32771) }, Jump { location: 6616 }, Const { destination: Direct(32776), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32775) }, Const { destination: Direct(32776), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32775), rhs: Direct(32776) }, Mov { destination: Direct(32772), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32775) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32775) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32772) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 6614 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 6607 }, IndirectConst { destination_pointer: Direct(32772), bit_size: Integer(U32), value: 1 }, Jump { location: 6616 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, BinaryFieldOp { destination: Relative(3), op: LessThan, lhs: Relative(1), rhs: Relative(2) }, Mov { destination: Relative(1), source: Relative(3) }, Return, Load { destination: Direct(32775), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32776), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Load { destination: Direct(32777), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32780), op: LessThanEquals, bit_size: U32, lhs: Direct(32779), rhs: Direct(32777) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32775), rhs: Direct(2) }, JumpIf { condition: Direct(32780), location: 6635 }, Jump { location: 6652 }, JumpIf { condition: Direct(32781), location: 6637 }, Jump { location: 6641 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, Jump { location: 6651 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(32783) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32782) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32777) }, Jump { location: 6651 }, Jump { location: 6664 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32782), op: Mul, bit_size: U32, lhs: Direct(32779), rhs: Direct(32783) }, Const { destination: Direct(32784), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(32784) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32783) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32779) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32782) }, Jump { location: 6664 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, JumpIf { condition: Direct(32781), location: 6678 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(32776) }, Mov { destination: Direct(32784), source: Direct(32778) }, Mov { destination: Direct(32785), source: Direct(32780) }, BinaryIntOp { destination: Direct(32786), op: Equals, bit_size: U32, lhs: Direct(32784), rhs: Direct(32783) }, JumpIf { condition: Direct(32786), location: 6678 }, Load { destination: Direct(32782), source_pointer: Direct(32784) }, Store { destination_pointer: Direct(32785), source: Direct(32782) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32785), op: Add, bit_size: U32, lhs: Direct(32785), rhs: Direct(2) }, Jump { location: 6671 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(32776) }, Return, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32775), source_pointer: Direct(32775) }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32775), rhs: Direct(32772) }, Load { destination: Direct(32777), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Const { destination: Direct(32780), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32780) }, JumpIf { condition: Direct(32778), location: 6689 }, Jump { location: 6693 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Jump { location: 6715 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32781) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32780) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Mov { destination: Direct(32783), source: Direct(32779) }, Mov { destination: Direct(32784), source: Direct(32780) }, BinaryIntOp { destination: Direct(32785), op: Equals, bit_size: U32, lhs: Direct(32783), rhs: Direct(32782) }, JumpIf { condition: Direct(32785), location: 6714 }, Load { destination: Direct(32781), source_pointer: Direct(32783) }, Store { destination_pointer: Direct(32784), source: Direct(32781) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, Jump { location: 6707 }, Jump { location: 6715 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Return, Call { location: 188 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(4), rhs: Direct(32855) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(4), rhs: Direct(32891) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32892) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Direct(32904) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32905) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 6729 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 6762 }, Jump { location: 6732 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(4), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 6737 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(8) }, JumpIf { condition: Relative(7), location: 6742 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(3) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Mov { destination: Relative(1), source: Relative(4) }, Return, Load { destination: Relative(13), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(14), location: 6766 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, Load { destination: Relative(14), source_pointer: Relative(16) }, JumpIf { condition: Relative(7), location: 6771 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(3) }, Load { destination: Relative(15), source_pointer: Relative(17) }, JumpIf { condition: Relative(8), location: 6840 }, Jump { location: 6776 }, JumpIf { condition: Relative(9), location: 6828 }, Jump { location: 6778 }, JumpIf { condition: Relative(10), location: 6816 }, Jump { location: 6780 }, JumpIf { condition: Relative(11), location: 6804 }, Jump { location: 6782 }, JumpIf { condition: Relative(12), location: 6792 }, Jump { location: 6784 }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(4), rhs: Direct(32907) }, JumpIf { condition: Relative(19), location: 6788 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(19), rhs: Direct(32864) }, Mov { destination: Relative(18), source: Relative(14) }, Jump { location: 6802 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(14) }, Mov { destination: Relative(23), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(19), source: Relative(22) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 6802 }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 6814 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(14) }, Mov { destination: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(19) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(18), source: Relative(21) }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 6814 }, Mov { destination: Relative(16), source: Relative(17) }, Jump { location: 6826 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(14) }, Mov { destination: Relative(21), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(18) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(17), source: Relative(20) }, Mov { destination: Relative(16), source: Relative(17) }, Jump { location: 6826 }, Mov { destination: Relative(13), source: Relative(16) }, Jump { location: 6838 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(14) }, Mov { destination: Relative(20), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(17) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(16), source: Relative(19) }, Mov { destination: Relative(13), source: Relative(16) }, Jump { location: 6838 }, Mov { destination: Relative(2), source: Relative(13) }, Jump { location: 6847 }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(14), rhs: Direct(32840) }, Not { destination: Relative(14), source: Relative(13), bit_size: U1 }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(15), rhs: Direct(32840) }, Not { destination: Relative(15), source: Relative(13), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U1, lhs: Relative(14), rhs: Relative(15) }, Mov { destination: Relative(2), source: Relative(13) }, Jump { location: 6847 }, JumpIf { condition: Relative(2), location: 6849 }, Jump { location: 6881 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(13), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32836) }, JumpIf { condition: Relative(14), location: 6854 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(5) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(13) }, Store { destination_pointer: Relative(18), source: Relative(15) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Store { destination_pointer: Relative(1), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, JumpIf { condition: Relative(14), location: 6879 }, Call { location: 6571 }, Store { destination_pointer: Relative(6), source: Relative(2) }, Jump { location: 6881 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 6729 }, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 6888 }, Jump { location: 6890 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 6905 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 6902 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 6895 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 6905 }, Return, Call { location: 188 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32899) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 6916 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 6971 }, Jump { location: 6919 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(3), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 6924 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(12) }, JumpIf { condition: Relative(7), location: 6934 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, Store { destination_pointer: Relative(14), source: Relative(7) }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(11) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Mov { destination: Relative(1), source: Relative(3) }, Return, Load { destination: Relative(11), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(12), location: 6975 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, JumpIf { condition: Relative(7), location: 6982 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(8) }, Load { destination: Relative(15), source_pointer: Relative(17) }, JumpIf { condition: Relative(10), location: 7001 }, Jump { location: 6987 }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Direct(32906) }, JumpIf { condition: Relative(11), location: 6991 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(13) }, Mov { destination: Relative(19), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(18) }, Mov { destination: Relative(2), source: Relative(11) }, Jump { location: 7011 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(13) }, Mov { destination: Relative(19), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(18) }, Mov { destination: Relative(2), source: Relative(11) }, Jump { location: 7011 }, JumpIf { condition: Relative(2), location: 7013 }, Jump { location: 7067 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(11), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Direct(32836) }, JumpIf { condition: Relative(13), location: 7018 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(12) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(14) }, Load { destination: Relative(19), source_pointer: Relative(21) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(13) }, Store { destination_pointer: Relative(22), source: Relative(18) }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(16) }, Store { destination_pointer: Relative(18), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, Store { destination_pointer: Relative(18), source: Relative(15) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(17) }, Store { destination_pointer: Relative(1), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, JumpIf { condition: Relative(12), location: 7065 }, Call { location: 6571 }, Store { destination_pointer: Relative(6), source: Relative(2) }, Jump { location: 7067 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 6916 }, Call { location: 188 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7079 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 7085 }, Call { location: 6571 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7092 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(4), op: Div, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 7187 }, Jump { location: 7098 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7106 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Div, bit_size: U32, lhs: Relative(7), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, JumpIf { condition: Relative(9), location: 7113 }, Call { location: 6568 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 7473 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(10), source: Relative(15) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(11) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(6) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 7138 }, Call { location: 938 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(12) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 7529 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(17) }, Mov { destination: Relative(14), source: Relative(18) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 7152 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(12) }, JumpIf { condition: Relative(5), location: 7162 }, Jump { location: 7155 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(9) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Jump { location: 7187 }, JumpIf { condition: Relative(5), location: 7164 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(5), source_pointer: Relative(13) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(6) }, Mov { destination: Relative(20), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 6121 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 7152 }, Return, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 7209 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Direct(32842) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 7396 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Cast { destination: Relative(7), source: Relative(4), bit_size: Integer(U32) }, Cast { destination: Relative(5), source: Relative(7), bit_size: Field }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(4) }, Return, Call { location: 188 }, Load { destination: Relative(7), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Direct(32841) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Return, Call { location: 188 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32839) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7247 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 7188 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(12) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(3) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 7265 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 7269 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 7272 }, Jump { location: 7337 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7278 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, JumpIf { condition: Relative(10), location: 7288 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 7288 }, Call { location: 6568 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 7292 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(3), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 7297 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(3), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(10), location: 7303 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(3), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(10), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(3) }, JumpIf { condition: Relative(10), location: 7327 }, Jump { location: 7331 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(12), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 7334 }, Jump { location: 7330 }, Jump { location: 7331 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(3) }, Jump { location: 7269 }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 7337 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Return, Call { location: 188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 7361 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 7368 }, Jump { location: 7364 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Load { destination: Relative(2), source_pointer: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Return, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7376 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6624 }, Mov { destination: Relative(9), source: Direct(32773) }, Mov { destination: Relative(10), source: Direct(32774) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Store { destination_pointer: Relative(5), source: Relative(9) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(3) }, Jump { location: 7361 }, Call { location: 188 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 7403 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Cast { destination: Relative(4), source: Relative(1), bit_size: Field }, Const { destination: Relative(6), bit_size: Field, value: 18446744073709551616 }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(4), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 7825 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(6), source: Relative(13) }, Mov { destination: Relative(8), source: Relative(14) }, Mov { destination: Relative(9), source: Relative(15) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 7436 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 7440 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 7454 }, Jump { location: 7443 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 7855 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(10) }, Return, JumpIf { condition: Relative(5), location: 7456 }, Call { location: 6574 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(8) }, Mov { destination: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7880 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 7440 }, Call { location: 188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 7494 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 7501 }, Jump { location: 7497 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Load { destination: Relative(2), source_pointer: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Return, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7509 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6624 }, Mov { destination: Relative(9), source: Direct(32773) }, Mov { destination: Relative(10), source: Direct(32774) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32839) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Store { destination_pointer: Relative(5), source: Relative(9) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(3) }, Jump { location: 7494 }, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7554 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 7558 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 7774 }, Jump { location: 7561 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 7569 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7746 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 7772 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 7776 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(13) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 7800 }, Jump { location: 7822 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 7808 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(13), source: Direct(32773) }, Mov { destination: Relative(14), source: Direct(32774) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 7822 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 7558 }, Call { location: 188 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(1) }, Mov { destination: Relative(4), source: Direct(32837) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(32838) }, Return, Call { location: 188 }, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Direct(32837) }, JumpIf { condition: Relative(6), location: 7861 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(7) } }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(1) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 7937 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Return, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U1, lhs: Relative(6), rhs: Direct(32837) }, JumpIf { condition: Relative(7), location: 7886 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(7), location: 7913 }, Jump { location: 7890 }, Load { destination: Relative(6), source_pointer: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(10), location: 7897 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Store { destination_pointer: Relative(12), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, JumpIf { condition: Relative(7), location: 7908 }, Call { location: 6571 }, Store { destination_pointer: Relative(1), source: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Jump { location: 7936 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Relative(2) }, Mov { destination: Relative(10), source: Relative(3) }, Mov { destination: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 7937 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Direct(32842) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Jump { location: 7936 }, Return, Call { location: 188 }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 7940 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(6), location: 7968 }, Jump { location: 7943 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7950 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BlackBox(Poseidon2Permutation { message: HeapVector { pointer: Relative(8), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 4 }, len: Direct(32847) }), Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Return, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 7972 }, Jump { location: 7995 }, Load { destination: Relative(6), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryFieldOp { destination: Relative(10), op: Add, lhs: Relative(7), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 6884 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Jump { location: 7995 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 7940 }]" ], - "debug_symbols": "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xwv0Z9y1Ivm7j+Czp6D29TKCmkxPVprK/vAx++Foyvjx47WLhXRLnm2NPZre1M8qfPkyiPfel/zsi0l/V8K+90r+g8fQh/7FP94K8+9KxG/6GD68Dv765RtEWC/xCfvQlu+DhT97EF/dcGdypar3qfX4bKNSH9/eMNW/3hFWzu59PMX4d8/mq43zuxf+4roG8eE87w//+urbzH38o+KHf32zjPvD1V9+/Nf5ivOn10378lzS/M6vD27dMGQ8ePbXiloOQ60HBYbwNbD5qMCHG8t+uEfOLyjA7sKIJ49APnxD5cMF3X+4gPT6LrEnv85N7T7sL/34r/dyKPEHm5D0qfWP625++Ncnayziwa/ri5uXPPn1XqDx8drYv+DXX32i5EHzKLcDss9eeY315R89/QfDo9t89tEl2Q82fL6oMD/ulvzwrw9upfgkXblxXjx59X5w1fCP1/h81fCXNX7o750vK/zgquF/UOOHVg3/o8fxosanR8W+XJH46Q7a/33/w+//9Y9//ec//eVff/+3P/7lz//1/q3/vQr99Y+//5c//eH+x3//7z//64f/9W//73/W//Ivf/3jn/70x//45//861/+9Q//9t9//cNV6frffnrd/+//+LV4zvfL/u/vfpLrn+29b+HvU2jvf57vf35/Vs35tl7/m7/PzLnHfv9z5D+//2j0yP92XMXefzr+7r1NXP843v84Y8rv3v9P/+//Xk/m/wM=", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", @@ -260,7 +260,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "22": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_0.snap index 3cf25d5f94c..1245370401b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_0.snap @@ -233,7 +233,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32917 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 12 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32905), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32905 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 23 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 34 }, Call { location: 105 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32917 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 33 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 26 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 6 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 3 }, Const { destination: Direct(32837), bit_size: Integer(U1), value: 0 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32839), bit_size: Integer(U64), value: 0 }, Const { destination: Direct(32840), bit_size: Field, value: 0 }, Const { destination: Direct(32841), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32842), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32843), bit_size: Field, value: 1 }, Const { destination: Direct(32844), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32845), bit_size: Field, value: 2 }, Const { destination: Direct(32846), bit_size: Field, value: 3 }, Const { destination: Direct(32847), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32848), bit_size: Integer(U32), value: 5 }, Const { destination: Direct(32849), bit_size: Field, value: 5 }, Const { destination: Direct(32850), bit_size: Field, value: 6 }, Const { destination: Direct(32851), bit_size: Field, value: 7 }, Const { destination: Direct(32852), bit_size: Field, value: 11 }, Const { destination: Direct(32853), bit_size: Field, value: 12 }, Const { destination: Direct(32854), bit_size: Field, value: 13 }, Const { destination: Direct(32855), bit_size: Field, value: 30 }, Const { destination: Direct(32856), bit_size: Integer(U8), value: 32 }, Const { destination: Direct(32857), bit_size: Integer(U8), value: 34 }, Const { destination: Direct(32858), bit_size: Integer(U8), value: 44 }, Const { destination: Direct(32859), bit_size: Integer(U8), value: 46 }, Const { destination: Direct(32860), bit_size: Integer(U8), value: 49 }, Const { destination: Direct(32861), bit_size: Integer(U8), value: 50 }, Const { destination: Direct(32862), bit_size: Integer(U8), value: 51 }, Const { destination: Direct(32863), bit_size: Field, value: 55 }, Const { destination: Direct(32864), bit_size: Integer(U8), value: 58 }, Const { destination: Direct(32865), bit_size: Integer(U8), value: 65 }, Const { destination: Direct(32866), bit_size: Field, value: 75 }, Const { destination: Direct(32867), bit_size: Field, value: 77 }, Const { destination: Direct(32868), bit_size: Integer(U8), value: 78 }, Const { destination: Direct(32869), bit_size: Field, value: 79 }, Const { destination: Direct(32870), bit_size: Integer(U8), value: 95 }, Const { destination: Direct(32871), bit_size: Integer(U8), value: 97 }, Const { destination: Direct(32872), bit_size: Integer(U8), value: 98 }, Const { destination: Direct(32873), bit_size: Integer(U8), value: 99 }, Const { destination: Direct(32874), bit_size: Integer(U8), value: 100 }, Const { destination: Direct(32875), bit_size: Integer(U8), value: 101 }, Const { destination: Direct(32876), bit_size: Integer(U8), value: 102 }, Const { destination: Direct(32877), bit_size: Integer(U8), value: 103 }, Const { destination: Direct(32878), bit_size: Integer(U8), value: 104 }, Const { destination: Direct(32879), bit_size: Integer(U8), value: 105 }, Const { destination: Direct(32880), bit_size: Integer(U8), value: 107 }, Const { destination: Direct(32881), bit_size: Integer(U8), value: 108 }, Const { destination: Direct(32882), bit_size: Field, value: 108 }, Const { destination: Direct(32883), bit_size: Integer(U8), value: 109 }, Const { destination: Direct(32884), bit_size: Field, value: 109 }, Const { destination: Direct(32885), bit_size: Integer(U8), value: 110 }, Const { destination: Direct(32886), bit_size: Integer(U8), value: 111 }, Const { destination: Direct(32887), bit_size: Field, value: 112 }, Const { destination: Direct(32888), bit_size: Field, value: 113 }, Const { destination: Direct(32889), bit_size: Integer(U8), value: 114 }, Const { destination: Direct(32890), bit_size: Integer(U8), value: 115 }, Const { destination: Direct(32891), bit_size: Field, value: 115 }, Const { destination: Direct(32892), bit_size: Integer(U8), value: 116 }, Const { destination: Direct(32893), bit_size: Integer(U8), value: 117 }, Const { destination: Direct(32894), bit_size: Integer(U8), value: 118 }, Const { destination: Direct(32895), bit_size: Field, value: 118 }, Const { destination: Direct(32896), bit_size: Integer(U8), value: 119 }, Const { destination: Direct(32897), bit_size: Integer(U8), value: 121 }, Const { destination: Direct(32898), bit_size: Integer(U8), value: 123 }, Const { destination: Direct(32899), bit_size: Integer(U8), value: 125 }, Const { destination: Direct(32900), bit_size: Field, value: 134 }, Const { destination: Direct(32901), bit_size: Field, value: 135 }, Const { destination: Direct(32902), bit_size: Field, value: 136 }, Const { destination: Direct(32903), bit_size: Field, value: 138 }, Const { destination: Direct(32904), bit_size: Field, value: 10944121435919637611123202872628637544274182200208017171849102093287904247809 }, Return, Call { location: 1533 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32844) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32837) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32842) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, Load { destination: Relative(9), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 145 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(8) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Load { destination: Relative(11), source_pointer: Relative(5) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 165 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, JumpIf { condition: Relative(11), location: 170 }, Call { location: 1736 }, Load { destination: Relative(9), source_pointer: Relative(6) }, Load { destination: Relative(11), source_pointer: Relative(5) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 177 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(11) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(5) }, Mov { destination: Relative(19), source: Direct(32842) }, Mov { destination: Relative(20), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(17) }, Mov { destination: Relative(14), source: Relative(18) }, JumpIf { condition: Relative(11), location: 192 }, Call { location: 1845 }, Const { destination: Relative(5), bit_size: Integer(U8), value: 73 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(11) }, Store { destination_pointer: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32885) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32890) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32889) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32892) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32874) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32898) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32894) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32871) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32881) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32893) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32899) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32872) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32893) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32892) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32877) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32886) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32892) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32898) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32877) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32886) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32892) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32899) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32876) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32886) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32889) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32892) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32878) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32890) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32871) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32883) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32880) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32897) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32859) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Relative(14) }, JumpIf { condition: Relative(11), location: 318 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, Mov { destination: Relative(17), source: Relative(16) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(18) }, Mov { destination: Direct(32772), source: Relative(17) }, Mov { destination: Direct(32773), source: Relative(19) }, Call { location: 23 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(18) }, Store { destination_pointer: Relative(17), source: Direct(32844) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(16), size: Relative(15) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(6) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 335 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, JumpIf { condition: Relative(8), location: 340 }, Call { location: 1996 }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(4) }, Mov { destination: Relative(18), source: Direct(32838) }, Mov { destination: Relative(19), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(16) }, Mov { destination: Relative(8), source: Relative(17) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(6), rhs: Direct(32837) }, JumpIf { condition: Relative(4), location: 355 }, Call { location: 1999 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, Load { destination: Relative(4), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32847) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(16) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(15) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Direct(32837) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32840) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32840) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32837) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32842) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, Load { destination: Relative(17), source_pointer: Relative(7) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(17) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 394 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(17) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 398 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(7), location: 1520 }, Jump { location: 401 }, Load { destination: Relative(7), source_pointer: Relative(15) }, Load { destination: Relative(8), source_pointer: Relative(16) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 409 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U8), value: 85 }, Const { destination: Relative(12), bit_size: Integer(U8), value: 72 }, Const { destination: Relative(13), bit_size: Integer(U8), value: 77 }, Const { destination: Relative(15), bit_size: Integer(U8), value: 112 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(17) }, Store { destination_pointer: Relative(18), source: Relative(10) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(12) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32871) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32890) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(13) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32871) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(15) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32881) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32885) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32877) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32883) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32893) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32890) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32872) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32860) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32858) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32877) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32886) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32898) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32881) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32885) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32899) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32859) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, JumpIf { condition: Relative(10), location: 516 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 40 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, Mov { destination: Relative(17), source: Relative(13) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U64), value: 7511829951750337011 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 37 }, Mov { destination: Direct(32771), source: Relative(18) }, Mov { destination: Direct(32772), source: Relative(17) }, Mov { destination: Direct(32773), source: Relative(19) }, Call { location: 23 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(18) }, Store { destination_pointer: Relative(17), source: Direct(32842) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(8) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(13), size: Relative(12) } }, Load { destination: Relative(8), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Direct(32842) }, Mov { destination: Relative(20), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(17) }, Mov { destination: Relative(12), source: Relative(18) }, JumpIf { condition: Relative(10), location: 530 }, Call { location: 1845 }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(6), rhs: Relative(12) }, JumpIf { condition: Relative(4), location: 554 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(8) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(13) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(14) }, Call { location: 23 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(8), size: Relative(7) } }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32848) }, Load { destination: Relative(4), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32842) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Mov { destination: Relative(12), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, Load { destination: Relative(13), source_pointer: Relative(7) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 596 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(12) }, Mov { destination: Relative(20), source: Relative(4) }, Mov { destination: Relative(21), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(12) }, Mov { destination: Relative(20), source: Relative(4) }, Mov { destination: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Load { destination: Relative(7), source_pointer: Relative(12) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 626 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, JumpIf { condition: Relative(10), location: 631 }, Call { location: 2002 }, Load { destination: Relative(7), source_pointer: Relative(9) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(7) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Direct(32842) }, Mov { destination: Relative(20), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(17) }, Mov { destination: Relative(10), source: Relative(18) }, JumpIf { condition: Relative(9), location: 645 }, Call { location: 1845 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 69 }, Const { destination: Relative(6), bit_size: Integer(U8), value: 120 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(4) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(15) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32873) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32892) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32874) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32898) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32885) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32896) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32870) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32894) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32871) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32881) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32893) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32899) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32858) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32872) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32893) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32892) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32886) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32892) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32898) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32886) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32892) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32899) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(6), location: 748 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 40 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, Mov { destination: Relative(15), source: Relative(13) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U64), value: 3316745884754988903 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 36 }, Mov { destination: Direct(32771), source: Relative(16) }, Mov { destination: Direct(32772), source: Relative(15) }, Mov { destination: Direct(32773), source: Relative(17) }, Call { location: 23 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(16) }, Store { destination_pointer: Relative(15), source: Direct(32844) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(10) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(13), size: Relative(9) } }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 754 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(8) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(8) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32842) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, Load { destination: Relative(13), source_pointer: Relative(6) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 791 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(6) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 799 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32885) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32890) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32875) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32889) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32892) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32879) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32885) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32877) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32856) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32898) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32875) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32885) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32892) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32889) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32897) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32899) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 91 }, Const { destination: Relative(16), bit_size: Integer(U8), value: 93 }, Mov { destination: Relative(17), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 96 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Mov { destination: Relative(19), source: Relative(18) }, Store { destination_pointer: Relative(19), source: Direct(32898) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32880) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32885) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32864) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32890) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32892) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32889) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32893) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32873) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32892) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32858) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32885) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32871) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32883) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32864) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(4) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32885) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32892) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32889) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32897) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32858) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32876) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32881) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32890) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32864) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(5) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(5) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32880) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32897) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32858) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32898) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32880) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32885) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32864) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32876) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32881) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32899) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(16) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32858) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(5) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32894) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32871) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32881) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32893) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32858) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32898) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32880) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32885) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32864) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32876) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32881) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32899) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(16) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(16) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32899) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1039 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(4), location: 1480 }, Jump { location: 1042 }, Load { destination: Relative(4), source_pointer: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1050 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Direct(32898) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32880) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32864) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32893) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32890) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32877) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32892) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32877) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32889) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32858) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32896) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32892) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32878) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32864) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32862) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32861) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32899) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), MemoryAddress(Relative(5)), HeapArray(HeapArray { pointer: Relative(11), size: 37 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Simple(Integer(U32)), Array { value_types: [Simple(Integer(U8))], size: 37 }, Simple(Integer(U1))] }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1139 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(4), location: 1144 }, Call { location: 2005 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 1150 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(6) }, Store { destination_pointer: Relative(12), source: Direct(32868) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32886) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32892) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32876) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32886) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32893) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32890) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32889) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32892) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32880) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32897) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32898) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32892) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32889) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32897) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32870) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32880) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32897) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32899) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32859) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1229 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(5), location: 1430 }, Jump { location: 1232 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(8) }, Mov { destination: Relative(13), source: Relative(9) }, Mov { destination: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 2008 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, JumpIf { condition: Relative(5), location: 1244 }, Call { location: 2037 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(8) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(8) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32842) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1308 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1312 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(10), location: 1399 }, Jump { location: 1315 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(6) }, Load { destination: Relative(5), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1324 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(7) }, Load { destination: Relative(12), source_pointer: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1335 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(12) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(1) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(5) }, Mov { destination: Relative(19), source: Relative(4) }, Mov { destination: Relative(20), source: Relative(10) }, Mov { destination: Relative(21), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 2040 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(16) }, JumpIf { condition: Relative(12), location: 1351 }, Call { location: 2139 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(7) }, Mov { destination: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(3) }, Mov { destination: Relative(19), source: Relative(4) }, Mov { destination: Relative(20), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 2040 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(15) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(7), rhs: Direct(32837) }, JumpIf { condition: Relative(1), location: 1378 }, Call { location: 2142 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2145 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2251 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2541 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2985 }, Mov { destination: Direct(0), source: Relative(0) }, Return, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Load { destination: Relative(10), source_pointer: Relative(14) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Relative(6) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(11) }, Mov { destination: Relative(18), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(8) }, Mov { destination: Relative(15), source: Relative(9) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(11) }, Mov { destination: Relative(18), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(10) }, Jump { location: 1312 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(7) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1443 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Relative(11) }, Mov { destination: Relative(20), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(17) }, Mov { destination: Relative(14), source: Relative(18) }, JumpIf { condition: Relative(12), location: 1477 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 38 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, Mov { destination: Relative(11), source: Relative(7) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U64), value: 9862881900111276825 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 35 }, Mov { destination: Direct(32771), source: Relative(15) }, Mov { destination: Direct(32772), source: Relative(11) }, Mov { destination: Direct(32773), source: Relative(16) }, Call { location: 23 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 35 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(15) }, Store { destination_pointer: Relative(11), source: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(7), size: Relative(5) } }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(5) }, Jump { location: 1229 }, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(12) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1494 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1502 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(7), size: 17 }), MemoryAddress(Direct(32842)), MemoryAddress(Relative(5)), MemoryAddress(Relative(4)), HeapArray(HeapArray { pointer: Relative(13), size: 95 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 17 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 95 }, Simple(Integer(U1))] }, Const { destination: Relative(7), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(8) }, Mov { destination: Relative(20), source: Relative(9) }, Mov { destination: Relative(21), source: Relative(10) }, Mov { destination: Relative(22), source: Relative(5) }, Mov { destination: Relative(23), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(4) }, Jump { location: 1039 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(14) }, Mov { destination: Relative(19), source: Relative(15) }, Mov { destination: Relative(20), source: Relative(16) }, Mov { destination: Relative(21), source: Relative(4) }, Mov { destination: Relative(22), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(7) }, Jump { location: 398 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 1538 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4231 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1560 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4395 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1578 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Mov { destination: Relative(6), source: Direct(32838) }, Jump { location: 1582 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 1585 }, Jump { location: 1735 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1593 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(6), rhs: Relative(6) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 1603 }, BinaryIntOp { destination: Relative(16), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 1603 }, Call { location: 4431 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1607 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(13), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1612 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 1618 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32847) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(13) }, Mov { destination: Relative(16), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(15) }, Mov { destination: Relative(19), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(18) }, Mov { destination: Relative(20), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32837) }, Not { destination: Relative(21), source: Relative(13), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Or, bit_size: U1, lhs: Relative(18), rhs: Relative(21) }, JumpIf { condition: Relative(13), location: 1662 }, Jump { location: 1657 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 1660 }, Jump { location: 1674 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Jump { location: 1674 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(15), location: 1668 }, Call { location: 4434 }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 1674 }, Load { destination: Relative(12), source_pointer: Relative(20) }, JumpIf { condition: Relative(12), location: 1680 }, Jump { location: 1677 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 1582 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(9) }, Mov { destination: Relative(22), source: Relative(16) }, Mov { destination: Relative(23), source: Relative(19) }, Mov { destination: Relative(24), source: Relative(17) }, Mov { destination: Relative(25), source: Relative(4) }, Mov { destination: Relative(26), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 4440 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(16) }, Load { destination: Relative(6), source_pointer: Relative(19) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, JumpIf { condition: Relative(13), location: 1701 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(10) }, Call { location: 4454 }, Mov { destination: Relative(11), source: Direct(32772) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(4) }, Mov { destination: Direct(32771), source: Relative(11) }, Call { location: 4454 }, Mov { destination: Relative(4), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(4) }, Call { location: 4454 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 4454 }, Mov { destination: Relative(5), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(12) }, Jump { location: 1735 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 4105629585450304037 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1752 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4395 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(12) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(3) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1770 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 1774 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 1777 }, Jump { location: 1842 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1783 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, JumpIf { condition: Relative(10), location: 1793 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 1793 }, Call { location: 4431 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 1797 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(3), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 1802 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(3), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(10), location: 1808 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(3), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(10), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(3) }, JumpIf { condition: Relative(10), location: 1832 }, Jump { location: 1836 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(12), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 1839 }, Jump { location: 1835 }, Jump { location: 1836 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(3) }, Jump { location: 1774 }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 1842 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12632160011611521689 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1858 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4395 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1876 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 1880 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 1883 }, Jump { location: 1995 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1891 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 1901 }, BinaryIntOp { destination: Relative(15), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, JumpIf { condition: Relative(14), location: 1901 }, Call { location: 4431 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1905 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(10), op: Div, bit_size: U32, lhs: Relative(12), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1910 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(12), rhs: Relative(14) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, JumpIf { condition: Relative(12), location: 1916 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(10), rhs: Direct(32847) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Not { destination: Relative(8), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 1940 }, Jump { location: 1944 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(14), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 1947 }, Jump { location: 1943 }, Jump { location: 1944 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 1880 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 1953 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(5) }, Call { location: 4454 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 4454 }, Mov { destination: Relative(5), source: Direct(32772) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, Store { destination_pointer: Relative(9), source: Relative(14) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(5) }, Call { location: 4454 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 4454 }, Mov { destination: Relative(7), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 1990 }, Call { location: 4480 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Jump { location: 1995 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 8082322909743101849 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 11665340019033496436 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 13674703438729013973 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 1359149291226868540 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Direct(32842) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 8591465503772373437 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2050 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2058 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 2063 }, Jump { location: 2078 }, Store { destination_pointer: Relative(7), source: Direct(32841) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2070 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 2074 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(8), location: 2080 }, Jump { location: 2077 }, Jump { location: 2078 }, Load { destination: Relative(1), source_pointer: Relative(7) }, Return, JumpIf { condition: Relative(8), location: 2082 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Not { destination: Relative(13), source: Relative(8), bit_size: U1 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U1, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 2108 }, Jump { location: 2136 }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2114 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(15) }, Mov { destination: Relative(10), source: Relative(16) }, JumpIf { condition: Relative(8), location: 2131 }, Jump { location: 2129 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 2136 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(8), location: 2136 }, Jump { location: 2134 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 2136 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(8) }, Jump { location: 2074 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 6665645948190457319 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14241324264716156348 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 2181 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32849) }, Mov { destination: Relative(12), source: Direct(32852) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32845) }, Mov { destination: Relative(12), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32852) }, Mov { destination: Relative(12), source: Direct(32849) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32903) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 4483 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 2230 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, JumpIf { condition: Relative(4), location: 2235 }, Call { location: 4629 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Direct(32844) }, Mov { destination: Relative(12), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(9) }, Mov { destination: Relative(4), source: Relative(10) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(2), rhs: Direct(32837) }, JumpIf { condition: Relative(1), location: 2250 }, Call { location: 4632 }, Return, Call { location: 1533 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32845) }, Mov { destination: Relative(10), source: Direct(32846) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32849) }, Mov { destination: Relative(10), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32852) }, Mov { destination: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 2320 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(4) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4635 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(6), source: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 4918 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(10) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 2346 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2357 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Direct(32838) }, Mov { destination: Relative(13), source: Direct(32844) }, Mov { destination: Relative(14), source: Direct(32900) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4950 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2375 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 5219 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4918 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(14) }, Load { destination: Relative(1), source_pointer: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 2401 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(11) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2412 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32901) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4950 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(11), source_pointer: Relative(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(16) }, Mov { destination: Relative(12), source: Relative(17) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(12) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5802 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(15) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 2448 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2459 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32902) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 5871 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(4) }, Store { destination_pointer: Relative(14), source: Direct(32845) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32849) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32852) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 6153 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(16) }, JumpIf { condition: Relative(4), location: 2492 }, Call { location: 6185 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(4) }, Store { destination_pointer: Relative(7), source: Direct(32846) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32851) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(11) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 6153 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, JumpIf { condition: Relative(4), location: 2513 }, Call { location: 6188 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(4) }, Store { destination_pointer: Relative(7), source: Direct(32845) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32846) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32849) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32851) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32852) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 6191 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, JumpIf { condition: Relative(4), location: 2540 }, Call { location: 6233 }, Return, Call { location: 1533 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32845) }, Mov { destination: Relative(10), source: Direct(32846) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32849) }, Mov { destination: Relative(10), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32852) }, Mov { destination: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32882) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6236 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32884) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6353 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 2628 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4635 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4918 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(10) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2654 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2665 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Direct(32838) }, Mov { destination: Relative(16), source: Direct(32844) }, Mov { destination: Relative(17), source: Direct(32887) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4950 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2683 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 5219 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(16) }, Mov { destination: Relative(13), source: Relative(17) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(13) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 4918 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 2709 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2720 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 4950 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2738 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 15 }, Const { destination: Relative(14), bit_size: Field, value: 33 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Direct(32850) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 6153 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(14), source: Relative(18) }, Const { destination: Relative(15), bit_size: Integer(U8), value: 71 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(17) }, Store { destination_pointer: Relative(18), source: Relative(15) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32886) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32879) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32885) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32873) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32886) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32873) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32879) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32871) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32879) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32886) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32885) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32886) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32876) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32880) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32897) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32890) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32864) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32898) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32880) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32897) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32890) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32899) }, JumpIf { condition: Relative(14), location: 2872 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 44 }, Mov { destination: Relative(17), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 44 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, Mov { destination: Relative(18), source: Relative(17) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U64), value: 2386996775688025706 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 39 }, Mov { destination: Direct(32771), source: Relative(19) }, Mov { destination: Direct(32772), source: Relative(18) }, Mov { destination: Direct(32773), source: Relative(20) }, Call { location: 23 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 39 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(19) }, Store { destination_pointer: Relative(18), source: Direct(32842) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(19) }, Mov { destination: Direct(32772), source: Relative(18) }, Mov { destination: Direct(32773), source: Relative(20) }, Call { location: 23 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(19) }, Trap { revert_data: HeapVector { pointer: Relative(17), size: Relative(15) } }, Const { destination: Relative(10), bit_size: Field, value: 35 }, Const { destination: Relative(14), bit_size: Field, value: 65 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(10) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(4) }, Mov { destination: Relative(18), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6153 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(17) }, JumpIf { condition: Relative(5), location: 2895 }, Call { location: 6188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32891) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6498 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(15) }, Mov { destination: Relative(5), source: Relative(16) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5802 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(15) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 2931 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2942 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32895) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 5871 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(1), bit_size: Field, value: 70 }, Const { destination: Relative(4), bit_size: Field, value: 66 }, Const { destination: Relative(10), bit_size: Field, value: 130 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(15) }, Store { destination_pointer: Relative(16), source: Direct(32853) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32855) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32855) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(10) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6191 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(16) }, JumpIf { condition: Relative(1), location: 2984 }, Call { location: 6233 }, Return, Call { location: 1533 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Field, value: 42 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Direct(32853) }, Mov { destination: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3034 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, JumpIf { condition: Relative(7), location: 3040 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3047 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Direct(32842) }, Mov { destination: Relative(16), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, JumpIf { condition: Relative(7), location: 3062 }, Jump { location: 3070 }, JumpIf { condition: Relative(7), location: 3065 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(10), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 3069 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Jump { location: 3070 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 3087 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(4), location: 3093 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(2) }, Mov { destination: Relative(10), source: Relative(3) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3110 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(6), location: 3116 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3122 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Direct(32843) }, Mov { destination: Relative(14), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3142 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(4), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 3149 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32843) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3166 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(9), location: 3172 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3178 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32843) }, Mov { destination: Relative(17), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Field, value: 4 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32846) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32849) }, Mov { destination: Relative(17), source: Direct(32850) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 3219 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(12) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 3225 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32846) }, Mov { destination: Relative(19), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 3243 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(12) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 3249 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(3) }, Mov { destination: Relative(18), source: Relative(1) }, Mov { destination: Relative(19), source: Direct(32843) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 3266 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, JumpIf { condition: Relative(12), location: 3272 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(16), source: Direct(32898) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32880) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32879) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32885) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32874) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32864) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32893) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32885) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32890) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32879) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32877) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32885) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32875) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32874) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32879) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32885) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32892) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32875) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32877) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32875) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32889) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32858) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32896) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32879) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32874) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32892) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32878) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32864) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32862) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32861) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32899) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), MemoryAddress(Direct(32842)), HeapArray(HeapArray { pointer: Relative(12), size: 37 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Simple(Integer(U32)), Array { value_types: [Simple(Integer(U8))], size: 37 }, Simple(Integer(U1))] }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 3359 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(3) }, Mov { destination: Relative(19), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 2008 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(16), source_pointer: Relative(4) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(16) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 3377 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(16), location: 3383 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(16), source_pointer: Relative(4) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 3390 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(5) }, Mov { destination: Relative(23), source: Relative(4) }, Mov { destination: Relative(24), source: Direct(32838) }, Mov { destination: Relative(25), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(16), source: Relative(22) }, Mov { destination: Relative(19), source: Relative(23) }, JumpIf { condition: Relative(16), location: 3518 }, Jump { location: 3405 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 55 }, Const { destination: Relative(5), bit_size: Integer(U8), value: 33 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32868) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32886) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32894) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32871) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32881) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32893) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32876) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32886) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32889) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32897) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 57 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32898) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32879) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32885) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32874) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32864) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32890) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32892) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32889) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32879) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32885) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32877) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32858) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32881) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32885) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32877) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32892) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32864) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32860) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32899) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(4), size: 19 }), HeapArray(HeapArray { pointer: Relative(7), size: 29 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 19 }, Array { value_types: [Simple(Integer(U8))], size: 29 }, Simple(Integer(U1))] }, Jump { location: 3544 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3527 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, JumpIf { condition: Relative(7), location: 3543 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 3544 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3553 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, Load { destination: Relative(11), source_pointer: Relative(6) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 3571 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(11) }, Const { destination: Relative(11), bit_size: Integer(U8), value: 45 }, Const { destination: Relative(13), bit_size: Integer(U8), value: 62 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(15) }, Store { destination_pointer: Relative(16), source: Direct(32898) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32880) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32875) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32897) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32899) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32856) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(11) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32856) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32898) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32894) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32871) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32881) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32893) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32875) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32899) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(13) }, Store { destination_pointer: Relative(15), source: Direct(32898) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32857) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32880) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32879) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32885) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32874) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32857) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32864) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32857) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32876) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32879) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32881) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32874) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32857) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32899) }, Load { destination: Relative(13), source_pointer: Relative(11) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 3655 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(13) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 3659 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(9), location: 4192 }, Jump { location: 3662 }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3668 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4635 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(16) }, Mov { destination: Relative(10), source: Relative(17) }, Load { destination: Relative(12), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 3686 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Load { destination: Relative(12), source_pointer: Relative(11) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 3694 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 3698 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 4144 }, Jump { location: 3701 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 5219 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(13) }, Mov { destination: Relative(9), source: Relative(14) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 70 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32886) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32893) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32885) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32874) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32856) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32894) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32871) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32881) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32893) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32875) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32856) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32898) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32894) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32871) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32881) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32893) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32875) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32899) }, Load { destination: Relative(5), source_pointer: Relative(11) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3761 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 3765 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 4116 }, Jump { location: 3768 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3777 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Direct(32866) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 6498 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 6236 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Direct(32869) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 6353 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Direct(32855) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 4483 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32839) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Const { destination: Relative(7), bit_size: Integer(U64), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Direct(32843) }, Mov { destination: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 6603 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(9), bit_size: Integer(U64), value: 4 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32846) }, Mov { destination: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6603 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Direct(32846) }, Mov { destination: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6603 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Direct(32843) }, Mov { destination: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 6603 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3939 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3947 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 3952 }, Jump { location: 3967 }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3959 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 3963 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 3972 }, Jump { location: 3966 }, Jump { location: 3967 }, Load { destination: Relative(1), source_pointer: Relative(4) }, JumpIf { condition: Relative(1), location: 3971 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, JumpIf { condition: Relative(8), location: 3974 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Not { destination: Relative(13), source: Relative(8), bit_size: U1 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U1, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 4000 }, Jump { location: 4113 }, Load { destination: Relative(9), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 4006 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32839) }, Load { destination: Relative(14), source_pointer: Relative(5) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 4020 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(14) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(1) }, Mov { destination: Relative(19), source: Relative(5) }, Mov { destination: Relative(20), source: Relative(6) }, Mov { destination: Relative(21), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 6765 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(14), source: Relative(18) }, Load { destination: Relative(16), source_pointer: Relative(5) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(16) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 4038 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(16) }, Mov { destination: Relative(8), source: Direct(32838) }, Jump { location: 4042 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, JumpIf { condition: Relative(10), location: 4045 }, Jump { location: 4102 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(8), rhs: Relative(8) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(8) }, JumpIf { condition: Relative(15), location: 4053 }, BinaryIntOp { destination: Relative(18), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(8) }, JumpIf { condition: Relative(17), location: 4053 }, Call { location: 4431 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(15) }, JumpIf { condition: Relative(16), location: 4057 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(10), op: Div, bit_size: U32, lhs: Relative(15), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(15) }, JumpIf { condition: Relative(16), location: 4062 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(16), op: Div, bit_size: U32, lhs: Relative(15), rhs: Relative(1) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(16), rhs: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, JumpIf { condition: Relative(15), location: 4068 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(10), rhs: Direct(32847) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(15) }, Load { destination: Relative(10), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32842) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32844) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32836) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(15), source_pointer: Relative(20) }, Not { destination: Relative(16), source: Relative(15), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(16), rhs: Relative(10) }, JumpIf { condition: Relative(15), location: 4092 }, Jump { location: 4096 }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(17), rhs: Relative(11) }, JumpIf { condition: Relative(10), location: 4099 }, Jump { location: 4095 }, Jump { location: 4096 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Mov { destination: Relative(8), source: Relative(10) }, Jump { location: 4042 }, Store { destination_pointer: Relative(9), source: Direct(32841) }, Store { destination_pointer: Relative(13), source: Relative(18) }, Jump { location: 4102 }, Load { destination: Relative(8), source_pointer: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(13) }, JumpIf { condition: Relative(8), location: 4108 }, Jump { location: 4106 }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Jump { location: 4113 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U64, lhs: Relative(12), rhs: Relative(9) }, JumpIf { condition: Relative(8), location: 4113 }, Jump { location: 4111 }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Jump { location: 4113 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(8) }, Jump { location: 3963 }, JumpIf { condition: Relative(5), location: 4118 }, Call { location: 4437 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4128 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 4136 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(7), size: 19 }), MemoryAddress(Direct(32842)), MemoryAddress(Relative(5)), HeapArray(HeapArray { pointer: Relative(13), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 19 }, Simple(Integer(U32)), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 3765 }, JumpIf { condition: Relative(9), location: 4146 }, Call { location: 4437 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(4) }, Load { destination: Relative(9), source_pointer: Relative(13) }, Load { destination: Relative(12), source_pointer: Relative(6) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 4156 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(12) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(5) }, Mov { destination: Relative(19), source: Relative(6) }, Mov { destination: Relative(20), source: Relative(7) }, Mov { destination: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(18) }, Mov { destination: Relative(15), source: Relative(19) }, Load { destination: Relative(16), source_pointer: Relative(14) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(16) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 4175 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(16) }, Load { destination: Relative(16), source_pointer: Relative(11) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 4183 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(16), size: 16 }), MemoryAddress(Direct(32844)), MemoryAddress(Relative(9)), MemoryAddress(Relative(15)), HeapArray(HeapArray { pointer: Relative(19), size: 16 }), HeapArray(HeapArray { pointer: Relative(20), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(9) }, Jump { location: 3698 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 4195 }, Jump { location: 4228 }, JumpIf { condition: Relative(9), location: 4197 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Load { destination: Relative(12), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(9), source_pointer: Relative(16) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 4213 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(11) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 4221 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(13), size: 16 }), MemoryAddress(Direct(32844)), MemoryAddress(Relative(12)), MemoryAddress(Relative(9)), HeapArray(HeapArray { pointer: Relative(17), size: 16 }), HeapArray(HeapArray { pointer: Relative(18), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, Jump { location: 4228 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(9) }, Jump { location: 3659 }, Call { location: 1533 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4240 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 4246 }, Call { location: 4434 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4253 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(4), op: Div, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 4394 }, Jump { location: 4259 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4267 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Div, bit_size: U32, lhs: Relative(6), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(7), location: 4274 }, Call { location: 4431 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4294 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 4366 }, Jump { location: 4297 }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 4317 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(8) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(13), source: Relative(17) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4331 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(11) }, JumpIf { condition: Relative(8), location: 4341 }, Jump { location: 4334 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Jump { location: 4394 }, JumpIf { condition: Relative(8), location: 4343 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(9) }, Mov { destination: Relative(19), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 4331 }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4374 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6801 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32837) }, Store { destination_pointer: Relative(7), source: Relative(10) }, Store { destination_pointer: Relative(9), source: Relative(12) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4294 }, Return, Call { location: 1533 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 4416 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Direct(32842) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 6857 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Cast { destination: Relative(7), source: Relative(4), bit_size: Integer(U32) }, Cast { destination: Relative(5), source: Relative(7), bit_size: Field }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(4) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 7233212735005103307 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Load { destination: Relative(7), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Direct(32841) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Return, Load { destination: Direct(32773), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32774), op: Equals, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, JumpIf { condition: Direct(32774), location: 4458 }, Jump { location: 4460 }, Mov { destination: Direct(32772), source: Direct(32771) }, Jump { location: 4479 }, Const { destination: Direct(32776), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32775) }, Const { destination: Direct(32776), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32775), rhs: Direct(32776) }, Mov { destination: Direct(32772), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32775) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32775) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32772) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 4477 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 4470 }, IndirectConst { destination_pointer: Direct(32772), bit_size: Integer(U32), value: 1 }, Jump { location: 4479 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4492 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(4), rhs: Direct(32855) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(4), rhs: Direct(32887) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32888) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Direct(32900) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32901) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 4501 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 4505 }, Jump { location: 4504 }, Return, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(13), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 4510 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32847) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(9) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32844) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Load { destination: Relative(19), source_pointer: Relative(21) }, Not { destination: Relative(13), source: Relative(19), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(14) }, JumpIf { condition: Relative(17), location: 4534 }, Jump { location: 4626 }, JumpIf { condition: Relative(7), location: 4569 }, Jump { location: 4536 }, BinaryFieldOp { destination: Relative(19), op: LessThan, lhs: Relative(16), rhs: Relative(18) }, JumpIf { condition: Relative(8), location: 4565 }, Jump { location: 4539 }, JumpIf { condition: Relative(10), location: 4561 }, Jump { location: 4541 }, JumpIf { condition: Relative(11), location: 4557 }, Jump { location: 4543 }, JumpIf { condition: Relative(12), location: 4553 }, Jump { location: 4545 }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(4), rhs: Direct(32903) }, JumpIf { condition: Relative(19), location: 4549 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(23) } }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(16), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(23), op: Equals, lhs: Relative(19), rhs: Direct(32863) }, Mov { destination: Relative(22), source: Relative(23) }, Jump { location: 4555 }, Mov { destination: Relative(22), source: Relative(19) }, Jump { location: 4555 }, Mov { destination: Relative(21), source: Relative(22) }, Jump { location: 4559 }, Mov { destination: Relative(21), source: Relative(19) }, Jump { location: 4559 }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 4563 }, Mov { destination: Relative(20), source: Relative(19) }, Jump { location: 4563 }, Mov { destination: Relative(17), source: Relative(20) }, Jump { location: 4567 }, Mov { destination: Relative(17), source: Relative(19) }, Jump { location: 4567 }, Mov { destination: Relative(13), source: Relative(17) }, Jump { location: 4576 }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(16), rhs: Direct(32840) }, Not { destination: Relative(19), source: Relative(17), bit_size: U1 }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(18), rhs: Direct(32840) }, Not { destination: Relative(20), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(19), rhs: Relative(20) }, Mov { destination: Relative(13), source: Relative(17) }, Jump { location: 4576 }, JumpIf { condition: Relative(13), location: 4626 }, Jump { location: 4578 }, Load { destination: Relative(13), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(17), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(19), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(13) }, JumpIf { condition: Relative(19), location: 4583 }, Call { location: 4480 }, Load { destination: Relative(13), source_pointer: Relative(1) }, Load { destination: Relative(19), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(17) }, Load { destination: Relative(13), source_pointer: Relative(1) }, Load { destination: Relative(17), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(13) }, JumpIf { condition: Relative(20), location: 4592 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(19) }, Call { location: 4454 }, Mov { destination: Relative(20), source: Direct(32772) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(22) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(22), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(20) }, Call { location: 4454 }, Mov { destination: Relative(9), source: Direct(32772) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(15) }, Store { destination_pointer: Relative(19), source: Relative(16) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(9) }, Call { location: 4454 }, Mov { destination: Relative(15), source: Direct(32772) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Store { destination_pointer: Relative(19), source: Relative(18) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(15) }, Call { location: 4454 }, Mov { destination: Relative(14), source: Direct(32772) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(9) }, Store { destination_pointer: Relative(18), source: Direct(32841) }, Store { destination_pointer: Relative(1), source: Relative(13) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(17) }, Jump { location: 4626 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(9) }, Jump { location: 4501 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16986922238178214607 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 15583592523844085222 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4660 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4664 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 4874 }, Jump { location: 4667 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 4675 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 80 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4846 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 4872 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 83 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 6693878053340631133 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 79 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 79 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 4876 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 4895 }, Jump { location: 4915 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4903 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 1 }, Call { location: 6801 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Jump { location: 4915 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4664 }, Call { location: 1533 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 4925 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(3), location: 4931 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32847) }, Load { destination: Relative(3), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32848) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Call { location: 1533 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 4975 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 4978 }, Jump { location: 5218 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4986 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, JumpIf { condition: Relative(7), location: 5217 }, Jump { location: 4991 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4999 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 7006 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5016 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 5024 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(8), location: 5215 }, Jump { location: 5028 }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(11) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32836) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32855) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Direct(32887) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(4), rhs: Direct(32888) }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(4), rhs: Direct(32900) }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(4), rhs: Direct(32901) }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 5039 }, BinaryIntOp { destination: Relative(17), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(17), location: 5124 }, Jump { location: 5042 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 5047 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, JumpIf { condition: Relative(9), location: 5052 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Store { destination_pointer: Relative(15), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(12) }, Store { destination_pointer: Relative(14), source: Relative(8) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 5078 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 5084 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(15), source: Direct(32773) }, Mov { destination: Relative(16), source: Direct(32774) }, Store { destination_pointer: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Direct(32838), rhs: Relative(10) }, JumpIf { condition: Relative(7), location: 5098 }, Jump { location: 5122 }, Load { destination: Relative(7), source_pointer: Relative(15) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 5104 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(10) }, JumpIf { condition: Relative(9), location: 5110 }, Call { location: 4480 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(12), source: Direct(32774) }, Store { destination_pointer: Relative(12), source: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Jump { location: 5122 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 4975 }, Load { destination: Relative(18), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, JumpIf { condition: Relative(19), location: 5128 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Load { destination: Relative(19), source_pointer: Relative(21) }, JumpIf { condition: Relative(9), location: 5133 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(12) }, Load { destination: Relative(20), source_pointer: Relative(22) }, JumpIf { condition: Relative(10), location: 5171 }, Jump { location: 5138 }, BinaryFieldOp { destination: Relative(21), op: LessThan, lhs: Relative(19), rhs: Relative(20) }, JumpIf { condition: Relative(13), location: 5167 }, Jump { location: 5141 }, JumpIf { condition: Relative(14), location: 5163 }, Jump { location: 5143 }, JumpIf { condition: Relative(15), location: 5159 }, Jump { location: 5145 }, JumpIf { condition: Relative(16), location: 5155 }, Jump { location: 5147 }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(4), rhs: Direct(32903) }, JumpIf { condition: Relative(21), location: 5151 }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(25) } }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(19), rhs: Relative(20) }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(21), rhs: Direct(32863) }, Mov { destination: Relative(24), source: Relative(19) }, Jump { location: 5157 }, Mov { destination: Relative(24), source: Relative(21) }, Jump { location: 5157 }, Mov { destination: Relative(23), source: Relative(24) }, Jump { location: 5161 }, Mov { destination: Relative(23), source: Relative(21) }, Jump { location: 5161 }, Mov { destination: Relative(22), source: Relative(23) }, Jump { location: 5165 }, Mov { destination: Relative(22), source: Relative(21) }, Jump { location: 5165 }, Mov { destination: Relative(18), source: Relative(22) }, Jump { location: 5169 }, Mov { destination: Relative(18), source: Relative(21) }, Jump { location: 5169 }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 5178 }, BinaryFieldOp { destination: Relative(18), op: Equals, lhs: Relative(19), rhs: Direct(32840) }, Not { destination: Relative(19), source: Relative(18), bit_size: U1 }, BinaryFieldOp { destination: Relative(18), op: Equals, lhs: Relative(20), rhs: Direct(32840) }, Not { destination: Relative(20), source: Relative(18), bit_size: U1 }, BinaryIntOp { destination: Relative(18), op: Mul, bit_size: U1, lhs: Relative(19), rhs: Relative(20) }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 5178 }, JumpIf { condition: Relative(17), location: 5180 }, Jump { location: 5212 }, Load { destination: Relative(17), source_pointer: Relative(1) }, Load { destination: Relative(18), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(18), rhs: Direct(32836) }, JumpIf { condition: Relative(19), location: 5185 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(18) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(7) }, Load { destination: Relative(20), source_pointer: Relative(22) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(18) }, Store { destination_pointer: Relative(23), source: Relative(20) }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(22), source: Relative(19) }, Store { destination_pointer: Relative(1), source: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(19), op: LessThanEquals, bit_size: U32, lhs: Relative(18), rhs: Relative(17) }, JumpIf { condition: Relative(19), location: 5210 }, Call { location: 4434 }, Store { destination_pointer: Relative(8), source: Relative(17) }, Jump { location: 5212 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Relative(7), source: Relative(17) }, Jump { location: 5039 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 4975 }, Jump { location: 5218 }, Return, Call { location: 1533 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 5244 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 5248 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 5462 }, Jump { location: 5251 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 5259 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 5434 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 5460 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 85 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 85 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9965974553718638037 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 81 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 81 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 5464 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 5483 }, Jump { location: 5503 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 5491 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 1 }, Call { location: 6801 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Jump { location: 5503 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 5248 }, Call { location: 1533 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 5531 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 5535 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 5751 }, Jump { location: 5538 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 5546 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 5723 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 5749 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 5753 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(13) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 5777 }, Jump { location: 5799 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5785 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(13), source: Direct(32773) }, Mov { destination: Relative(14), source: Direct(32774) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 5799 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 5535 }, Call { location: 1533 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 5809 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 5815 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(4) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 5837 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(1), location: 5842 }, Jump { location: 5840 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, BinaryIntOp { destination: Relative(1), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 5837 }, Call { location: 1533 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 5896 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 5899 }, Jump { location: 6152 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5907 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, JumpIf { condition: Relative(7), location: 6151 }, Jump { location: 5912 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5920 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 7006 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5937 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 5945 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(8), location: 6149 }, Jump { location: 5949 }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(11) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(12), rhs: Direct(32844) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Direct(32895) }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 5957 }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 6065 }, Jump { location: 5960 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(13), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 5965 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(13), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(8) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, JumpIf { condition: Relative(9), location: 5975 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Load { destination: Relative(9), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(8) }, Store { destination_pointer: Relative(21), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(15) }, Store { destination_pointer: Relative(9), source: Relative(18) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, Store { destination_pointer: Relative(10), source: Relative(16) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 6019 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 6025 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(15), source: Direct(32773) }, Mov { destination: Relative(16), source: Direct(32774) }, Store { destination_pointer: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Direct(32838), rhs: Relative(13) }, JumpIf { condition: Relative(7), location: 6039 }, Jump { location: 6063 }, Load { destination: Relative(7), source_pointer: Relative(15) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6045 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(13) }, JumpIf { condition: Relative(9), location: 6051 }, Call { location: 4480 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(12), source: Direct(32774) }, Store { destination_pointer: Relative(12), source: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Jump { location: 6063 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 5896 }, Load { destination: Relative(15), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, JumpIf { condition: Relative(16), location: 6069 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(16), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, JumpIf { condition: Relative(9), location: 6075 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(10) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryFieldOp { destination: Relative(15), op: LessThan, lhs: Relative(17), rhs: Relative(18) }, JumpIf { condition: Relative(13), location: 6087 }, Jump { location: 6081 }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(4), rhs: Direct(32902) }, JumpIf { condition: Relative(17), location: 6085 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 6089 }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 6089 }, JumpIf { condition: Relative(14), location: 6091 }, Jump { location: 6146 }, Load { destination: Relative(14), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(17), op: LessThan, bit_size: U32, lhs: Relative(15), rhs: Direct(32836) }, JumpIf { condition: Relative(17), location: 6096 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(15), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(19) }, Load { destination: Relative(20), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(16) }, Load { destination: Relative(21), source_pointer: Relative(23) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(22) }, Load { destination: Relative(23), source_pointer: Relative(25) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(17) }, Store { destination_pointer: Relative(26), source: Relative(21) }, Mov { destination: Direct(32771), source: Relative(24) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(23) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Store { destination_pointer: Relative(21), source: Relative(18) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(22) }, Store { destination_pointer: Relative(18), source: Relative(20) }, Store { destination_pointer: Relative(1), source: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, JumpIf { condition: Relative(16), location: 6144 }, Call { location: 4434 }, Store { destination_pointer: Relative(8), source: Relative(14) }, Jump { location: 6146 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Relative(7), source: Relative(14) }, Jump { location: 5957 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 5896 }, Jump { location: 6152 }, Return, Call { location: 1533 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 6163 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 6167 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 6172 }, Jump { location: 6170 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 6167 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16291778408346427203 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 3078107792722303059 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 6201 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 6205 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 6210 }, Jump { location: 6208 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(7), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(9), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 6205 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 10951819287827820458 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 6246 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32842) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32867) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Direct(32869) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(4), rhs: Direct(32882) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 6292 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 6302 }, Jump { location: 6295 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Return, JumpIf { condition: Relative(10), location: 6304 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(17) }, Load { destination: Relative(10), source_pointer: Relative(19) }, JumpIf { condition: Relative(12), location: 6337 }, Jump { location: 6316 }, JumpIf { condition: Relative(13), location: 6332 }, Jump { location: 6318 }, JumpIf { condition: Relative(14), location: 6327 }, Jump { location: 6320 }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(4), rhs: Direct(32884) }, JumpIf { condition: Relative(19), location: 6324 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(16), rhs: Direct(32849) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 6330 }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(16), rhs: Direct(32846) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 6330 }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 6335 }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(16), rhs: Direct(32904) }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 6335 }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 6340 }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Relative(16), rhs: Direct(32845) }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 6340 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Relative(8) }, Mov { destination: Relative(20), source: Relative(6) }, Mov { destination: Relative(21), source: Relative(15) }, Mov { destination: Relative(22), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(10) }, Jump { location: 6292 }, Call { location: 1533 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6362 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(4), rhs: Direct(32867) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(4), rhs: Direct(32869) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32882) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 6369 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 6373 }, Jump { location: 6372 }, Return, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(11), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 6378 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32847) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Relative(18), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(16) }, Mov { destination: Relative(19), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Not { destination: Relative(20), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(20), rhs: Relative(12) }, JumpIf { condition: Relative(17), location: 6414 }, Jump { location: 6495 }, JumpIf { condition: Relative(7), location: 6437 }, Jump { location: 6416 }, JumpIf { condition: Relative(8), location: 6432 }, Jump { location: 6418 }, JumpIf { condition: Relative(10), location: 6427 }, Jump { location: 6420 }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(4), rhs: Direct(32884) }, JumpIf { condition: Relative(21), location: 6424 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(22) } }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(16), rhs: Direct(32849) }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 6430 }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(16), rhs: Direct(32846) }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 6430 }, Mov { destination: Relative(17), source: Relative(20) }, Jump { location: 6435 }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Relative(16), rhs: Direct(32904) }, Mov { destination: Relative(17), source: Relative(20) }, Jump { location: 6435 }, Mov { destination: Relative(12), source: Relative(17) }, Jump { location: 6440 }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Relative(16), rhs: Direct(32845) }, Mov { destination: Relative(12), source: Relative(17) }, Jump { location: 6440 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(11) }, Mov { destination: Relative(22), source: Relative(15) }, Mov { destination: Relative(23), source: Relative(18) }, Mov { destination: Relative(24), source: Relative(19) }, Mov { destination: Relative(25), source: Relative(14) }, Mov { destination: Relative(26), source: Relative(12) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 4440 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(12), source_pointer: Relative(11) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(18) }, Load { destination: Relative(15), source_pointer: Relative(19) }, Load { destination: Relative(16), source_pointer: Relative(1) }, Load { destination: Relative(17), source_pointer: Relative(2) }, Load { destination: Relative(18), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(16) }, JumpIf { condition: Relative(19), location: 6461 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(17) }, Call { location: 4454 }, Mov { destination: Relative(19), source: Direct(32772) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(9) }, Store { destination_pointer: Relative(21), source: Relative(12) }, Mov { destination: Direct(32771), source: Relative(19) }, Call { location: 4454 }, Mov { destination: Relative(9), source: Direct(32772) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(9) }, Call { location: 4454 }, Mov { destination: Relative(12), source: Direct(32772) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Store { destination_pointer: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(12) }, Call { location: 4454 }, Mov { destination: Relative(11), source: Direct(32772) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Store { destination_pointer: Relative(14), source: Relative(15) }, Store { destination_pointer: Relative(1), source: Relative(16) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(18) }, Jump { location: 6495 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(9) }, Jump { location: 6369 }, Call { location: 1533 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 6508 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32842) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32866) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 6552 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 6562 }, Jump { location: 6555 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Return, JumpIf { condition: Relative(10), location: 6564 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(16) }, Load { destination: Relative(10), source_pointer: Relative(18) }, JumpIf { condition: Relative(12), location: 6585 }, Jump { location: 6576 }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(4), rhs: Direct(32891) }, JumpIf { condition: Relative(16), location: 6580 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(17) } }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(15), rhs: Direct(32845) }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(10), rhs: Direct(32845) }, Mov { destination: Relative(13), source: Relative(16) }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 6590 }, BinaryFieldOp { destination: Relative(16), op: Add, lhs: Relative(15), rhs: Direct(32843) }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(10), rhs: Direct(32845) }, Mov { destination: Relative(13), source: Relative(16) }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 6590 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Relative(13) }, Mov { destination: Relative(20), source: Relative(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(10) }, Jump { location: 6552 }, Call { location: 1533 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 7065 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 6621 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 6765 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6639 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Mov { destination: Relative(6), source: Direct(32838) }, Jump { location: 6643 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 6646 }, Jump { location: 6764 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6654 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(6), rhs: Relative(6) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 6664 }, BinaryIntOp { destination: Relative(16), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 6664 }, Call { location: 4431 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 6668 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(13), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 6673 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 6679 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32847) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, Not { destination: Relative(16), source: Relative(13), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Or, bit_size: U1, lhs: Relative(17), rhs: Relative(16) }, JumpIf { condition: Relative(13), location: 6706 }, Jump { location: 6701 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 6704 }, Jump { location: 6718 }, Store { destination_pointer: Relative(9), source: Direct(32841) }, Jump { location: 6718 }, Store { destination_pointer: Relative(9), source: Direct(32841) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(15), location: 6712 }, Call { location: 4434 }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 6718 }, Load { destination: Relative(12), source_pointer: Relative(9) }, JumpIf { condition: Relative(12), location: 6724 }, Jump { location: 6721 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 6643 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(10), location: 6730 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(7) }, Call { location: 4454 }, Mov { destination: Relative(10), source: Direct(32772) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Store { destination_pointer: Relative(12), source: Direct(32841) }, Mov { destination: Direct(32771), source: Relative(10) }, Call { location: 4454 }, Mov { destination: Relative(7), source: Direct(32772) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(7) }, Call { location: 4454 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(4) }, Store { destination_pointer: Relative(11), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 4454 }, Mov { destination: Relative(4), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Store { destination_pointer: Relative(3), source: Relative(9) }, Jump { location: 6764 }, Return, Call { location: 1533 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 6786 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Direct(32842) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 6857 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Cast { destination: Relative(7), source: Relative(4), bit_size: Integer(U32) }, Cast { destination: Relative(5), source: Relative(7), bit_size: Field }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(4) }, Return, Load { destination: Direct(32775), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32776), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Load { destination: Direct(32777), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32780), op: LessThanEquals, bit_size: U32, lhs: Direct(32779), rhs: Direct(32777) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32775), rhs: Direct(2) }, JumpIf { condition: Direct(32780), location: 6812 }, Jump { location: 6829 }, JumpIf { condition: Direct(32781), location: 6814 }, Jump { location: 6818 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, Jump { location: 6828 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(32783) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32782) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32777) }, Jump { location: 6828 }, Jump { location: 6841 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32782), op: Mul, bit_size: U32, lhs: Direct(32779), rhs: Direct(32783) }, Const { destination: Direct(32784), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(32784) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32783) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32779) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32782) }, Jump { location: 6841 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, JumpIf { condition: Direct(32781), location: 6855 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(32776) }, Mov { destination: Direct(32784), source: Direct(32778) }, Mov { destination: Direct(32785), source: Direct(32780) }, BinaryIntOp { destination: Direct(32786), op: Equals, bit_size: U32, lhs: Direct(32784), rhs: Direct(32783) }, JumpIf { condition: Direct(32786), location: 6855 }, Load { destination: Direct(32782), source_pointer: Direct(32784) }, Store { destination_pointer: Direct(32785), source: Direct(32782) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32785), op: Add, bit_size: U32, lhs: Direct(32785), rhs: Direct(2) }, Jump { location: 6848 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(32776) }, Return, Call { location: 1533 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 6864 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Cast { destination: Relative(4), source: Relative(1), bit_size: Field }, Const { destination: Relative(6), bit_size: Field, value: 18446744073709551616 }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(6) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 6911 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 6915 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 6942 }, Jump { location: 6918 }, Load { destination: Relative(1), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(2), location: 6923 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Const { destination: Relative(1), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 7512 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Store { destination_pointer: Relative(6), source: Relative(3) }, Store { destination_pointer: Relative(8), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Load { destination: Relative(1), source_pointer: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 6944 }, Call { location: 4437 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Load { destination: Relative(9), source_pointer: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U1, lhs: Relative(10), rhs: Direct(32837) }, JumpIf { condition: Relative(11), location: 6954 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, JumpIf { condition: Relative(10), location: 6980 }, Jump { location: 6957 }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Load { destination: Relative(11), source_pointer: Relative(6) }, Load { destination: Relative(12), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Direct(32836) }, JumpIf { condition: Relative(13), location: 6964 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Store { destination_pointer: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, JumpIf { condition: Relative(9), location: 6975 }, Call { location: 4434 }, Store { destination_pointer: Relative(7), source: Relative(13) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(8), source: Relative(12) }, Jump { location: 7003 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7512 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Load { destination: Relative(11), source_pointer: Relative(8) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, Store { destination_pointer: Relative(13), source: Relative(5) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Direct(32842) }, Store { destination_pointer: Relative(8), source: Relative(11) }, Jump { location: 7003 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 6915 }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32775), source_pointer: Direct(32775) }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32775), rhs: Direct(32772) }, Load { destination: Direct(32777), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Const { destination: Direct(32780), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32780) }, JumpIf { condition: Direct(32778), location: 7015 }, Jump { location: 7019 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Jump { location: 7041 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32781) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32780) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Mov { destination: Direct(32783), source: Direct(32779) }, Mov { destination: Direct(32784), source: Direct(32780) }, BinaryIntOp { destination: Direct(32785), op: Equals, bit_size: U32, lhs: Direct(32783), rhs: Direct(32782) }, JumpIf { condition: Direct(32785), location: 7040 }, Load { destination: Direct(32781), source_pointer: Direct(32783) }, Store { destination_pointer: Direct(32784), source: Direct(32781) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, Jump { location: 7033 }, Jump { location: 7041 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 7047 }, Jump { location: 7049 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 7064 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 7061 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 7054 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 7064 }, Return, Call { location: 1533 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7074 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 7080 }, Call { location: 4434 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7087 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(4), op: Div, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 7511 }, Jump { location: 7093 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7101 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Div, bit_size: U32, lhs: Relative(6), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(7), location: 7108 }, Call { location: 4431 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 7128 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 7483 }, Jump { location: 7131 }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 7151 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(13) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(13) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 7177 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 7181 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(11), location: 7432 }, Jump { location: 7184 }, Load { destination: Relative(8), source_pointer: Relative(13) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 7192 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Direct(32865) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32883) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32886) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32893) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32886) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32876) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32894) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32871) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32879) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32874) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32883) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32890) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32890) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32878) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32886) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32893) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32874) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32878) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32871) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32894) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32872) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32898) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32890) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32876) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32870) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32899) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32879) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32883) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32890) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32858) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32872) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32893) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32877) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32886) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32898) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32889) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32879) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32890) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32870) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32899) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32859) }, Load { destination: Relative(13), source_pointer: Relative(9) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 7369 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 7395 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, Mov { destination: Relative(17), source: Relative(16) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(18) }, Mov { destination: Direct(32772), source: Relative(17) }, Mov { destination: Direct(32773), source: Relative(19) }, Call { location: 23 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(18) }, Store { destination_pointer: Relative(17), source: Direct(32844) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(10) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(8) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(16), size: Relative(15) } }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 7397 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 7407 }, Jump { location: 7400 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Jump { location: 7511 }, JumpIf { condition: Relative(10), location: 7409 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Load { destination: Relative(10), source_pointer: Relative(14) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Relative(6) }, Mov { destination: Relative(17), source: Relative(11) }, Mov { destination: Relative(18), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 6603 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(10) }, Jump { location: 7397 }, JumpIf { condition: Relative(11), location: 7434 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32844) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(11), source_pointer: Relative(19) }, Not { destination: Relative(15), source: Relative(11), bit_size: U1 }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U1, lhs: Relative(15), rhs: Relative(12) }, JumpIf { condition: Relative(11), location: 7458 }, Jump { location: 7480 }, Load { destination: Relative(11), source_pointer: Relative(13) }, Load { destination: Relative(12), source_pointer: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(12) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 7466 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(19), source: Direct(32773) }, Mov { destination: Relative(20), source: Direct(32774) }, Store { destination_pointer: Relative(20), source: Relative(16) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Store { destination_pointer: Relative(13), source: Relative(15) }, Store { destination_pointer: Relative(14), source: Relative(19) }, Jump { location: 7480 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(11) }, Jump { location: 7181 }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 7491 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6801 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32839) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32837) }, Store { destination_pointer: Relative(7), source: Relative(10) }, Store { destination_pointer: Relative(9), source: Relative(12) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 7128 }, Return, Call { location: 1533 }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 7515 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(6), location: 7543 }, Jump { location: 7518 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7525 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BlackBox(Poseidon2Permutation { message: HeapVector { pointer: Relative(8), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 4 }, len: Direct(32847) }), Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Return, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 7547 }, Jump { location: 7570 }, Load { destination: Relative(6), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryFieldOp { destination: Relative(10), op: Add, lhs: Relative(7), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 7043 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Jump { location: 7570 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 7515 }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", @@ -260,7 +260,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "22": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 7811498a3ca..75f62dfff4d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -233,7 +233,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32921 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 12 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32909), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32909 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 23 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 34 }, Call { location: 109 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32921 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 33 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 26 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 6 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 3 }, Const { destination: Direct(32837), bit_size: Integer(U1), value: 0 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32839), bit_size: Integer(U64), value: 0 }, Const { destination: Direct(32840), bit_size: Field, value: 0 }, Const { destination: Direct(32841), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32842), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32843), bit_size: Field, value: 1 }, Const { destination: Direct(32844), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32845), bit_size: Field, value: 2 }, Const { destination: Direct(32846), bit_size: Field, value: 3 }, Const { destination: Direct(32847), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32848), bit_size: Integer(U32), value: 5 }, Const { destination: Direct(32849), bit_size: Field, value: 5 }, Const { destination: Direct(32850), bit_size: Field, value: 6 }, Const { destination: Direct(32851), bit_size: Field, value: 7 }, Const { destination: Direct(32852), bit_size: Field, value: 11 }, Const { destination: Direct(32853), bit_size: Field, value: 12 }, Const { destination: Direct(32854), bit_size: Field, value: 13 }, Const { destination: Direct(32855), bit_size: Field, value: 30 }, Const { destination: Direct(32856), bit_size: Integer(U8), value: 32 }, Const { destination: Direct(32857), bit_size: Integer(U8), value: 34 }, Const { destination: Direct(32858), bit_size: Field, value: 42 }, Const { destination: Direct(32859), bit_size: Integer(U8), value: 44 }, Const { destination: Direct(32860), bit_size: Integer(U8), value: 46 }, Const { destination: Direct(32861), bit_size: Integer(U8), value: 49 }, Const { destination: Direct(32862), bit_size: Integer(U8), value: 50 }, Const { destination: Direct(32863), bit_size: Integer(U8), value: 51 }, Const { destination: Direct(32864), bit_size: Field, value: 55 }, Const { destination: Direct(32865), bit_size: Integer(U8), value: 58 }, Const { destination: Direct(32866), bit_size: Integer(U8), value: 65 }, Const { destination: Direct(32867), bit_size: Integer(U8), value: 69 }, Const { destination: Direct(32868), bit_size: Integer(U8), value: 73 }, Const { destination: Direct(32869), bit_size: Field, value: 75 }, Const { destination: Direct(32870), bit_size: Field, value: 77 }, Const { destination: Direct(32871), bit_size: Integer(U8), value: 78 }, Const { destination: Direct(32872), bit_size: Field, value: 79 }, Const { destination: Direct(32873), bit_size: Integer(U8), value: 95 }, Const { destination: Direct(32874), bit_size: Integer(U8), value: 97 }, Const { destination: Direct(32875), bit_size: Integer(U8), value: 98 }, Const { destination: Direct(32876), bit_size: Integer(U8), value: 99 }, Const { destination: Direct(32877), bit_size: Integer(U8), value: 100 }, Const { destination: Direct(32878), bit_size: Integer(U8), value: 101 }, Const { destination: Direct(32879), bit_size: Integer(U8), value: 102 }, Const { destination: Direct(32880), bit_size: Integer(U8), value: 103 }, Const { destination: Direct(32881), bit_size: Integer(U8), value: 104 }, Const { destination: Direct(32882), bit_size: Integer(U8), value: 105 }, Const { destination: Direct(32883), bit_size: Integer(U8), value: 107 }, Const { destination: Direct(32884), bit_size: Integer(U8), value: 108 }, Const { destination: Direct(32885), bit_size: Field, value: 108 }, Const { destination: Direct(32886), bit_size: Integer(U8), value: 109 }, Const { destination: Direct(32887), bit_size: Field, value: 109 }, Const { destination: Direct(32888), bit_size: Integer(U8), value: 110 }, Const { destination: Direct(32889), bit_size: Integer(U8), value: 111 }, Const { destination: Direct(32890), bit_size: Integer(U8), value: 112 }, Const { destination: Direct(32891), bit_size: Field, value: 112 }, Const { destination: Direct(32892), bit_size: Field, value: 113 }, Const { destination: Direct(32893), bit_size: Integer(U8), value: 114 }, Const { destination: Direct(32894), bit_size: Integer(U8), value: 115 }, Const { destination: Direct(32895), bit_size: Field, value: 115 }, Const { destination: Direct(32896), bit_size: Integer(U8), value: 116 }, Const { destination: Direct(32897), bit_size: Integer(U8), value: 117 }, Const { destination: Direct(32898), bit_size: Integer(U8), value: 118 }, Const { destination: Direct(32899), bit_size: Field, value: 118 }, Const { destination: Direct(32900), bit_size: Integer(U8), value: 119 }, Const { destination: Direct(32901), bit_size: Integer(U8), value: 121 }, Const { destination: Direct(32902), bit_size: Integer(U8), value: 123 }, Const { destination: Direct(32903), bit_size: Integer(U8), value: 125 }, Const { destination: Direct(32904), bit_size: Field, value: 134 }, Const { destination: Direct(32905), bit_size: Field, value: 135 }, Const { destination: Direct(32906), bit_size: Field, value: 136 }, Const { destination: Direct(32907), bit_size: Field, value: 138 }, Const { destination: Direct(32908), bit_size: Field, value: 10944121435919637611123202872628637544274182200208017171849102093287904247809 }, Return, Call { location: 188 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32844) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 194 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32847) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 440 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32848) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 750 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 153 }, Call { location: 938 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 941 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, Mov { destination: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 1521 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1690 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2086 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 4 }, Mov { destination: Relative(4), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2530 }, Mov { destination: Direct(0), source: Relative(0) }, Return, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 193 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32842) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 230 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 250 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, JumpIf { condition: Relative(9), location: 255 }, Call { location: 3463 }, Load { destination: Relative(7), source_pointer: Relative(4) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 262 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(9) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Direct(32842) }, Mov { destination: Relative(18), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(15) }, Mov { destination: Relative(12), source: Relative(16) }, JumpIf { condition: Relative(9), location: 277 }, Call { location: 3572 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, Store { destination_pointer: Relative(9), source: Direct(32868) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32888) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32894) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32893) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32896) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32877) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32902) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32898) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32874) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32884) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32897) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32903) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32875) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32897) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32896) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32880) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32889) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32896) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32902) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32880) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32889) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32896) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32903) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32879) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32889) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32893) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32896) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32881) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32894) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32874) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32886) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32856) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32883) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32878) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32901) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32860) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(2), rhs: Relative(12) }, JumpIf { condition: Relative(7), location: 402 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, Mov { destination: Relative(14), source: Relative(13) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(15) }, Mov { destination: Direct(32772), source: Relative(14) }, Mov { destination: Direct(32773), source: Relative(16) }, Call { location: 23 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(15) }, Store { destination_pointer: Relative(14), source: Direct(32844) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(13), size: Relative(9) } }, Const { destination: Relative(2), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Relative(6) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(5) }, Load { destination: Relative(3), source_pointer: Relative(6) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 419 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32838) }, JumpIf { condition: Relative(5), location: 424 }, Call { location: 3723 }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Direct(32838) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(13) }, Mov { destination: Relative(5), source: Relative(14) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(4), rhs: Direct(32837) }, JumpIf { condition: Relative(1), location: 439 }, Call { location: 3726 }, Return, Call { location: 188 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 476 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 480 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, JumpIf { condition: Relative(4), location: 737 }, Jump { location: 483 }, Load { destination: Relative(3), source_pointer: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 491 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U8), value: 85 }, Const { destination: Relative(8), bit_size: Integer(U8), value: 72 }, Const { destination: Relative(9), bit_size: Integer(U8), value: 77 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Relative(6) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32894) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32881) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(9) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32890) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32884) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32878) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32888) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32880) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32896) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32881) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32886) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32897) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32894) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32896) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32878) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32861) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32859) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32880) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32889) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32896) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32902) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32884) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32878) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32888) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32903) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32860) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, JumpIf { condition: Relative(6), location: 597 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 40 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, Mov { destination: Relative(11), source: Relative(9) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U64), value: 7511829951750337011 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 37 }, Mov { destination: Direct(32771), source: Relative(12) }, Mov { destination: Direct(32772), source: Relative(11) }, Mov { destination: Direct(32773), source: Relative(13) }, Call { location: 23 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(12) }, Store { destination_pointer: Relative(11), source: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Direct(32842) }, Mov { destination: Relative(13), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(6), source: Relative(11) }, JumpIf { condition: Relative(5), location: 611 }, Call { location: 3572 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Direct(32868) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32888) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32894) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32893) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32896) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32877) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32902) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32898) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32874) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32884) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32897) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32903) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32875) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32897) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32896) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32880) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32889) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32896) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32902) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32880) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32889) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32896) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32903) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32879) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32889) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32893) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32896) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32881) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32894) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32874) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32886) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32856) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32883) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32878) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32901) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32860) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(2), rhs: Relative(6) }, JumpIf { condition: Relative(3), location: 736 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(5) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(8) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 23 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(9) }, Store { destination_pointer: Relative(8), source: Direct(32844) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(5), size: Relative(4) } }, Return, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(5) }, Mov { destination: Relative(10), source: Relative(6) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(4) }, Jump { location: 480 }, Call { location: 188 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 786 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 816 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, JumpIf { condition: Relative(6), location: 821 }, Call { location: 3729 }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Direct(32842) }, Mov { destination: Relative(14), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(11) }, Mov { destination: Relative(6), source: Relative(12) }, JumpIf { condition: Relative(5), location: 835 }, Call { location: 3572 }, Const { destination: Relative(1), bit_size: Integer(U8), value: 120 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32867) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(1) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32890) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32878) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32876) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32896) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32878) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32877) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32856) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32902) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32888) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32878) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32900) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32873) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32898) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32874) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32884) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32897) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32878) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32903) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32859) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32856) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32875) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32897) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32896) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32856) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32880) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32889) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32896) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32856) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32902) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32880) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32889) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32896) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32903) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32860) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(6), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 937 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 40 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(5) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U64), value: 3316745884754988903 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 36 }, Mov { destination: Direct(32771), source: Relative(10) }, Mov { destination: Direct(32772), source: Relative(8) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 23 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, Store { destination_pointer: Relative(8), source: Direct(32844) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(5), size: Relative(4) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32842) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 977 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 985 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Direct(32868) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32888) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32894) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32878) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32893) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32896) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32882) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32888) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32880) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32856) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32902) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32878) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32888) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32896) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32893) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32901) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32903) }, Const { destination: Relative(9), bit_size: Integer(U8), value: 91 }, Const { destination: Relative(10), bit_size: Integer(U8), value: 93 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 96 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Direct(32902) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32888) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32865) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32894) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32896) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32893) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32897) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32876) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32896) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32888) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32874) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32886) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32865) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32888) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32896) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32893) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32901) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32879) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32884) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32894) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32865) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32901) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32902) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32888) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32865) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32879) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32884) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32903) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(9) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32898) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32874) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32884) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32897) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32902) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32888) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32865) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32879) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32882) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32884) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32857) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32903) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32903) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1225 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(7), location: 1481 }, Jump { location: 1228 }, Load { destination: Relative(3), source_pointer: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1236 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, Store { destination_pointer: Relative(11), source: Direct(32902) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32883) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32865) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32897) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32894) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32880) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32896) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32880) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32893) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32859) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32900) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32896) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32881) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32857) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32865) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32863) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32862) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32903) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), MemoryAddress(Relative(7)), HeapArray(HeapArray { pointer: Relative(10), size: 37 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Simple(Integer(U32)), Array { value_types: [Simple(Integer(U8))], size: 37 }, Simple(Integer(U1))] }, Load { destination: Relative(8), source_pointer: Relative(3) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1325 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(8) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32835) }, JumpIf { condition: Relative(3), location: 1330 }, Call { location: 3732 }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1336 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Direct(32871) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32889) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32896) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32856) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32879) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32889) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32897) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32856) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32882) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32894) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32893) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32896) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32877) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32856) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32883) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32901) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32856) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32902) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32888) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32896) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32893) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32901) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32873) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32883) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32878) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32901) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32903) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Direct(32860) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1415 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(7), location: 1431 }, Jump { location: 1418 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(4) }, Mov { destination: Relative(9), source: Relative(5) }, Mov { destination: Relative(10), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3735 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32838) }, JumpIf { condition: Relative(2), location: 1430 }, Call { location: 3764 }, Return, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Load { destination: Relative(7), source_pointer: Relative(4) }, Load { destination: Relative(9), source_pointer: Relative(5) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1444 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(13), source: Relative(17) }, JumpIf { condition: Relative(11), location: 1478 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 38 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9862881900111276825 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 35 }, Mov { destination: Direct(32771), source: Relative(14) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(15) }, Call { location: 23 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 35 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(14) }, Store { destination_pointer: Relative(10), source: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(7) } }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(7) }, Jump { location: 1415 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(12) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1495 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1503 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(9), size: 17 }), MemoryAddress(Direct(32842)), MemoryAddress(Relative(8)), MemoryAddress(Relative(7)), HeapArray(HeapArray { pointer: Relative(13), size: 95 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 17 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 95 }, Simple(Integer(U1))] }, Const { destination: Relative(9), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Relative(6) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(7) }, Jump { location: 1225 }, Call { location: 188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32837) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32842) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32842) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Load { destination: Relative(9), source_pointer: Relative(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1586 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1590 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(9), location: 1659 }, Jump { location: 1593 }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1602 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Load { destination: Relative(11), source_pointer: Relative(6) }, Load { destination: Relative(12), source_pointer: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1613 }, Call { location: 938 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(12) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(4) }, Mov { destination: Relative(18), source: Relative(5) }, Mov { destination: Relative(19), source: Relative(3) }, Mov { destination: Relative(20), source: Relative(10) }, Mov { destination: Relative(21), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 3767 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(16) }, JumpIf { condition: Relative(12), location: 1629 }, Call { location: 3866 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Load { destination: Relative(3), source_pointer: Relative(10) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(8) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(1) }, Mov { destination: Relative(19), source: Relative(3) }, Mov { destination: Relative(20), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 3767 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(15) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(6), rhs: Direct(32837) }, JumpIf { condition: Relative(1), location: 1658 }, Call { location: 3869 }, Return, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(13) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(10) }, Mov { destination: Relative(17), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(8) }, Mov { destination: Relative(15), source: Relative(6) }, Mov { destination: Relative(16), source: Relative(10) }, Mov { destination: Relative(17), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(9) }, Jump { location: 1590 }, Call { location: 188 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 1726 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32849) }, Mov { destination: Relative(12), source: Direct(32852) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32845) }, Mov { destination: Relative(12), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32852) }, Mov { destination: Relative(12), source: Direct(32849) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32907) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 3872 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 1775 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, JumpIf { condition: Relative(4), location: 1780 }, Call { location: 4049 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Direct(32844) }, Mov { destination: Relative(12), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(9) }, Mov { destination: Relative(4), source: Relative(10) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(2), rhs: Direct(32837) }, JumpIf { condition: Relative(1), location: 1795 }, Call { location: 4052 }, Return, Call { location: 188 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32845) }, Mov { destination: Relative(10), source: Direct(32846) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32849) }, Mov { destination: Relative(10), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32852) }, Mov { destination: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 1865 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(4) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4055 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(6), source: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 4338 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(10) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1891 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1902 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Direct(32838) }, Mov { destination: Relative(13), source: Direct(32844) }, Mov { destination: Relative(14), source: Direct(32904) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4370 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1920 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4514 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4338 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(14) }, Load { destination: Relative(1), source_pointer: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1946 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(11) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1957 }, Call { location: 938 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32905) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4370 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(11), source_pointer: Relative(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(16) }, Mov { destination: Relative(12), source: Relative(17) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(12) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5097 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(15) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 1993 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2004 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32906) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 5166 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(4) }, Store { destination_pointer: Relative(14), source: Direct(32845) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32849) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32852) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 5310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(16) }, JumpIf { condition: Relative(4), location: 2037 }, Call { location: 5342 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(4) }, Store { destination_pointer: Relative(7), source: Direct(32846) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32851) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(11) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 5310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, JumpIf { condition: Relative(4), location: 2058 }, Call { location: 5345 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(4) }, Store { destination_pointer: Relative(7), source: Direct(32845) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32846) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32849) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32851) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32852) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 5348 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, JumpIf { condition: Relative(4), location: 2085 }, Call { location: 5390 }, Return, Call { location: 188 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32845) }, Mov { destination: Relative(10), source: Direct(32846) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32849) }, Mov { destination: Relative(10), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32852) }, Mov { destination: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32885) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5393 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32887) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5510 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 2173 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4055 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4338 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(10) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2199 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2210 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Direct(32838) }, Mov { destination: Relative(16), source: Direct(32844) }, Mov { destination: Relative(17), source: Direct(32891) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4370 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2228 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 4514 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(16) }, Mov { destination: Relative(13), source: Relative(17) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(13) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 4338 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 2254 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2265 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 4370 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2283 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 15 }, Const { destination: Relative(14), bit_size: Field, value: 33 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Direct(32850) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 5310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(14), source: Relative(18) }, Const { destination: Relative(15), bit_size: Integer(U8), value: 71 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(17) }, Store { destination_pointer: Relative(18), source: Relative(15) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32876) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32893) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32893) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32876) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32893) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32874) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32879) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32883) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32901) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32894) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32865) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32902) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32883) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32901) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32894) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32903) }, JumpIf { condition: Relative(14), location: 2417 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 44 }, Mov { destination: Relative(17), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 44 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, Mov { destination: Relative(18), source: Relative(17) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U64), value: 2386996775688025706 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 39 }, Mov { destination: Direct(32771), source: Relative(19) }, Mov { destination: Direct(32772), source: Relative(18) }, Mov { destination: Direct(32773), source: Relative(20) }, Call { location: 23 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 39 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(19) }, Store { destination_pointer: Relative(18), source: Direct(32842) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(19) }, Mov { destination: Direct(32772), source: Relative(18) }, Mov { destination: Direct(32773), source: Relative(20) }, Call { location: 23 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(19) }, Trap { revert_data: HeapVector { pointer: Relative(17), size: Relative(15) } }, Const { destination: Relative(10), bit_size: Field, value: 35 }, Const { destination: Relative(14), bit_size: Field, value: 65 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(10) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(4) }, Mov { destination: Relative(18), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 5310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(17) }, JumpIf { condition: Relative(5), location: 2440 }, Call { location: 5345 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32895) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5655 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(15) }, Mov { destination: Relative(5), source: Relative(16) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5097 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(15) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 2476 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2487 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32899) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 5166 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(1), bit_size: Field, value: 70 }, Const { destination: Relative(4), bit_size: Field, value: 66 }, Const { destination: Relative(10), bit_size: Field, value: 130 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(15) }, Store { destination_pointer: Relative(16), source: Direct(32853) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32855) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32855) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(10) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 5348 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(16) }, JumpIf { condition: Relative(1), location: 2529 }, Call { location: 5390 }, Return, Call { location: 188 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32853) }, Mov { destination: Relative(10), source: Direct(32858) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 2578 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(6), location: 2584 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 2591 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(5) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Direct(32842) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 5760 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(6) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2618 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(4), location: 2624 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2641 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(6), location: 2647 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2653 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32843) }, Mov { destination: Relative(16), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(11), source_pointer: Relative(4) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2673 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(11) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(4), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 2680 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(1) }, Mov { destination: Relative(17), source: Direct(32843) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(11), source_pointer: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2697 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(11), location: 2703 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2709 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32843) }, Mov { destination: Relative(19), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Field, value: 4 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32846) }, Mov { destination: Relative(19), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32849) }, Mov { destination: Relative(19), source: Direct(32850) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 2750 }, Call { location: 938 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(14) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 2756 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(3) }, Mov { destination: Relative(19), source: Relative(1) }, Mov { destination: Relative(20), source: Direct(32846) }, Mov { destination: Relative(21), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(4) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 2774 }, Call { location: 938 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(14) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 2780 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(2) }, Mov { destination: Relative(19), source: Relative(3) }, Mov { destination: Relative(20), source: Relative(1) }, Mov { destination: Relative(21), source: Direct(32843) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3575 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(4) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(14) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 2797 }, Call { location: 938 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, JumpIf { condition: Relative(14), location: 2803 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(14) }, Store { destination_pointer: Relative(18), source: Direct(32902) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32883) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32877) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32865) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32897) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32894) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32880) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32877) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32880) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32893) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32859) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32900) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32882) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32877) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32896) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32881) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32857) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32865) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32863) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32862) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32903) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), MemoryAddress(Direct(32842)), HeapArray(HeapArray { pointer: Relative(14), size: 37 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Simple(Integer(U32)), Array { value_types: [Simple(Integer(U8))], size: 37 }, Simple(Integer(U1))] }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(5) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 2890 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(2) }, Mov { destination: Relative(20), source: Relative(3) }, Mov { destination: Relative(21), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3735 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 2908 }, Call { location: 938 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(18), location: 2914 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(18) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 2921 }, Call { location: 938 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 23 }, Mov { destination: Relative(23), source: Direct(0) }, Mov { destination: Relative(24), source: Relative(5) }, Mov { destination: Relative(25), source: Relative(4) }, Mov { destination: Relative(26), source: Direct(32838) }, Mov { destination: Relative(27), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(22) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(18), source: Relative(24) }, Mov { destination: Relative(21), source: Relative(25) }, JumpIf { condition: Relative(18), location: 3049 }, Jump { location: 2936 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 55 }, Const { destination: Relative(5), bit_size: Integer(U8), value: 33 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32871) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32889) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32898) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32874) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32884) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32897) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32879) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32889) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32893) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32883) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32901) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 57 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32902) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32883) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32882) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32888) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32877) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32865) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32894) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32896) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32893) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32882) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32888) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32859) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32884) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32888) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32896) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32881) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32865) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32861) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32903) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(4), size: 19 }), HeapArray(HeapArray { pointer: Relative(7), size: 29 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 19 }, Array { value_types: [Simple(Integer(U8))], size: 29 }, Simple(Integer(U1))] }, Jump { location: 3075 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3058 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, JumpIf { condition: Relative(7), location: 3074 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 3075 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3084 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 5783 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3100 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32869) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 5655 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32870) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 5393 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32872) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 5510 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Direct(32855) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 3872 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32839) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Const { destination: Relative(7), bit_size: Integer(U64), value: 2 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32843) }, Mov { destination: Relative(16), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6121 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(10), bit_size: Integer(U64), value: 4 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32846) }, Mov { destination: Relative(17), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 6121 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Direct(32846) }, Mov { destination: Relative(17), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 6121 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Direct(32843) }, Mov { destination: Relative(16), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6121 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(7) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6315 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(12) }, JumpIf { condition: Relative(4), location: 3268 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, Return, Call { location: 188 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 6414 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3287 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 6532 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 3305 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Mov { destination: Relative(6), source: Direct(32838) }, Jump { location: 3309 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 3312 }, Jump { location: 3462 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 3320 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(6), rhs: Relative(6) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 3330 }, BinaryIntOp { destination: Relative(16), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 3330 }, Call { location: 6568 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 3334 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(13), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 3339 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 3345 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32847) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(13) }, Mov { destination: Relative(16), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(15) }, Mov { destination: Relative(19), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(18) }, Mov { destination: Relative(20), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32837) }, Not { destination: Relative(21), source: Relative(13), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Or, bit_size: U1, lhs: Relative(18), rhs: Relative(21) }, JumpIf { condition: Relative(13), location: 3389 }, Jump { location: 3384 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 3387 }, Jump { location: 3401 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Jump { location: 3401 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(15), location: 3395 }, Call { location: 6571 }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 3401 }, Load { destination: Relative(12), source_pointer: Relative(20) }, JumpIf { condition: Relative(12), location: 3407 }, Jump { location: 3404 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 3309 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(9) }, Mov { destination: Relative(22), source: Relative(16) }, Mov { destination: Relative(23), source: Relative(19) }, Mov { destination: Relative(24), source: Relative(17) }, Mov { destination: Relative(25), source: Relative(4) }, Mov { destination: Relative(26), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 6577 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(16) }, Load { destination: Relative(6), source_pointer: Relative(19) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, JumpIf { condition: Relative(13), location: 3428 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(10) }, Call { location: 6591 }, Mov { destination: Relative(11), source: Direct(32772) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(4) }, Mov { destination: Direct(32771), source: Relative(11) }, Call { location: 6591 }, Mov { destination: Relative(4), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(4) }, Call { location: 6591 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 6591 }, Mov { destination: Relative(5), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(12) }, Jump { location: 3462 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 4105629585450304037 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3479 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6532 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(12) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(3) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3497 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 3501 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 3504 }, Jump { location: 3569 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3510 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, JumpIf { condition: Relative(10), location: 3520 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 3520 }, Call { location: 6568 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 3524 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(3), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 3529 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(3), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(10), location: 3535 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(3), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(10), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(3) }, JumpIf { condition: Relative(10), location: 3559 }, Jump { location: 3563 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(12), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 3566 }, Jump { location: 3562 }, Jump { location: 3563 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(3) }, Jump { location: 3501 }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 3569 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12632160011611521689 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3585 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 6532 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3603 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 3607 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 3610 }, Jump { location: 3722 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3618 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 3628 }, BinaryIntOp { destination: Relative(15), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, JumpIf { condition: Relative(14), location: 3628 }, Call { location: 6568 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 3632 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(10), op: Div, bit_size: U32, lhs: Relative(12), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 3637 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(12), rhs: Relative(14) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, JumpIf { condition: Relative(12), location: 3643 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(10), rhs: Direct(32847) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Not { destination: Relative(8), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 3667 }, Jump { location: 3671 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(14), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 3674 }, Jump { location: 3670 }, Jump { location: 3671 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 3607 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 3680 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(5) }, Call { location: 6591 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 6591 }, Mov { destination: Relative(5), source: Direct(32772) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, Store { destination_pointer: Relative(9), source: Relative(14) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(5) }, Call { location: 6591 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 6591 }, Mov { destination: Relative(7), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 3717 }, Call { location: 6617 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Jump { location: 3722 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 8082322909743101849 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 11665340019033496436 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 13674703438729013973 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 1359149291226868540 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Direct(32842) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 8591465503772373437 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3777 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3785 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 3790 }, Jump { location: 3805 }, Store { destination_pointer: Relative(7), source: Direct(32841) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3797 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 3801 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(8), location: 3807 }, Jump { location: 3804 }, Jump { location: 3805 }, Load { destination: Relative(1), source_pointer: Relative(7) }, Return, JumpIf { condition: Relative(8), location: 3809 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Not { destination: Relative(13), source: Relative(8), bit_size: U1 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U1, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 3835 }, Jump { location: 3863 }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3841 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(15) }, Mov { destination: Relative(10), source: Relative(16) }, JumpIf { condition: Relative(8), location: 3858 }, Jump { location: 3856 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 3863 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(8), location: 3863 }, Jump { location: 3861 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 3863 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(8) }, Jump { location: 3801 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 6665645948190457319 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14241324264716156348 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3881 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(4), rhs: Direct(32855) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(4), rhs: Direct(32891) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32892) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Direct(32904) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32905) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 3890 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 3894 }, Jump { location: 3893 }, Return, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(13), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 3899 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32847) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(9) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32844) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Load { destination: Relative(19), source_pointer: Relative(21) }, Not { destination: Relative(13), source: Relative(19), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(14) }, JumpIf { condition: Relative(17), location: 3923 }, Jump { location: 4046 }, JumpIf { condition: Relative(7), location: 3989 }, Jump { location: 3925 }, JumpIf { condition: Relative(8), location: 3977 }, Jump { location: 3927 }, JumpIf { condition: Relative(10), location: 3965 }, Jump { location: 3929 }, JumpIf { condition: Relative(11), location: 3953 }, Jump { location: 3931 }, JumpIf { condition: Relative(12), location: 3941 }, Jump { location: 3933 }, BinaryFieldOp { destination: Relative(22), op: Equals, lhs: Relative(4), rhs: Direct(32907) }, JumpIf { condition: Relative(22), location: 3937 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(23) } }, BinaryFieldOp { destination: Relative(22), op: Mul, lhs: Relative(16), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(23), op: Equals, lhs: Relative(22), rhs: Direct(32864) }, Mov { destination: Relative(21), source: Relative(23) }, Jump { location: 3951 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 24 }, Mov { destination: Relative(24), source: Direct(0) }, Mov { destination: Relative(25), source: Relative(16) }, Mov { destination: Relative(26), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(23) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(22), source: Relative(25) }, Mov { destination: Relative(21), source: Relative(22) }, Jump { location: 3951 }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 3963 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 23 }, Mov { destination: Relative(23), source: Direct(0) }, Mov { destination: Relative(24), source: Relative(16) }, Mov { destination: Relative(25), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(22) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(21), source: Relative(24) }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 3963 }, Mov { destination: Relative(19), source: Relative(20) }, Jump { location: 3975 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 22 }, Mov { destination: Relative(22), source: Direct(0) }, Mov { destination: Relative(23), source: Relative(16) }, Mov { destination: Relative(24), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(21) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(20), source: Relative(23) }, Mov { destination: Relative(19), source: Relative(20) }, Jump { location: 3975 }, Mov { destination: Relative(17), source: Relative(19) }, Jump { location: 3987 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(16) }, Mov { destination: Relative(23), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(19), source: Relative(22) }, Mov { destination: Relative(17), source: Relative(19) }, Jump { location: 3987 }, Mov { destination: Relative(13), source: Relative(17) }, Jump { location: 3996 }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(16), rhs: Direct(32840) }, Not { destination: Relative(19), source: Relative(17), bit_size: U1 }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(18), rhs: Direct(32840) }, Not { destination: Relative(20), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(19), rhs: Relative(20) }, Mov { destination: Relative(13), source: Relative(17) }, Jump { location: 3996 }, JumpIf { condition: Relative(13), location: 4046 }, Jump { location: 3998 }, Load { destination: Relative(13), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(17), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(19), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(13) }, JumpIf { condition: Relative(19), location: 4003 }, Call { location: 6617 }, Load { destination: Relative(13), source_pointer: Relative(1) }, Load { destination: Relative(19), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(17) }, Load { destination: Relative(13), source_pointer: Relative(1) }, Load { destination: Relative(17), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(13) }, JumpIf { condition: Relative(20), location: 4012 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(19) }, Call { location: 6591 }, Mov { destination: Relative(20), source: Direct(32772) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(22) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(22), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(20) }, Call { location: 6591 }, Mov { destination: Relative(9), source: Direct(32772) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(15) }, Store { destination_pointer: Relative(19), source: Relative(16) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(9) }, Call { location: 6591 }, Mov { destination: Relative(15), source: Direct(32772) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Store { destination_pointer: Relative(19), source: Relative(18) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(15) }, Call { location: 6591 }, Mov { destination: Relative(14), source: Direct(32772) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(9) }, Store { destination_pointer: Relative(18), source: Direct(32841) }, Store { destination_pointer: Relative(1), source: Relative(13) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(17) }, Jump { location: 4046 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(9) }, Jump { location: 3890 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16986922238178214607 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 15583592523844085222 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4080 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4084 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 4294 }, Jump { location: 4087 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 4095 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 80 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32901) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4266 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 4292 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 83 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 6693878053340631133 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 79 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 79 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 4296 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 4315 }, Jump { location: 4335 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4323 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 1 }, Call { location: 6624 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Jump { location: 4335 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4084 }, Call { location: 188 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 4345 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(3), location: 4351 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32847) }, Load { destination: Relative(3), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32848) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Call { location: 188 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 4395 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 4398 }, Jump { location: 4513 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4406 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, JumpIf { condition: Relative(7), location: 4512 }, Jump { location: 4411 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4419 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6680 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 4436 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 4444 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(13), location: 4510 }, Jump { location: 4448 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(11) }, Mov { destination: Relative(16), source: Relative(12) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 6717 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 4464 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 4470 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(15), source: Direct(32773) }, Mov { destination: Relative(16), source: Direct(32774) }, Store { destination_pointer: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Direct(32838), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 4484 }, Jump { location: 4508 }, Load { destination: Relative(8), source_pointer: Relative(15) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4490 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 4496 }, Call { location: 6617 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(12), source: Direct(32774) }, Store { destination_pointer: Relative(12), source: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Jump { location: 4508 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 4395 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 4395 }, Jump { location: 4513 }, Return, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4539 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4543 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 4757 }, Jump { location: 4546 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 4554 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4729 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 4755 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 85 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 85 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9965974553718638037 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 81 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 81 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 4759 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 4778 }, Jump { location: 4798 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4786 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 1 }, Call { location: 6624 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Jump { location: 4798 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4543 }, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4826 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4830 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 5046 }, Jump { location: 4833 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 4841 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 5018 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 5044 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 5048 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(13) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 5072 }, Jump { location: 5094 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5080 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(13), source: Direct(32773) }, Mov { destination: Relative(14), source: Direct(32774) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 5094 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4830 }, Call { location: 188 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 5104 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 5110 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(4) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 5132 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(1), location: 5137 }, Jump { location: 5135 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, BinaryIntOp { destination: Relative(1), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 5132 }, Call { location: 188 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 5191 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 5194 }, Jump { location: 5309 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5202 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, JumpIf { condition: Relative(7), location: 5308 }, Jump { location: 5207 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5215 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6680 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5232 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 5240 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(13), location: 5306 }, Jump { location: 5244 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(11) }, Mov { destination: Relative(16), source: Relative(12) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 6906 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 5260 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 5266 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(10) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(15), source: Direct(32773) }, Mov { destination: Relative(16), source: Direct(32774) }, Store { destination_pointer: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Direct(32838), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 5280 }, Jump { location: 5304 }, Load { destination: Relative(8), source_pointer: Relative(15) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5286 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(7) }, JumpIf { condition: Relative(10), location: 5292 }, Call { location: 6617 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(12), source: Direct(32774) }, Store { destination_pointer: Relative(12), source: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Jump { location: 5304 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 5191 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 5191 }, Jump { location: 5309 }, Return, Call { location: 188 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5320 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 5324 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 5329 }, Jump { location: 5327 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 5324 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16291778408346427203 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 3078107792722303059 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5358 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 5362 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 5367 }, Jump { location: 5365 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(7), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(9), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 5362 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 10951819287827820458 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 5403 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32842) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32870) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Direct(32872) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(4), rhs: Direct(32885) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 5449 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 5459 }, Jump { location: 5452 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Return, JumpIf { condition: Relative(10), location: 5461 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(17) }, Load { destination: Relative(10), source_pointer: Relative(19) }, JumpIf { condition: Relative(12), location: 5494 }, Jump { location: 5473 }, JumpIf { condition: Relative(13), location: 5489 }, Jump { location: 5475 }, JumpIf { condition: Relative(14), location: 5484 }, Jump { location: 5477 }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(4), rhs: Direct(32887) }, JumpIf { condition: Relative(19), location: 5481 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(16), rhs: Direct(32849) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 5487 }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(16), rhs: Direct(32846) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 5487 }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 5492 }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(16), rhs: Direct(32908) }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 5492 }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 5497 }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Relative(16), rhs: Direct(32845) }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 5497 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Relative(8) }, Mov { destination: Relative(20), source: Relative(6) }, Mov { destination: Relative(21), source: Relative(15) }, Mov { destination: Relative(22), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(10) }, Jump { location: 5449 }, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5519 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(4), rhs: Direct(32870) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(4), rhs: Direct(32872) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32885) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 5526 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 5530 }, Jump { location: 5529 }, Return, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(11), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 5535 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32847) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Relative(18), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(16) }, Mov { destination: Relative(19), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Not { destination: Relative(20), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(20), rhs: Relative(12) }, JumpIf { condition: Relative(17), location: 5571 }, Jump { location: 5652 }, JumpIf { condition: Relative(7), location: 5594 }, Jump { location: 5573 }, JumpIf { condition: Relative(8), location: 5589 }, Jump { location: 5575 }, JumpIf { condition: Relative(10), location: 5584 }, Jump { location: 5577 }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(4), rhs: Direct(32887) }, JumpIf { condition: Relative(21), location: 5581 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(22) } }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(16), rhs: Direct(32849) }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 5587 }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(16), rhs: Direct(32846) }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 5587 }, Mov { destination: Relative(17), source: Relative(20) }, Jump { location: 5592 }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Relative(16), rhs: Direct(32908) }, Mov { destination: Relative(17), source: Relative(20) }, Jump { location: 5592 }, Mov { destination: Relative(12), source: Relative(17) }, Jump { location: 5597 }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Relative(16), rhs: Direct(32845) }, Mov { destination: Relative(12), source: Relative(17) }, Jump { location: 5597 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(11) }, Mov { destination: Relative(22), source: Relative(15) }, Mov { destination: Relative(23), source: Relative(18) }, Mov { destination: Relative(24), source: Relative(19) }, Mov { destination: Relative(25), source: Relative(14) }, Mov { destination: Relative(26), source: Relative(12) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 6577 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(12), source_pointer: Relative(11) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(18) }, Load { destination: Relative(15), source_pointer: Relative(19) }, Load { destination: Relative(16), source_pointer: Relative(1) }, Load { destination: Relative(17), source_pointer: Relative(2) }, Load { destination: Relative(18), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(16) }, JumpIf { condition: Relative(19), location: 5618 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(17) }, Call { location: 6591 }, Mov { destination: Relative(19), source: Direct(32772) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(9) }, Store { destination_pointer: Relative(21), source: Relative(12) }, Mov { destination: Direct(32771), source: Relative(19) }, Call { location: 6591 }, Mov { destination: Relative(9), source: Direct(32772) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(9) }, Call { location: 6591 }, Mov { destination: Relative(12), source: Direct(32772) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Store { destination_pointer: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(12) }, Call { location: 6591 }, Mov { destination: Relative(11), source: Direct(32772) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Store { destination_pointer: Relative(14), source: Relative(15) }, Store { destination_pointer: Relative(1), source: Relative(16) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(18) }, Jump { location: 5652 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(9) }, Jump { location: 5526 }, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 5665 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32842) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32869) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 5709 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 5719 }, Jump { location: 5712 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Return, JumpIf { condition: Relative(10), location: 5721 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(16) }, Load { destination: Relative(10), source_pointer: Relative(18) }, JumpIf { condition: Relative(12), location: 5742 }, Jump { location: 5733 }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(4), rhs: Direct(32895) }, JumpIf { condition: Relative(16), location: 5737 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(17) } }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(15), rhs: Direct(32845) }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(10), rhs: Direct(32845) }, Mov { destination: Relative(13), source: Relative(16) }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 5747 }, BinaryFieldOp { destination: Relative(16), op: Add, lhs: Relative(15), rhs: Direct(32843) }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(10), rhs: Direct(32845) }, Mov { destination: Relative(13), source: Relative(16) }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 5747 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Relative(13) }, Mov { destination: Relative(20), source: Relative(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(10) }, Jump { location: 5709 }, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Relative(2) }, Mov { destination: Relative(10), source: Relative(3) }, Mov { destination: Relative(11), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(8) }, Mov { destination: Relative(5), source: Relative(9) }, JumpIf { condition: Relative(4), location: 5774 }, Jump { location: 5782 }, JumpIf { condition: Relative(4), location: 5777 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(1) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(5), rhs: Direct(32858) }, JumpIf { condition: Relative(1), location: 5781 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Jump { location: 5782 }, Return, Call { location: 188 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5790 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(7), source: Relative(11) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5808 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U8), value: 45 }, Const { destination: Relative(10), bit_size: Integer(U8), value: 62 }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, Store { destination_pointer: Relative(13), source: Direct(32902) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32883) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32901) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32903) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32902) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32898) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32874) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32884) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32897) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32878) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32903) }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(10) }, Store { destination_pointer: Relative(12), source: Direct(32902) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32883) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32882) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32888) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32877) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32865) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32882) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32878) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32884) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32877) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32903) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5892 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 5896 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(6), location: 6082 }, Jump { location: 5899 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5905 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 4055 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(13) }, Mov { destination: Relative(7), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 5923 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5931 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 5935 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 6034 }, Jump { location: 5938 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4514 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(6), source: Relative(11) }, Const { destination: Relative(1), bit_size: Integer(U8), value: 70 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(3) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, Load { destination: Relative(1), source_pointer: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 5998 }, Call { location: 938 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(1) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 6002 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(1), location: 6006 }, Jump { location: 6005 }, Return, JumpIf { condition: Relative(1), location: 6008 }, Call { location: 6574 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(4) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6018 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(8) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6026 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(3), size: 19 }), MemoryAddress(Direct(32842)), MemoryAddress(Relative(1)), HeapArray(HeapArray { pointer: Relative(10), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 19 }, Simple(Integer(U32)), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(1) }, Jump { location: 6002 }, JumpIf { condition: Relative(6), location: 6036 }, Call { location: 6574 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 6046 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(3) }, Mov { destination: Relative(18), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 3466 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(15) }, Mov { destination: Relative(12), source: Relative(16) }, Load { destination: Relative(13), source_pointer: Relative(11) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 6065 }, Call { location: 938 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(8) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 6073 }, Call { location: 938 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(13), size: 16 }), MemoryAddress(Direct(32844)), MemoryAddress(Relative(6)), MemoryAddress(Relative(12)), HeapArray(HeapArray { pointer: Relative(16), size: 16 }), HeapArray(HeapArray { pointer: Relative(17), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 5935 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 6085 }, Jump { location: 6118 }, JumpIf { condition: Relative(6), location: 6087 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(6) }, Load { destination: Relative(9), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(6), source_pointer: Relative(13) }, Load { destination: Relative(10), source_pointer: Relative(11) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6103 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 6111 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(10), size: 16 }), MemoryAddress(Direct(32844)), MemoryAddress(Relative(9)), MemoryAddress(Relative(6)), HeapArray(HeapArray { pointer: Relative(14), size: 16 }), HeapArray(HeapArray { pointer: Relative(15), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, Jump { location: 6118 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(6) }, Jump { location: 5896 }, Call { location: 188 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 7070 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 6139 }, Call { location: 938 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 7188 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6157 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Mov { destination: Relative(6), source: Direct(32838) }, Jump { location: 6161 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 6164 }, Jump { location: 6314 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6172 }, Call { location: 938 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(6), rhs: Relative(6) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 6182 }, BinaryIntOp { destination: Relative(16), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 6182 }, Call { location: 6568 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 6186 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(13), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 6191 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 6197 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32847) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(13) }, Mov { destination: Relative(16), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(15) }, Mov { destination: Relative(19), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(18) }, Mov { destination: Relative(20), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32837) }, Not { destination: Relative(21), source: Relative(13), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Or, bit_size: U1, lhs: Relative(18), rhs: Relative(21) }, JumpIf { condition: Relative(13), location: 6241 }, Jump { location: 6236 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 6239 }, Jump { location: 6253 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Jump { location: 6253 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(15), location: 6247 }, Call { location: 6571 }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 6253 }, Load { destination: Relative(12), source_pointer: Relative(20) }, JumpIf { condition: Relative(12), location: 6259 }, Jump { location: 6256 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 6161 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(9) }, Mov { destination: Relative(22), source: Relative(16) }, Mov { destination: Relative(23), source: Relative(19) }, Mov { destination: Relative(24), source: Relative(17) }, Mov { destination: Relative(25), source: Relative(4) }, Mov { destination: Relative(26), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 7224 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(16) }, Load { destination: Relative(6), source_pointer: Relative(19) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, JumpIf { condition: Relative(13), location: 6280 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(10) }, Call { location: 6591 }, Mov { destination: Relative(11), source: Direct(32772) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(4) }, Mov { destination: Direct(32771), source: Relative(11) }, Call { location: 6591 }, Mov { destination: Relative(4), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(4) }, Call { location: 6591 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 6591 }, Mov { destination: Relative(5), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(12) }, Jump { location: 6314 }, Return, Call { location: 188 }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6325 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 6333 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 6338 }, Jump { location: 6353 }, Store { destination_pointer: Relative(7), source: Direct(32841) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6345 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 6349 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(8), location: 6355 }, Jump { location: 6352 }, Jump { location: 6353 }, Load { destination: Relative(1), source_pointer: Relative(7) }, Return, JumpIf { condition: Relative(8), location: 6357 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Not { destination: Relative(13), source: Relative(8), bit_size: U1 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U1, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 6383 }, Jump { location: 6411 }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6389 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 7234 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(15) }, Mov { destination: Relative(10), source: Relative(16) }, JumpIf { condition: Relative(8), location: 6406 }, Jump { location: 6404 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 6411 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U64, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(8), location: 6411 }, Jump { location: 6409 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 6411 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(8) }, Jump { location: 6349 }, Call { location: 188 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 6423 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 6429 }, Call { location: 6571 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6436 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(4), op: Div, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 6531 }, Jump { location: 6442 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6450 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Div, bit_size: U32, lhs: Relative(7), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, JumpIf { condition: Relative(9), location: 6457 }, Call { location: 6568 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 7340 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(10), source: Relative(15) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(11) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(6) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 6482 }, Call { location: 938 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(12) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 4801 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(17) }, Mov { destination: Relative(14), source: Relative(18) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 6496 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(12) }, JumpIf { condition: Relative(5), location: 6506 }, Jump { location: 6499 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(9) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Jump { location: 6531 }, JumpIf { condition: Relative(5), location: 6508 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(5), source_pointer: Relative(13) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(6) }, Mov { destination: Relative(20), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 3269 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 6496 }, Return, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 6553 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Direct(32842) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 7396 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Cast { destination: Relative(7), source: Relative(4), bit_size: Integer(U32) }, Cast { destination: Relative(5), source: Relative(7), bit_size: Field }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(4) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 7233212735005103307 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, Load { destination: Relative(7), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Direct(32841) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Return, Load { destination: Direct(32773), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32774), op: Equals, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, JumpIf { condition: Direct(32774), location: 6595 }, Jump { location: 6597 }, Mov { destination: Direct(32772), source: Direct(32771) }, Jump { location: 6616 }, Const { destination: Direct(32776), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32775) }, Const { destination: Direct(32776), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32775), rhs: Direct(32776) }, Mov { destination: Direct(32772), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32775) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32775) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32772) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 6614 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 6607 }, IndirectConst { destination_pointer: Direct(32772), bit_size: Integer(U32), value: 1 }, Jump { location: 6616 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 188 }, BinaryFieldOp { destination: Relative(3), op: LessThan, lhs: Relative(1), rhs: Relative(2) }, Mov { destination: Relative(1), source: Relative(3) }, Return, Load { destination: Direct(32775), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32776), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Load { destination: Direct(32777), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32780), op: LessThanEquals, bit_size: U32, lhs: Direct(32779), rhs: Direct(32777) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32775), rhs: Direct(2) }, JumpIf { condition: Direct(32780), location: 6635 }, Jump { location: 6652 }, JumpIf { condition: Direct(32781), location: 6637 }, Jump { location: 6641 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, Jump { location: 6651 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(32783) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32782) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32777) }, Jump { location: 6651 }, Jump { location: 6664 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32782), op: Mul, bit_size: U32, lhs: Direct(32779), rhs: Direct(32783) }, Const { destination: Direct(32784), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(32784) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32783) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32779) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32782) }, Jump { location: 6664 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, JumpIf { condition: Direct(32781), location: 6678 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(32776) }, Mov { destination: Direct(32784), source: Direct(32778) }, Mov { destination: Direct(32785), source: Direct(32780) }, BinaryIntOp { destination: Direct(32786), op: Equals, bit_size: U32, lhs: Direct(32784), rhs: Direct(32783) }, JumpIf { condition: Direct(32786), location: 6678 }, Load { destination: Direct(32782), source_pointer: Direct(32784) }, Store { destination_pointer: Direct(32785), source: Direct(32782) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32785), op: Add, bit_size: U32, lhs: Direct(32785), rhs: Direct(2) }, Jump { location: 6671 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(32776) }, Return, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32775), source_pointer: Direct(32775) }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32775), rhs: Direct(32772) }, Load { destination: Direct(32777), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Const { destination: Direct(32780), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32780) }, JumpIf { condition: Direct(32778), location: 6689 }, Jump { location: 6693 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Jump { location: 6715 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32781) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32780) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Mov { destination: Direct(32783), source: Direct(32779) }, Mov { destination: Direct(32784), source: Direct(32780) }, BinaryIntOp { destination: Direct(32785), op: Equals, bit_size: U32, lhs: Direct(32783), rhs: Direct(32782) }, JumpIf { condition: Direct(32785), location: 6714 }, Load { destination: Direct(32781), source_pointer: Direct(32783) }, Store { destination_pointer: Direct(32784), source: Direct(32781) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, Jump { location: 6707 }, Jump { location: 6715 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Return, Call { location: 188 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(4), rhs: Direct(32855) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(4), rhs: Direct(32891) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32892) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Direct(32904) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32905) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 6729 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 6762 }, Jump { location: 6732 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(4), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 6737 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(8) }, JumpIf { condition: Relative(7), location: 6742 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(3) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Mov { destination: Relative(1), source: Relative(4) }, Return, Load { destination: Relative(13), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(14), location: 6766 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, Load { destination: Relative(14), source_pointer: Relative(16) }, JumpIf { condition: Relative(7), location: 6771 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(3) }, Load { destination: Relative(15), source_pointer: Relative(17) }, JumpIf { condition: Relative(8), location: 6840 }, Jump { location: 6776 }, JumpIf { condition: Relative(9), location: 6828 }, Jump { location: 6778 }, JumpIf { condition: Relative(10), location: 6816 }, Jump { location: 6780 }, JumpIf { condition: Relative(11), location: 6804 }, Jump { location: 6782 }, JumpIf { condition: Relative(12), location: 6792 }, Jump { location: 6784 }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(4), rhs: Direct(32907) }, JumpIf { condition: Relative(19), location: 6788 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(14), rhs: Relative(15) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(19), rhs: Direct(32864) }, Mov { destination: Relative(18), source: Relative(14) }, Jump { location: 6802 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(14) }, Mov { destination: Relative(23), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(19), source: Relative(22) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 6802 }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 6814 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(14) }, Mov { destination: Relative(22), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(19) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(18), source: Relative(21) }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 6814 }, Mov { destination: Relative(16), source: Relative(17) }, Jump { location: 6826 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(14) }, Mov { destination: Relative(21), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(18) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(17), source: Relative(20) }, Mov { destination: Relative(16), source: Relative(17) }, Jump { location: 6826 }, Mov { destination: Relative(13), source: Relative(16) }, Jump { location: 6838 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(14) }, Mov { destination: Relative(20), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(17) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(16), source: Relative(19) }, Mov { destination: Relative(13), source: Relative(16) }, Jump { location: 6838 }, Mov { destination: Relative(2), source: Relative(13) }, Jump { location: 6847 }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(14), rhs: Direct(32840) }, Not { destination: Relative(14), source: Relative(13), bit_size: U1 }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(15), rhs: Direct(32840) }, Not { destination: Relative(15), source: Relative(13), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U1, lhs: Relative(14), rhs: Relative(15) }, Mov { destination: Relative(2), source: Relative(13) }, Jump { location: 6847 }, JumpIf { condition: Relative(2), location: 6849 }, Jump { location: 6881 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(13), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32836) }, JumpIf { condition: Relative(14), location: 6854 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(5) }, Load { destination: Relative(15), source_pointer: Relative(17) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(16), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(13) }, Store { destination_pointer: Relative(18), source: Relative(15) }, Mov { destination: Direct(32771), source: Relative(16) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Store { destination_pointer: Relative(1), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, JumpIf { condition: Relative(14), location: 6879 }, Call { location: 6571 }, Store { destination_pointer: Relative(6), source: Relative(2) }, Jump { location: 6881 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 6729 }, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 6888 }, Jump { location: 6890 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 6905 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 6902 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 6895 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 6905 }, Return, Call { location: 188 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(2) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32899) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 6916 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 6971 }, Jump { location: 6919 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(3), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 6924 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(12) }, JumpIf { condition: Relative(7), location: 6934 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, Store { destination_pointer: Relative(14), source: Relative(7) }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(11) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, Store { destination_pointer: Relative(6), source: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Mov { destination: Relative(1), source: Relative(3) }, Return, Load { destination: Relative(11), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(12), location: 6975 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, JumpIf { condition: Relative(7), location: 6982 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(8) }, Load { destination: Relative(15), source_pointer: Relative(17) }, JumpIf { condition: Relative(10), location: 7001 }, Jump { location: 6987 }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Direct(32906) }, JumpIf { condition: Relative(11), location: 6991 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(13) }, Mov { destination: Relative(19), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(18) }, Mov { destination: Relative(2), source: Relative(11) }, Jump { location: 7011 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(13) }, Mov { destination: Relative(19), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 6620 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(18) }, Mov { destination: Relative(2), source: Relative(11) }, Jump { location: 7011 }, JumpIf { condition: Relative(2), location: 7013 }, Jump { location: 7067 }, Load { destination: Relative(2), source_pointer: Relative(1) }, Load { destination: Relative(11), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Direct(32836) }, JumpIf { condition: Relative(13), location: 7018 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(12) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(14) }, Load { destination: Relative(19), source_pointer: Relative(21) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(20), source: Direct(32773) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(13) }, Store { destination_pointer: Relative(22), source: Relative(18) }, Mov { destination: Direct(32771), source: Relative(20) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(16) }, Store { destination_pointer: Relative(18), source: Relative(19) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(12) }, Store { destination_pointer: Relative(18), source: Relative(15) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 6884 }, Mov { destination: Relative(2), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(14) }, Store { destination_pointer: Relative(15), source: Relative(17) }, Store { destination_pointer: Relative(1), source: Relative(2) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(12), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(2) }, JumpIf { condition: Relative(12), location: 7065 }, Call { location: 6571 }, Store { destination_pointer: Relative(6), source: Relative(2) }, Jump { location: 7067 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(2) }, Jump { location: 6916 }, Call { location: 188 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7079 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 7085 }, Call { location: 6571 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7092 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(4), op: Div, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 7187 }, Jump { location: 7098 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7106 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Div, bit_size: U32, lhs: Relative(7), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, JumpIf { condition: Relative(9), location: 7113 }, Call { location: 6568 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 7473 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(10), source: Relative(15) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(10) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(11) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(6) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 7138 }, Call { location: 938 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(12) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 7529 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(17) }, Mov { destination: Relative(14), source: Relative(18) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 7152 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(12) }, JumpIf { condition: Relative(5), location: 7162 }, Jump { location: 7155 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(9) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Jump { location: 7187 }, JumpIf { condition: Relative(5), location: 7164 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(5), source_pointer: Relative(13) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(6) }, Mov { destination: Relative(20), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 6121 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 7152 }, Return, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 7209 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Direct(32842) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 7396 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Cast { destination: Relative(7), source: Relative(4), bit_size: Integer(U32) }, Cast { destination: Relative(5), source: Relative(7), bit_size: Field }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(4) }, Return, Call { location: 188 }, Load { destination: Relative(7), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Direct(32841) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Return, Call { location: 188 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32839) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7247 }, Call { location: 938 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 7188 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(12) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(3) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 7265 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 7269 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 7272 }, Jump { location: 7337 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7278 }, Call { location: 938 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, JumpIf { condition: Relative(10), location: 7288 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 7288 }, Call { location: 6568 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 7292 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(3), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 7297 }, Call { location: 6571 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(3), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(10), location: 7303 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(3), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(10), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(3) }, JumpIf { condition: Relative(10), location: 7327 }, Jump { location: 7331 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(12), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 7334 }, Jump { location: 7330 }, Jump { location: 7331 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(3) }, Jump { location: 7269 }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 7337 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Return, Call { location: 188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 7361 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 7368 }, Jump { location: 7364 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Load { destination: Relative(2), source_pointer: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Return, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7376 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6624 }, Mov { destination: Relative(9), source: Direct(32773) }, Mov { destination: Relative(10), source: Direct(32774) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Store { destination_pointer: Relative(5), source: Relative(9) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(3) }, Jump { location: 7361 }, Call { location: 188 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 7403 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Cast { destination: Relative(4), source: Relative(1), bit_size: Field }, Const { destination: Relative(6), bit_size: Field, value: 18446744073709551616 }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(4), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 7825 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(6), source: Relative(13) }, Mov { destination: Relative(8), source: Relative(14) }, Mov { destination: Relative(9), source: Relative(15) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 7436 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 7440 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 7454 }, Jump { location: 7443 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 7855 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(10) }, Return, JumpIf { condition: Relative(5), location: 7456 }, Call { location: 6574 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(8) }, Mov { destination: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7880 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 7440 }, Call { location: 188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(5) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 7494 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 7501 }, Jump { location: 7497 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Load { destination: Relative(2), source_pointer: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Return, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7509 }, Call { location: 938 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6624 }, Mov { destination: Relative(9), source: Direct(32773) }, Mov { destination: Relative(10), source: Direct(32774) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32839) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Store { destination_pointer: Relative(5), source: Relative(9) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(3) }, Jump { location: 7494 }, Call { location: 188 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7554 }, Call { location: 938 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 7558 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 7774 }, Jump { location: 7561 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 7569 }, Call { location: 938 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32866) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32902) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32896) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32882) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32873) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32884) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32888) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32903) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32860) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7746 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 7772 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 7776 }, Call { location: 6574 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(13) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 7800 }, Jump { location: 7822 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 7808 }, Call { location: 938 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6624 }, Mov { destination: Relative(13), source: Direct(32773) }, Mov { destination: Relative(14), source: Direct(32774) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 7822 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 7558 }, Call { location: 188 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(4), source: Relative(3) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32840) }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(5), source: Relative(4) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(1) }, Mov { destination: Relative(4), source: Direct(32837) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(3) }, Mov { destination: Relative(3), source: Direct(32838) }, Return, Call { location: 188 }, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U1, lhs: Relative(5), rhs: Direct(32837) }, JumpIf { condition: Relative(6), location: 7861 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(7) } }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(1) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 7937 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Return, Call { location: 188 }, Load { destination: Relative(6), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U1, lhs: Relative(6), rhs: Direct(32837) }, JumpIf { condition: Relative(7), location: 7886 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(7), location: 7913 }, Jump { location: 7890 }, Load { destination: Relative(6), source_pointer: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(10), location: 7897 }, Call { location: 6574 }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(10), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Store { destination_pointer: Relative(12), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(7), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, JumpIf { condition: Relative(7), location: 7908 }, Call { location: 6571 }, Store { destination_pointer: Relative(1), source: Relative(10) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Jump { location: 7936 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Relative(2) }, Mov { destination: Relative(10), source: Relative(3) }, Mov { destination: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 7937 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6884 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Direct(32842) }, Store { destination_pointer: Relative(4), source: Relative(8) }, Jump { location: 7936 }, Return, Call { location: 188 }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 7940 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(6), location: 7968 }, Jump { location: 7943 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7950 }, Call { location: 938 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BlackBox(Poseidon2Permutation { message: HeapVector { pointer: Relative(8), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 4 }, len: Direct(32847) }), Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Return, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 7972 }, Jump { location: 7995 }, Load { destination: Relative(6), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryFieldOp { destination: Relative(10), op: Add, lhs: Relative(7), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 6884 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Jump { location: 7995 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 7940 }]" ], - "debug_symbols": "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xwv0Z9y1Ivm7j+Czp6D29TKCmkxPVprK/vAx++Foyvjx47WLhXRLnm2NPZre1M8qfPkyiPfel/zsi0l/V8K+90r+g8fQh/7FP94K8+9KxG/6GD68Dv765RtEWC/xCfvQlu+DhT97EF/dcGdypar3qfX4bKNSH9/eMNW/3hFWzu59PMX4d8/mq43zuxf+4roG8eE87w//+urbzH38o+KHf32zjPvD1V9+/Nf5ivOn10378lzS/M6vD27dMGQ8ePbXiloOQ60HBYbwNbD5qMCHG8t+uEfOLyjA7sKIJ49APnxD5cMF3X+4gPT6LrEnv85N7T7sL/34r/dyKPEHm5D0qfWP625++Ncnayziwa/ri5uXPPn1XqDx8drYv+DXX32i5EHzKLcDss9eeY315R89/QfDo9t89tEl2Q82fL6oMD/ulvzwrw9upfgkXblxXjx59X5w1fCP1/h81fCXNX7o750vK/zgquF/UOOHVg3/o8fxosanR8W+XJH46Q7a/33/w+//9Y9//ec//eVff/+3P/7lz//1/q3/vQr99Y+//5c//eH+x3//7z//64f/9W//73/W//Ivf/3jn/70x//45//861/+9Q//9t9//cNV6frffnrd/+//+LV4zvfL/u/vfpLrn+29b+HvU2jvf57vf35/Vs35tl7/m7/PzLnHfv9z5D+//2j0yP92XMXefzr+7r1NXP843v84Y8rv3v9P/+//Xk/m/wM=", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", @@ -260,7 +260,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "22": { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_0.snap index 3cf25d5f94c..1245370401b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_0.snap @@ -233,7 +233,7 @@ expression: artifact "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32917 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 12 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32905), size_address: Relative(2), offset_address: Relative(3) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32905 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 13 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(1) }, Mov { destination: Direct(32772), source: Relative(4) }, Mov { destination: Direct(32773), source: Relative(3) }, Call { location: 23 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 34 }, Call { location: 105 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32917 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, Mov { destination: Direct(32776), source: Direct(32771) }, Mov { destination: Direct(32777), source: Direct(32772) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32776), rhs: Direct(32775) }, JumpIf { condition: Direct(32778), location: 33 }, Load { destination: Direct(32774), source_pointer: Direct(32776) }, Store { destination_pointer: Direct(32777), source: Direct(32774) }, BinaryIntOp { destination: Direct(32776), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Jump { location: 26 }, Return, Const { destination: Direct(32835), bit_size: Integer(U32), value: 6 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 3 }, Const { destination: Direct(32837), bit_size: Integer(U1), value: 0 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32839), bit_size: Integer(U64), value: 0 }, Const { destination: Direct(32840), bit_size: Field, value: 0 }, Const { destination: Direct(32841), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32842), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32843), bit_size: Field, value: 1 }, Const { destination: Direct(32844), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32845), bit_size: Field, value: 2 }, Const { destination: Direct(32846), bit_size: Field, value: 3 }, Const { destination: Direct(32847), bit_size: Integer(U32), value: 4 }, Const { destination: Direct(32848), bit_size: Integer(U32), value: 5 }, Const { destination: Direct(32849), bit_size: Field, value: 5 }, Const { destination: Direct(32850), bit_size: Field, value: 6 }, Const { destination: Direct(32851), bit_size: Field, value: 7 }, Const { destination: Direct(32852), bit_size: Field, value: 11 }, Const { destination: Direct(32853), bit_size: Field, value: 12 }, Const { destination: Direct(32854), bit_size: Field, value: 13 }, Const { destination: Direct(32855), bit_size: Field, value: 30 }, Const { destination: Direct(32856), bit_size: Integer(U8), value: 32 }, Const { destination: Direct(32857), bit_size: Integer(U8), value: 34 }, Const { destination: Direct(32858), bit_size: Integer(U8), value: 44 }, Const { destination: Direct(32859), bit_size: Integer(U8), value: 46 }, Const { destination: Direct(32860), bit_size: Integer(U8), value: 49 }, Const { destination: Direct(32861), bit_size: Integer(U8), value: 50 }, Const { destination: Direct(32862), bit_size: Integer(U8), value: 51 }, Const { destination: Direct(32863), bit_size: Field, value: 55 }, Const { destination: Direct(32864), bit_size: Integer(U8), value: 58 }, Const { destination: Direct(32865), bit_size: Integer(U8), value: 65 }, Const { destination: Direct(32866), bit_size: Field, value: 75 }, Const { destination: Direct(32867), bit_size: Field, value: 77 }, Const { destination: Direct(32868), bit_size: Integer(U8), value: 78 }, Const { destination: Direct(32869), bit_size: Field, value: 79 }, Const { destination: Direct(32870), bit_size: Integer(U8), value: 95 }, Const { destination: Direct(32871), bit_size: Integer(U8), value: 97 }, Const { destination: Direct(32872), bit_size: Integer(U8), value: 98 }, Const { destination: Direct(32873), bit_size: Integer(U8), value: 99 }, Const { destination: Direct(32874), bit_size: Integer(U8), value: 100 }, Const { destination: Direct(32875), bit_size: Integer(U8), value: 101 }, Const { destination: Direct(32876), bit_size: Integer(U8), value: 102 }, Const { destination: Direct(32877), bit_size: Integer(U8), value: 103 }, Const { destination: Direct(32878), bit_size: Integer(U8), value: 104 }, Const { destination: Direct(32879), bit_size: Integer(U8), value: 105 }, Const { destination: Direct(32880), bit_size: Integer(U8), value: 107 }, Const { destination: Direct(32881), bit_size: Integer(U8), value: 108 }, Const { destination: Direct(32882), bit_size: Field, value: 108 }, Const { destination: Direct(32883), bit_size: Integer(U8), value: 109 }, Const { destination: Direct(32884), bit_size: Field, value: 109 }, Const { destination: Direct(32885), bit_size: Integer(U8), value: 110 }, Const { destination: Direct(32886), bit_size: Integer(U8), value: 111 }, Const { destination: Direct(32887), bit_size: Field, value: 112 }, Const { destination: Direct(32888), bit_size: Field, value: 113 }, Const { destination: Direct(32889), bit_size: Integer(U8), value: 114 }, Const { destination: Direct(32890), bit_size: Integer(U8), value: 115 }, Const { destination: Direct(32891), bit_size: Field, value: 115 }, Const { destination: Direct(32892), bit_size: Integer(U8), value: 116 }, Const { destination: Direct(32893), bit_size: Integer(U8), value: 117 }, Const { destination: Direct(32894), bit_size: Integer(U8), value: 118 }, Const { destination: Direct(32895), bit_size: Field, value: 118 }, Const { destination: Direct(32896), bit_size: Integer(U8), value: 119 }, Const { destination: Direct(32897), bit_size: Integer(U8), value: 121 }, Const { destination: Direct(32898), bit_size: Integer(U8), value: 123 }, Const { destination: Direct(32899), bit_size: Integer(U8), value: 125 }, Const { destination: Direct(32900), bit_size: Field, value: 134 }, Const { destination: Direct(32901), bit_size: Field, value: 135 }, Const { destination: Direct(32902), bit_size: Field, value: 136 }, Const { destination: Direct(32903), bit_size: Field, value: 138 }, Const { destination: Direct(32904), bit_size: Field, value: 10944121435919637611123202872628637544274182200208017171849102093287904247809 }, Return, Call { location: 1533 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Load { destination: Relative(3), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32844) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32837) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32842) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32838) }, Load { destination: Relative(9), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 145 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(8) }, Mov { destination: Relative(15), source: Relative(3) }, Mov { destination: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Load { destination: Relative(11), source_pointer: Relative(5) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 165 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, JumpIf { condition: Relative(11), location: 170 }, Call { location: 1736 }, Load { destination: Relative(9), source_pointer: Relative(6) }, Load { destination: Relative(11), source_pointer: Relative(5) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 177 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(11) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(5) }, Mov { destination: Relative(19), source: Direct(32842) }, Mov { destination: Relative(20), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(17) }, Mov { destination: Relative(14), source: Relative(18) }, JumpIf { condition: Relative(11), location: 192 }, Call { location: 1845 }, Const { destination: Relative(5), bit_size: Integer(U8), value: 73 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 49 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(11) }, Store { destination_pointer: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32885) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32890) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32889) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32892) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32874) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32898) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32894) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32871) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32881) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32893) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32899) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32872) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32893) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32892) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32877) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32886) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32892) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32898) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32877) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32886) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32892) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32899) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32876) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32886) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32889) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32892) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32878) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32890) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32871) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32883) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32856) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32880) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32897) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32859) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Relative(14) }, JumpIf { condition: Relative(11), location: 318 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, Mov { destination: Relative(17), source: Relative(16) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(18) }, Mov { destination: Direct(32772), source: Relative(17) }, Mov { destination: Direct(32773), source: Relative(19) }, Call { location: 23 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(18) }, Store { destination_pointer: Relative(17), source: Direct(32844) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(16), size: Relative(15) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(6) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 335 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32838) }, JumpIf { condition: Relative(8), location: 340 }, Call { location: 1996 }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(4) }, Mov { destination: Relative(18), source: Direct(32838) }, Mov { destination: Relative(19), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(6), source: Relative(16) }, Mov { destination: Relative(8), source: Relative(17) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U1, lhs: Relative(6), rhs: Direct(32837) }, JumpIf { condition: Relative(4), location: 355 }, Call { location: 1999 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, Load { destination: Relative(4), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32847) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(16) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(15) }, Mov { destination: Relative(15), source: Relative(14) }, Store { destination_pointer: Relative(15), source: Direct(32837) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32840) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32840) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32837) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32842) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32838) }, Load { destination: Relative(17), source_pointer: Relative(7) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(17) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 394 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(17) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 398 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(7), location: 1520 }, Jump { location: 401 }, Load { destination: Relative(7), source_pointer: Relative(15) }, Load { destination: Relative(8), source_pointer: Relative(16) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 409 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U8), value: 85 }, Const { destination: Relative(12), bit_size: Integer(U8), value: 72 }, Const { destination: Relative(13), bit_size: Integer(U8), value: 77 }, Const { destination: Relative(15), bit_size: Integer(U8), value: 112 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(17) }, Store { destination_pointer: Relative(18), source: Relative(10) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(12) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32871) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32890) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(13) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32871) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(15) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32881) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32885) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32877) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32878) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32883) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32893) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32890) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32872) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32860) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32858) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32877) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32886) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32898) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32881) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32885) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32899) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32859) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, JumpIf { condition: Relative(10), location: 516 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 40 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, Mov { destination: Relative(17), source: Relative(13) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U64), value: 7511829951750337011 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 37 }, Mov { destination: Direct(32771), source: Relative(18) }, Mov { destination: Direct(32772), source: Relative(17) }, Mov { destination: Direct(32773), source: Relative(19) }, Call { location: 23 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(18) }, Store { destination_pointer: Relative(17), source: Direct(32842) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(8) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(13), size: Relative(12) } }, Load { destination: Relative(8), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Direct(32842) }, Mov { destination: Relative(20), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(17) }, Mov { destination: Relative(12), source: Relative(18) }, JumpIf { condition: Relative(10), location: 530 }, Call { location: 1845 }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(6), rhs: Relative(12) }, JumpIf { condition: Relative(4), location: 554 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 52 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 52 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(8) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 15366650908120444287 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 48 }, Mov { destination: Direct(32771), source: Relative(13) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(14) }, Call { location: 23 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 48 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(8), size: Relative(7) } }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32848) }, Load { destination: Relative(4), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(12) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(9) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32840) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32842) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Mov { destination: Relative(12), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32838) }, Load { destination: Relative(13), source_pointer: Relative(7) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 596 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(12) }, Mov { destination: Relative(20), source: Relative(4) }, Mov { destination: Relative(21), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(12) }, Mov { destination: Relative(20), source: Relative(4) }, Mov { destination: Relative(21), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Load { destination: Relative(7), source_pointer: Relative(12) }, Load { destination: Relative(10), source_pointer: Relative(6) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 626 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, JumpIf { condition: Relative(10), location: 631 }, Call { location: 2002 }, Load { destination: Relative(7), source_pointer: Relative(9) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(7) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Direct(32842) }, Mov { destination: Relative(20), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(17) }, Mov { destination: Relative(10), source: Relative(18) }, JumpIf { condition: Relative(9), location: 645 }, Call { location: 1845 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 69 }, Const { destination: Relative(6), bit_size: Integer(U8), value: 120 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 37 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(9) }, Store { destination_pointer: Relative(13), source: Relative(4) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(6) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(15) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32873) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32892) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32874) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32898) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32885) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32896) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32870) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32894) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32871) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32881) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32893) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32875) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32899) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32858) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32872) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32893) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32892) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32886) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32892) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32856) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32898) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32877) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32886) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32892) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32899) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32859) }, BinaryFieldOp { destination: Relative(6), op: Equals, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(6), location: 748 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 40 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, Mov { destination: Relative(15), source: Relative(13) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U64), value: 3316745884754988903 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 36 }, Mov { destination: Direct(32771), source: Relative(16) }, Mov { destination: Direct(32772), source: Relative(15) }, Mov { destination: Direct(32773), source: Relative(17) }, Call { location: 23 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(16) }, Store { destination_pointer: Relative(15), source: Direct(32844) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(10) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(13), size: Relative(9) } }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 754 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(8) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(8) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(9) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32842) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(10), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32838) }, Load { destination: Relative(13), source_pointer: Relative(6) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 791 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(6) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 799 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 18 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32885) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32890) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32875) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32889) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32892) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32879) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32885) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32877) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32856) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32898) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32875) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32885) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32892) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32889) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32897) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Direct(32899) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 91 }, Const { destination: Relative(16), bit_size: Integer(U8), value: 93 }, Mov { destination: Relative(17), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 96 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Mov { destination: Relative(19), source: Relative(18) }, Store { destination_pointer: Relative(19), source: Direct(32898) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32880) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32885) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32864) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32890) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32892) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32889) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32893) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32873) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32892) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32858) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32885) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32871) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32883) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32864) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(4) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32885) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32892) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32889) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32897) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32858) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32876) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32881) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32890) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32864) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(5) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(5) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32880) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32897) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32858) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32898) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32880) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32885) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32864) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32876) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32881) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32899) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(16) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32858) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(5) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32894) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32871) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32881) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32893) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32858) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32898) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32880) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32885) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32864) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32876) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32879) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32875) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32881) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32874) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32857) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32899) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(16) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(16) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Direct(32899) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1039 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(4), location: 1480 }, Jump { location: 1042 }, Load { destination: Relative(4), source_pointer: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1050 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(11) }, Store { destination_pointer: Relative(12), source: Direct(32898) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32880) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32864) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32893) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32890) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32877) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32892) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32877) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32889) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32858) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32896) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32892) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32878) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32857) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32864) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32862) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32861) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32899) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), MemoryAddress(Relative(5)), HeapArray(HeapArray { pointer: Relative(11), size: 37 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Simple(Integer(U32)), Array { value_types: [Simple(Integer(U8))], size: 37 }, Simple(Integer(U1))] }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1139 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(4), location: 1144 }, Call { location: 2005 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 1150 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 36 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(6) }, Store { destination_pointer: Relative(12), source: Direct(32868) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32886) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32892) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32876) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32886) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32893) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32879) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32890) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32889) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32892) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32874) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32880) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32897) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32856) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32898) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32885) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32892) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32889) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32897) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32870) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32880) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32875) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32897) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32899) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Direct(32859) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1229 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(5), location: 1430 }, Jump { location: 1232 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(8) }, Mov { destination: Relative(13), source: Relative(9) }, Mov { destination: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 2008 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Direct(32838) }, JumpIf { condition: Relative(5), location: 1244 }, Call { location: 2037 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(8) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(8) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32842) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Load { destination: Relative(10), source_pointer: Relative(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1308 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(10) }, Mov { destination: Relative(2), source: Direct(32838) }, Jump { location: 1312 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32835) }, JumpIf { condition: Relative(10), location: 1399 }, Jump { location: 1315 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(6) }, Load { destination: Relative(5), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1324 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(7) }, Load { destination: Relative(12), source_pointer: Relative(10) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1335 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(12) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(1) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(5) }, Mov { destination: Relative(19), source: Relative(4) }, Mov { destination: Relative(20), source: Relative(10) }, Mov { destination: Relative(21), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 2040 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(16) }, JumpIf { condition: Relative(12), location: 1351 }, Call { location: 2139 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(7) }, Mov { destination: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(3), source_pointer: Relative(8) }, Load { destination: Relative(4), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(3) }, Mov { destination: Relative(19), source: Relative(4) }, Mov { destination: Relative(20), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 2040 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(15) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(7), rhs: Direct(32837) }, JumpIf { condition: Relative(1), location: 1378 }, Call { location: 2142 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2145 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2251 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2541 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 2985 }, Mov { destination: Direct(0), source: Relative(0) }, Return, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Load { destination: Relative(10), source_pointer: Relative(14) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Relative(6) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(11) }, Mov { destination: Relative(18), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(8) }, Mov { destination: Relative(15), source: Relative(9) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(11) }, Mov { destination: Relative(18), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(10) }, Jump { location: 1312 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(11) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(7) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1443 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Relative(11) }, Mov { destination: Relative(20), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(17) }, Mov { destination: Relative(14), source: Relative(18) }, JumpIf { condition: Relative(12), location: 1477 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 38 }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(11) }, Mov { destination: Relative(11), source: Relative(7) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U64), value: 9862881900111276825 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 35 }, Mov { destination: Direct(32771), source: Relative(15) }, Mov { destination: Direct(32772), source: Relative(11) }, Mov { destination: Direct(32773), source: Relative(16) }, Call { location: 23 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 35 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(15) }, Store { destination_pointer: Relative(11), source: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(7), size: Relative(5) } }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(5) }, Jump { location: 1229 }, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(12) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1494 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1502 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(7), size: 17 }), MemoryAddress(Direct(32842)), MemoryAddress(Relative(5)), MemoryAddress(Relative(4)), HeapArray(HeapArray { pointer: Relative(13), size: 95 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 17 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 95 }, Simple(Integer(U1))] }, Const { destination: Relative(7), bit_size: Integer(U32), value: 18 }, Mov { destination: Relative(18), source: Direct(0) }, Mov { destination: Relative(19), source: Relative(8) }, Mov { destination: Relative(20), source: Relative(9) }, Mov { destination: Relative(21), source: Relative(10) }, Mov { destination: Relative(22), source: Relative(5) }, Mov { destination: Relative(23), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(4) }, Jump { location: 1039 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(14) }, Mov { destination: Relative(19), source: Relative(15) }, Mov { destination: Relative(20), source: Relative(16) }, Mov { destination: Relative(21), source: Relative(4) }, Mov { destination: Relative(22), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Mov { destination: Relative(2), source: Relative(7) }, Jump { location: 398 }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 30720 }, BinaryIntOp { destination: Direct(32771), op: LessThan, bit_size: U32, lhs: Direct(0), rhs: Direct(32772) }, JumpIf { condition: Direct(32771), location: 1538 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4231 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1560 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4395 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1578 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Mov { destination: Relative(6), source: Direct(32838) }, Jump { location: 1582 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 1585 }, Jump { location: 1735 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1593 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(6), rhs: Relative(6) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 1603 }, BinaryIntOp { destination: Relative(16), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 1603 }, Call { location: 4431 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1607 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(13), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 1612 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 1618 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32847) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(13) }, Mov { destination: Relative(16), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(15) }, Mov { destination: Relative(19), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Mov { destination: Relative(17), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(18) }, Mov { destination: Relative(20), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Direct(32837) }, Not { destination: Relative(21), source: Relative(13), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Or, bit_size: U1, lhs: Relative(18), rhs: Relative(21) }, JumpIf { condition: Relative(13), location: 1662 }, Jump { location: 1657 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 1660 }, Jump { location: 1674 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Jump { location: 1674 }, Store { destination_pointer: Relative(20), source: Direct(32841) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(15), location: 1668 }, Call { location: 4434 }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 1674 }, Load { destination: Relative(12), source_pointer: Relative(20) }, JumpIf { condition: Relative(12), location: 1680 }, Jump { location: 1677 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 1582 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(9) }, Mov { destination: Relative(22), source: Relative(16) }, Mov { destination: Relative(23), source: Relative(19) }, Mov { destination: Relative(24), source: Relative(17) }, Mov { destination: Relative(25), source: Relative(4) }, Mov { destination: Relative(26), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 4440 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(16) }, Load { destination: Relative(6), source_pointer: Relative(19) }, Load { destination: Relative(7), source_pointer: Relative(17) }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, JumpIf { condition: Relative(13), location: 1701 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(10) }, Call { location: 4454 }, Mov { destination: Relative(11), source: Direct(32772) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, Store { destination_pointer: Relative(15), source: Relative(4) }, Mov { destination: Direct(32771), source: Relative(11) }, Call { location: 4454 }, Mov { destination: Relative(4), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(4) }, Call { location: 4454 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Store { destination_pointer: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 4454 }, Mov { destination: Relative(5), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(12) }, Jump { location: 1735 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 4105629585450304037 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32840) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1752 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4395 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(12) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(3) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1770 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 1774 }, BinaryIntOp { destination: Relative(3), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, JumpIf { condition: Relative(3), location: 1777 }, Jump { location: 1842 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 1783 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, JumpIf { condition: Relative(10), location: 1793 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 1793 }, Call { location: 4431 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 1797 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(3), op: Div, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, BinaryIntOp { destination: Relative(11), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(11), location: 1802 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, BinaryIntOp { destination: Relative(12), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Relative(1) }, BinaryIntOp { destination: Relative(3), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(10), location: 1808 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Load { destination: Relative(3), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32844) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(10), source_pointer: Relative(15) }, Not { destination: Relative(11), source: Relative(10), bit_size: U1 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U1, lhs: Relative(11), rhs: Relative(3) }, JumpIf { condition: Relative(10), location: 1832 }, Jump { location: 1836 }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(12), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 1839 }, Jump { location: 1835 }, Jump { location: 1836 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(3) }, Jump { location: 1774 }, Store { destination_pointer: Relative(6), source: Direct(32841) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 1842 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12632160011611521689 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1858 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4395 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(13) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1876 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 1880 }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 1883 }, Jump { location: 1995 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1891 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(5) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(5) }, JumpIf { condition: Relative(12), location: 1901 }, BinaryIntOp { destination: Relative(15), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(5) }, JumpIf { condition: Relative(14), location: 1901 }, Call { location: 4431 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1905 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(10), op: Div, bit_size: U32, lhs: Relative(12), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(13), op: LessThanEquals, bit_size: U32, lhs: Relative(9), rhs: Relative(12) }, JumpIf { condition: Relative(13), location: 1910 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(13), op: Div, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Mul, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(12), rhs: Relative(14) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, JumpIf { condition: Relative(12), location: 1916 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(10), rhs: Direct(32847) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Not { destination: Relative(8), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 1940 }, Jump { location: 1944 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(14), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 1947 }, Jump { location: 1943 }, Jump { location: 1944 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(7) }, Jump { location: 1880 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 1953 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(5) }, Call { location: 4454 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(12) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 4454 }, Mov { destination: Relative(5), source: Direct(32772) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(13) }, Store { destination_pointer: Relative(9), source: Relative(14) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(5) }, Call { location: 4454 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(16) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 4454 }, Mov { destination: Relative(7), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Store { destination_pointer: Relative(10), source: Direct(32841) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(4) }, JumpIf { condition: Relative(6), location: 1990 }, Call { location: 4480 }, Load { destination: Relative(4), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Jump { location: 1995 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 8082322909743101849 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 11665340019033496436 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 13674703438729013973 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 1359149291226868540 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Direct(32842) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Store { destination_pointer: Relative(3), source: Direct(32838) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 8591465503772373437 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2050 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2058 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 2063 }, Jump { location: 2078 }, Store { destination_pointer: Relative(7), source: Direct(32841) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2070 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 2074 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(8), location: 2080 }, Jump { location: 2077 }, Jump { location: 2078 }, Load { destination: Relative(1), source_pointer: Relative(7) }, Return, JumpIf { condition: Relative(8), location: 2082 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Not { destination: Relative(13), source: Relative(8), bit_size: U1 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U1, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 2108 }, Jump { location: 2136 }, Load { destination: Relative(8), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2114 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(8) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(13) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(15) }, Mov { destination: Relative(10), source: Relative(16) }, JumpIf { condition: Relative(8), location: 2131 }, Jump { location: 2129 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 2136 }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(12), rhs: Relative(10) }, JumpIf { condition: Relative(8), location: 2136 }, Jump { location: 2134 }, Store { destination_pointer: Relative(7), source: Direct(32837) }, Jump { location: 2136 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(8) }, Jump { location: 2074 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 6665645948190457319 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14241324264716156348 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 2181 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32849) }, Mov { destination: Relative(12), source: Direct(32852) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32845) }, Mov { destination: Relative(12), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32852) }, Mov { destination: Relative(12), source: Direct(32849) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 7 }, Mov { destination: Relative(7), source: Direct(0) }, Mov { destination: Relative(8), source: Relative(2) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(4) }, Mov { destination: Relative(11), source: Direct(32903) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 4483 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 2230 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, JumpIf { condition: Relative(4), location: 2235 }, Call { location: 4629 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(3) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Direct(32844) }, Mov { destination: Relative(12), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(9) }, Mov { destination: Relative(4), source: Relative(10) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U1, lhs: Relative(2), rhs: Direct(32837) }, JumpIf { condition: Relative(1), location: 2250 }, Call { location: 4632 }, Return, Call { location: 1533 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32845) }, Mov { destination: Relative(10), source: Direct(32846) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32849) }, Mov { destination: Relative(10), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32852) }, Mov { destination: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(1) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 2320 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(4) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4635 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(6), source: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 4918 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(10) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 2346 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2357 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Direct(32838) }, Mov { destination: Relative(13), source: Direct(32844) }, Mov { destination: Relative(14), source: Direct(32900) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 4950 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2375 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(2) }, Mov { destination: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 5219 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4918 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(14) }, Load { destination: Relative(1), source_pointer: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 2401 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(11) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2412 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32901) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4950 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(11), source_pointer: Relative(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(16) }, Mov { destination: Relative(12), source: Relative(17) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(12) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5802 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(15) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 2448 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2459 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32902) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 5871 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(4) }, Store { destination_pointer: Relative(14), source: Direct(32845) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32849) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32852) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 6153 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(16) }, JumpIf { condition: Relative(4), location: 2492 }, Call { location: 6185 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(4) }, Store { destination_pointer: Relative(7), source: Direct(32846) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32851) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(11) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 6153 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, JumpIf { condition: Relative(4), location: 2513 }, Call { location: 6188 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(4) }, Store { destination_pointer: Relative(7), source: Direct(32845) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32846) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32849) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32851) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32852) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32854) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 6191 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, JumpIf { condition: Relative(4), location: 2540 }, Call { location: 6233 }, Return, Call { location: 1533 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32845) }, Mov { destination: Relative(10), source: Direct(32846) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32849) }, Mov { destination: Relative(10), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32852) }, Mov { destination: Relative(10), source: Direct(32854) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32882) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6236 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32884) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6353 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 2628 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4635 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(7) }, Mov { destination: Relative(14), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 4918 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(13) }, Load { destination: Relative(7), source_pointer: Relative(10) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 2654 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2665 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(11) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Direct(32838) }, Mov { destination: Relative(16), source: Direct(32844) }, Mov { destination: Relative(17), source: Direct(32887) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 4950 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(10), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 2683 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(4) }, Mov { destination: Relative(17), source: Relative(5) }, Mov { destination: Relative(18), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 5219 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(16) }, Mov { destination: Relative(13), source: Relative(17) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(13) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 4918 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(15) }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 2709 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2720 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32888) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 4950 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 2738 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 15 }, Const { destination: Relative(14), bit_size: Field, value: 33 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Direct(32850) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(10) }, Mov { destination: Relative(19), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 6153 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(14), source: Relative(18) }, Const { destination: Relative(15), bit_size: Integer(U8), value: 71 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 40 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(18), source: Relative(17) }, Store { destination_pointer: Relative(18), source: Relative(15) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32886) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32879) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32885) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32873) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32886) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32873) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32879) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32889) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32871) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32892) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32879) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32886) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32885) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32886) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32876) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32880) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32897) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32890) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32864) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32856) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32898) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32880) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32875) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32897) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32890) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Direct(32899) }, JumpIf { condition: Relative(14), location: 2872 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 44 }, Mov { destination: Relative(17), source: Direct(1) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 44 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(18) }, Mov { destination: Relative(18), source: Relative(17) }, IndirectConst { destination_pointer: Relative(18), bit_size: Integer(U64), value: 2386996775688025706 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 39 }, Mov { destination: Direct(32771), source: Relative(19) }, Mov { destination: Direct(32772), source: Relative(18) }, Mov { destination: Direct(32773), source: Relative(20) }, Call { location: 23 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 39 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(19) }, Store { destination_pointer: Relative(18), source: Direct(32842) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(19) }, Mov { destination: Direct(32772), source: Relative(18) }, Mov { destination: Direct(32773), source: Relative(20) }, Call { location: 23 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(19) }, Trap { revert_data: HeapVector { pointer: Relative(17), size: Relative(15) } }, Const { destination: Relative(10), bit_size: Field, value: 35 }, Const { destination: Relative(14), bit_size: Field, value: 65 }, Mov { destination: Relative(15), source: Direct(1) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(16) }, IndirectConst { destination_pointer: Relative(15), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Mov { destination: Relative(17), source: Relative(16) }, Store { destination_pointer: Relative(17), source: Relative(5) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(10) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(14) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(4) }, Mov { destination: Relative(18), source: Relative(15) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6153 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(17) }, JumpIf { condition: Relative(5), location: 2895 }, Call { location: 6188 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32891) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6498 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(4) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(15) }, Mov { destination: Relative(5), source: Relative(16) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(3) }, Call { location: 5802 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(15) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Not { destination: Relative(4), source: Relative(4), bit_size: U1 }, JumpIf { condition: Relative(4), location: 2931 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 2942 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32838) }, Mov { destination: Relative(17), source: Direct(32844) }, Mov { destination: Relative(18), source: Direct(32895) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(2) }, Call { location: 5871 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(2), source_pointer: Relative(1) }, Const { destination: Relative(1), bit_size: Field, value: 70 }, Const { destination: Relative(4), bit_size: Field, value: 66 }, Const { destination: Relative(10), bit_size: Field, value: 130 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(15) }, Store { destination_pointer: Relative(16), source: Direct(32853) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32855) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32855) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(10) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 6191 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(16) }, JumpIf { condition: Relative(1), location: 2984 }, Call { location: 6233 }, Return, Call { location: 1533 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(4), bit_size: Field, value: 42 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 6 }, Mov { destination: Relative(6), source: Direct(0) }, Mov { destination: Relative(7), source: Relative(2) }, Mov { destination: Relative(8), source: Relative(3) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Direct(32853) }, Mov { destination: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3034 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, JumpIf { condition: Relative(7), location: 3040 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3047 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Direct(32842) }, Mov { destination: Relative(16), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, JumpIf { condition: Relative(7), location: 3062 }, Jump { location: 3070 }, JumpIf { condition: Relative(7), location: 3065 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(10), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 3069 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Jump { location: 3070 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(5), source: Direct(0) }, Mov { destination: Relative(6), source: Relative(2) }, Mov { destination: Relative(7), source: Relative(3) }, Mov { destination: Relative(8), source: Relative(1) }, Mov { destination: Relative(9), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 3087 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(4), location: 3093 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(2) }, Mov { destination: Relative(10), source: Relative(3) }, Mov { destination: Relative(11), source: Relative(1) }, Mov { destination: Relative(12), source: Direct(32853) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3110 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(6), location: 3116 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3122 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Direct(32843) }, Mov { destination: Relative(14), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3142 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(4), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 3149 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32843) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3166 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(9), location: 3172 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3178 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32843) }, Mov { destination: Relative(17), source: Direct(32845) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Field, value: 4 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32846) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(5) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Direct(32849) }, Mov { destination: Relative(17), source: Direct(32850) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 3219 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(12) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 3225 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(2) }, Mov { destination: Relative(16), source: Relative(3) }, Mov { destination: Relative(17), source: Relative(1) }, Mov { destination: Relative(18), source: Direct(32846) }, Mov { destination: Relative(19), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(12) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 3243 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(12) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 3249 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, Const { destination: Relative(4), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(2) }, Mov { destination: Relative(17), source: Relative(3) }, Mov { destination: Relative(18), source: Relative(1) }, Mov { destination: Relative(19), source: Direct(32843) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 1848 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 3266 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, JumpIf { condition: Relative(12), location: 3272 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 38 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(16), source: Direct(32898) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32880) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32879) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32885) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32874) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32864) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32893) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32885) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32890) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32879) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32877) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32885) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32875) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32874) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32879) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32885) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32892) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32875) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32877) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32875) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32889) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32858) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32896) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32879) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32874) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32892) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32878) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32857) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32864) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32862) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32861) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32899) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), MemoryAddress(Direct(32842)), HeapArray(HeapArray { pointer: Relative(12), size: 37 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Simple(Integer(U32)), Array { value_types: [Simple(Integer(U8))], size: 37 }, Simple(Integer(U1))] }, Load { destination: Relative(5), source_pointer: Relative(4) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 3359 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(2) }, Mov { destination: Relative(18), source: Relative(3) }, Mov { destination: Relative(19), source: Relative(1) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 2008 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(16), source_pointer: Relative(4) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(16) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 3377 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, JumpIf { condition: Relative(16), location: 3383 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(16), source_pointer: Relative(4) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 3390 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(5) }, Mov { destination: Relative(23), source: Relative(4) }, Mov { destination: Relative(24), source: Direct(32838) }, Mov { destination: Relative(25), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(16), source: Relative(22) }, Mov { destination: Relative(19), source: Relative(23) }, JumpIf { condition: Relative(16), location: 3518 }, Jump { location: 3405 }, Const { destination: Relative(4), bit_size: Integer(U8), value: 55 }, Const { destination: Relative(5), bit_size: Integer(U8), value: 33 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32868) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32886) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32894) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32871) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32881) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32893) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32876) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32886) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32889) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32897) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32856) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(5) }, Const { destination: Relative(4), bit_size: Integer(U8), value: 57 }, Mov { destination: Relative(5), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 30 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32898) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32880) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32879) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32885) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32874) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32864) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32890) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32892) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32889) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32879) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32885) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32877) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32858) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32881) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32875) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32885) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32877) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32892) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32878) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32857) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32864) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32860) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32899) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(4), size: 19 }), HeapArray(HeapArray { pointer: Relative(7), size: 29 }), MemoryAddress(Direct(32837))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 19 }, Array { value_types: [Simple(Integer(U8))], size: 29 }, Simple(Integer(U1))] }, Jump { location: 3544 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3527 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Direct(32851) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(9), source: Relative(13) }, JumpIf { condition: Relative(7), location: 3543 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 3544 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3553 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, Load { destination: Relative(11), source_pointer: Relative(6) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 3571 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(11) }, Const { destination: Relative(11), bit_size: Integer(U8), value: 45 }, Const { destination: Relative(13), bit_size: Integer(U8), value: 62 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(15) }, IndirectConst { destination_pointer: Relative(14), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Relative(16), source: Relative(15) }, Store { destination_pointer: Relative(16), source: Direct(32898) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32880) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32875) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32897) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32899) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32856) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(11) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32856) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32898) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32894) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32871) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32881) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32893) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32875) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Direct(32899) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 17 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(15), source: Relative(13) }, Store { destination_pointer: Relative(15), source: Direct(32898) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32857) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32880) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32879) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32885) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32874) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32857) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32864) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32857) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32876) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32879) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32875) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32881) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32874) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32857) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Direct(32899) }, Load { destination: Relative(13), source_pointer: Relative(11) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 3655 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(13) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 3659 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(9), location: 4192 }, Jump { location: 3662 }, Load { destination: Relative(8), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3668 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 4635 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(16) }, Mov { destination: Relative(10), source: Relative(17) }, Load { destination: Relative(12), source_pointer: Relative(14) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 3686 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(12) }, Load { destination: Relative(12), source_pointer: Relative(11) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(12) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 3694 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 3698 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 4144 }, Jump { location: 3701 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 5219 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(8), source: Relative(13) }, Mov { destination: Relative(9), source: Relative(14) }, Const { destination: Relative(5), bit_size: Integer(U8), value: 70 }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 20 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32886) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32893) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32885) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32874) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32856) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32894) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32871) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32881) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32893) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32875) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32856) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32898) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32894) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32871) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32881) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32893) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32875) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Direct(32899) }, Load { destination: Relative(5), source_pointer: Relative(11) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3761 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 3765 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 4116 }, Jump { location: 3768 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 3777 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Direct(32866) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 6498 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Direct(32867) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 6236 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Direct(32869) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 6353 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Direct(32855) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(4) }, Call { location: 4483 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(3) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Mov { destination: Relative(3), source: Relative(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32840) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32839) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32837) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Direct(32838) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32839) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32837) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Direct(32842) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32838) }, Const { destination: Relative(7), bit_size: Integer(U64), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(1) }, Mov { destination: Relative(14), source: Direct(32843) }, Mov { destination: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 6603 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(9), bit_size: Integer(U64), value: 4 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(2) }, Mov { destination: Relative(13), source: Relative(3) }, Mov { destination: Relative(14), source: Relative(1) }, Mov { destination: Relative(15), source: Direct(32846) }, Mov { destination: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6603 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 11 }, Mov { destination: Relative(11), source: Direct(0) }, Mov { destination: Relative(12), source: Relative(5) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Direct(32846) }, Mov { destination: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 6603 }, Mov { destination: Direct(0), source: Relative(0) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(5) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Direct(32843) }, Mov { destination: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 6603 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 3939 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(5) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 3947 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 3952 }, Jump { location: 3967 }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 3959 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 3963 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 3972 }, Jump { location: 3966 }, Jump { location: 3967 }, Load { destination: Relative(1), source_pointer: Relative(4) }, JumpIf { condition: Relative(1), location: 3971 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(2) } }, Return, JumpIf { condition: Relative(8), location: 3974 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32847) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32844) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Not { destination: Relative(13), source: Relative(8), bit_size: U1 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U1, lhs: Relative(10), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 4000 }, Jump { location: 4113 }, Load { destination: Relative(9), source_pointer: Relative(5) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 4006 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(9) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32839) }, Load { destination: Relative(14), source_pointer: Relative(5) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 4020 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(14) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(1) }, Mov { destination: Relative(19), source: Relative(5) }, Mov { destination: Relative(20), source: Relative(6) }, Mov { destination: Relative(21), source: Relative(11) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 6765 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(14), source: Relative(18) }, Load { destination: Relative(16), source_pointer: Relative(5) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(16) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 4038 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(16) }, Mov { destination: Relative(8), source: Direct(32838) }, Jump { location: 4042 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(1) }, JumpIf { condition: Relative(10), location: 4045 }, Jump { location: 4102 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(8), rhs: Relative(8) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(8) }, JumpIf { condition: Relative(15), location: 4053 }, BinaryIntOp { destination: Relative(18), op: Div, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(8) }, JumpIf { condition: Relative(17), location: 4053 }, Call { location: 4431 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(8), rhs: Relative(15) }, JumpIf { condition: Relative(16), location: 4057 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(10), op: Div, bit_size: U32, lhs: Relative(15), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(14), rhs: Relative(15) }, JumpIf { condition: Relative(16), location: 4062 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(16), op: Div, bit_size: U32, lhs: Relative(15), rhs: Relative(1) }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(16), rhs: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Sub, bit_size: U32, lhs: Relative(15), rhs: Relative(17) }, BinaryIntOp { destination: Relative(15), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, JumpIf { condition: Relative(15), location: 4068 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(10), rhs: Direct(32847) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(15) }, Load { destination: Relative(10), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32842) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32844) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32836) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Load { destination: Relative(15), source_pointer: Relative(20) }, Not { destination: Relative(16), source: Relative(15), bit_size: U1 }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U1, lhs: Relative(16), rhs: Relative(10) }, JumpIf { condition: Relative(15), location: 4092 }, Jump { location: 4096 }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(17), rhs: Relative(11) }, JumpIf { condition: Relative(10), location: 4099 }, Jump { location: 4095 }, Jump { location: 4096 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Mov { destination: Relative(8), source: Relative(10) }, Jump { location: 4042 }, Store { destination_pointer: Relative(9), source: Direct(32841) }, Store { destination_pointer: Relative(13), source: Relative(18) }, Jump { location: 4102 }, Load { destination: Relative(8), source_pointer: Relative(9) }, Load { destination: Relative(9), source_pointer: Relative(13) }, JumpIf { condition: Relative(8), location: 4108 }, Jump { location: 4106 }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Jump { location: 4113 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U64, lhs: Relative(12), rhs: Relative(9) }, JumpIf { condition: Relative(8), location: 4113 }, Jump { location: 4111 }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Jump { location: 4113 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(8) }, Jump { location: 3963 }, JumpIf { condition: Relative(5), location: 4118 }, Call { location: 4437 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4128 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(11) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(7) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 4136 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(7), size: 19 }), MemoryAddress(Direct(32842)), MemoryAddress(Relative(5)), HeapArray(HeapArray { pointer: Relative(13), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 19 }, Simple(Integer(U32)), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 3765 }, JumpIf { condition: Relative(9), location: 4146 }, Call { location: 4437 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(4) }, Load { destination: Relative(9), source_pointer: Relative(13) }, Load { destination: Relative(12), source_pointer: Relative(6) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 4156 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(12) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(5) }, Mov { destination: Relative(19), source: Relative(6) }, Mov { destination: Relative(20), source: Relative(7) }, Mov { destination: Relative(21), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 1739 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(12), source: Relative(18) }, Mov { destination: Relative(15), source: Relative(19) }, Load { destination: Relative(16), source_pointer: Relative(14) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(17), rhs: Relative(16) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 4175 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(16) }, Load { destination: Relative(16), source_pointer: Relative(11) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 4183 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(16), size: 16 }), MemoryAddress(Direct(32844)), MemoryAddress(Relative(9)), MemoryAddress(Relative(15)), HeapArray(HeapArray { pointer: Relative(19), size: 16 }), HeapArray(HeapArray { pointer: Relative(20), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(9) }, Jump { location: 3698 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 4195 }, Jump { location: 4228 }, JumpIf { condition: Relative(9), location: 4197 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Load { destination: Relative(12), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(9), source_pointer: Relative(16) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 4213 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(11) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 4221 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, ForeignCall { function: \"print\", destinations: [], destination_value_types: [], inputs: [MemoryAddress(Direct(32841)), HeapArray(HeapArray { pointer: Relative(13), size: 16 }), MemoryAddress(Direct(32844)), MemoryAddress(Relative(12)), MemoryAddress(Relative(9)), HeapArray(HeapArray { pointer: Relative(17), size: 16 }), HeapArray(HeapArray { pointer: Relative(18), size: 16 }), MemoryAddress(Direct(32841))], input_value_types: [Simple(Integer(U1)), Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U32)), Simple(Field), Simple(Field), Array { value_types: [Simple(Integer(U8))], size: 16 }, Array { value_types: [Simple(Integer(U8))], size: 16 }, Simple(Integer(U1))] }, Jump { location: 4228 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(9) }, Jump { location: 3659 }, Call { location: 1533 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4240 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 4246 }, Call { location: 4434 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4253 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(4), op: Div, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 4394 }, Jump { location: 4259 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4267 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Div, bit_size: U32, lhs: Relative(6), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(7), location: 4274 }, Call { location: 4431 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4294 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 4366 }, Jump { location: 4297 }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 4317 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(8) }, Mov { destination: Relative(17), source: Relative(9) }, Mov { destination: Relative(18), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(13), source: Relative(17) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4331 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(11) }, JumpIf { condition: Relative(8), location: 4341 }, Jump { location: 4334 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Jump { location: 4394 }, JumpIf { condition: Relative(8), location: 4343 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 14 }, Mov { destination: Relative(14), source: Direct(0) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(5) }, Mov { destination: Relative(17), source: Relative(6) }, Mov { destination: Relative(18), source: Relative(9) }, Mov { destination: Relative(19), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 4331 }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4374 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6801 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32837) }, Store { destination_pointer: Relative(7), source: Relative(10) }, Store { destination_pointer: Relative(9), source: Relative(12) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4294 }, Return, Call { location: 1533 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 4416 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Direct(32842) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 6857 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Cast { destination: Relative(7), source: Relative(4), bit_size: Integer(U32) }, Cast { destination: Relative(5), source: Relative(7), bit_size: Field }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(4) }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 7233212735005103307 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 14225679739041873922 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Load { destination: Relative(7), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Direct(32841) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, Return, Load { destination: Direct(32773), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32774), op: Equals, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, JumpIf { condition: Direct(32774), location: 4458 }, Jump { location: 4460 }, Mov { destination: Direct(32772), source: Direct(32771) }, Jump { location: 4479 }, Const { destination: Direct(32776), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32776) }, Load { destination: Direct(32775), source_pointer: Direct(32775) }, Const { destination: Direct(32776), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32775), rhs: Direct(32776) }, Mov { destination: Direct(32772), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32775) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32775) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32772) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 4477 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 4470 }, IndirectConst { destination_pointer: Direct(32772), bit_size: Integer(U32), value: 1 }, Jump { location: 4479 }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 2920182694213909827 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4492 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(4), rhs: Direct(32855) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(4), rhs: Direct(32887) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32888) }, BinaryFieldOp { destination: Relative(11), op: Equals, lhs: Relative(4), rhs: Direct(32900) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32901) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 4501 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 4505 }, Jump { location: 4504 }, Return, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(13), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 4510 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32847) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(9) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32844) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(20) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(17) }, Load { destination: Relative(19), source_pointer: Relative(21) }, Not { destination: Relative(13), source: Relative(19), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(13), rhs: Relative(14) }, JumpIf { condition: Relative(17), location: 4534 }, Jump { location: 4626 }, JumpIf { condition: Relative(7), location: 4569 }, Jump { location: 4536 }, BinaryFieldOp { destination: Relative(19), op: LessThan, lhs: Relative(16), rhs: Relative(18) }, JumpIf { condition: Relative(8), location: 4565 }, Jump { location: 4539 }, JumpIf { condition: Relative(10), location: 4561 }, Jump { location: 4541 }, JumpIf { condition: Relative(11), location: 4557 }, Jump { location: 4543 }, JumpIf { condition: Relative(12), location: 4553 }, Jump { location: 4545 }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(4), rhs: Direct(32903) }, JumpIf { condition: Relative(19), location: 4549 }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(23) } }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(16), rhs: Relative(18) }, BinaryFieldOp { destination: Relative(23), op: Equals, lhs: Relative(19), rhs: Direct(32863) }, Mov { destination: Relative(22), source: Relative(23) }, Jump { location: 4555 }, Mov { destination: Relative(22), source: Relative(19) }, Jump { location: 4555 }, Mov { destination: Relative(21), source: Relative(22) }, Jump { location: 4559 }, Mov { destination: Relative(21), source: Relative(19) }, Jump { location: 4559 }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 4563 }, Mov { destination: Relative(20), source: Relative(19) }, Jump { location: 4563 }, Mov { destination: Relative(17), source: Relative(20) }, Jump { location: 4567 }, Mov { destination: Relative(17), source: Relative(19) }, Jump { location: 4567 }, Mov { destination: Relative(13), source: Relative(17) }, Jump { location: 4576 }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(16), rhs: Direct(32840) }, Not { destination: Relative(19), source: Relative(17), bit_size: U1 }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(18), rhs: Direct(32840) }, Not { destination: Relative(20), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(19), rhs: Relative(20) }, Mov { destination: Relative(13), source: Relative(17) }, Jump { location: 4576 }, JumpIf { condition: Relative(13), location: 4626 }, Jump { location: 4578 }, Load { destination: Relative(13), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(17), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(19), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(13) }, JumpIf { condition: Relative(19), location: 4583 }, Call { location: 4480 }, Load { destination: Relative(13), source_pointer: Relative(1) }, Load { destination: Relative(19), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(17) }, Load { destination: Relative(13), source_pointer: Relative(1) }, Load { destination: Relative(17), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(20), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(13) }, JumpIf { condition: Relative(20), location: 4592 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(19) }, Call { location: 4454 }, Mov { destination: Relative(20), source: Direct(32772) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(22) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(9) }, Store { destination_pointer: Relative(22), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(20) }, Call { location: 4454 }, Mov { destination: Relative(9), source: Direct(32772) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(15) }, Store { destination_pointer: Relative(19), source: Relative(16) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(9) }, Call { location: 4454 }, Mov { destination: Relative(15), source: Direct(32772) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Store { destination_pointer: Relative(19), source: Relative(18) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(15) }, Call { location: 4454 }, Mov { destination: Relative(14), source: Direct(32772) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(9) }, Store { destination_pointer: Relative(18), source: Direct(32841) }, Store { destination_pointer: Relative(1), source: Relative(13) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(17) }, Jump { location: 4626 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(9) }, Jump { location: 4501 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16986922238178214607 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 15583592523844085222 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 4660 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 4664 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 4874 }, Jump { location: 4667 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 4675 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 80 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32880) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32897) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 4846 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 4872 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 83 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 6693878053340631133 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 79 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 79 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 4876 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 4895 }, Jump { location: 4915 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 4903 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 1 }, Call { location: 6801 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Jump { location: 4915 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 4664 }, Call { location: 1533 }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(5), source: Relative(5), bit_size: U1 }, JumpIf { condition: Relative(5), location: 4925 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(3), location: 4931 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(5) } }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32847) }, Load { destination: Relative(3), source_pointer: Relative(5) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32848) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Relative(1), source: Relative(2) }, Return, Call { location: 1533 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 4975 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 4978 }, Jump { location: 5218 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4986 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, JumpIf { condition: Relative(7), location: 5217 }, Jump { location: 4991 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 4999 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 7006 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5016 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 5024 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(8), location: 5215 }, Jump { location: 5028 }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(11) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32836) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32855) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Direct(32887) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(4), rhs: Direct(32888) }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(4), rhs: Direct(32900) }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(4), rhs: Direct(32901) }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 5039 }, BinaryIntOp { destination: Relative(17), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(17), location: 5124 }, Jump { location: 5042 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 5047 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(10) }, Load { destination: Relative(8), source_pointer: Relative(14) }, JumpIf { condition: Relative(9), location: 5052 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(10) }, Store { destination_pointer: Relative(15), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(12) }, Store { destination_pointer: Relative(14), source: Relative(8) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 5078 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 5084 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(15), source: Direct(32773) }, Mov { destination: Relative(16), source: Direct(32774) }, Store { destination_pointer: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Direct(32838), rhs: Relative(10) }, JumpIf { condition: Relative(7), location: 5098 }, Jump { location: 5122 }, Load { destination: Relative(7), source_pointer: Relative(15) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 5104 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Sub, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(10) }, JumpIf { condition: Relative(9), location: 5110 }, Call { location: 4480 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(12), source: Direct(32774) }, Store { destination_pointer: Relative(12), source: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Jump { location: 5122 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 4975 }, Load { destination: Relative(18), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, JumpIf { condition: Relative(19), location: 5128 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Load { destination: Relative(19), source_pointer: Relative(21) }, JumpIf { condition: Relative(9), location: 5133 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(12) }, Load { destination: Relative(20), source_pointer: Relative(22) }, JumpIf { condition: Relative(10), location: 5171 }, Jump { location: 5138 }, BinaryFieldOp { destination: Relative(21), op: LessThan, lhs: Relative(19), rhs: Relative(20) }, JumpIf { condition: Relative(13), location: 5167 }, Jump { location: 5141 }, JumpIf { condition: Relative(14), location: 5163 }, Jump { location: 5143 }, JumpIf { condition: Relative(15), location: 5159 }, Jump { location: 5145 }, JumpIf { condition: Relative(16), location: 5155 }, Jump { location: 5147 }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(4), rhs: Direct(32903) }, JumpIf { condition: Relative(21), location: 5151 }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(25) } }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(19), rhs: Relative(20) }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(21), rhs: Direct(32863) }, Mov { destination: Relative(24), source: Relative(19) }, Jump { location: 5157 }, Mov { destination: Relative(24), source: Relative(21) }, Jump { location: 5157 }, Mov { destination: Relative(23), source: Relative(24) }, Jump { location: 5161 }, Mov { destination: Relative(23), source: Relative(21) }, Jump { location: 5161 }, Mov { destination: Relative(22), source: Relative(23) }, Jump { location: 5165 }, Mov { destination: Relative(22), source: Relative(21) }, Jump { location: 5165 }, Mov { destination: Relative(18), source: Relative(22) }, Jump { location: 5169 }, Mov { destination: Relative(18), source: Relative(21) }, Jump { location: 5169 }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 5178 }, BinaryFieldOp { destination: Relative(18), op: Equals, lhs: Relative(19), rhs: Direct(32840) }, Not { destination: Relative(19), source: Relative(18), bit_size: U1 }, BinaryFieldOp { destination: Relative(18), op: Equals, lhs: Relative(20), rhs: Direct(32840) }, Not { destination: Relative(20), source: Relative(18), bit_size: U1 }, BinaryIntOp { destination: Relative(18), op: Mul, bit_size: U1, lhs: Relative(19), rhs: Relative(20) }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 5178 }, JumpIf { condition: Relative(17), location: 5180 }, Jump { location: 5212 }, Load { destination: Relative(17), source_pointer: Relative(1) }, Load { destination: Relative(18), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(18), rhs: Direct(32836) }, JumpIf { condition: Relative(19), location: 5185 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(18) }, Load { destination: Relative(19), source_pointer: Relative(21) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(7) }, Load { destination: Relative(20), source_pointer: Relative(22) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(21), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(18) }, Store { destination_pointer: Relative(23), source: Relative(20) }, Mov { destination: Direct(32771), source: Relative(21) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Store { destination_pointer: Relative(22), source: Relative(19) }, Store { destination_pointer: Relative(1), source: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(19), op: LessThanEquals, bit_size: U32, lhs: Relative(18), rhs: Relative(17) }, JumpIf { condition: Relative(19), location: 5210 }, Call { location: 4434 }, Store { destination_pointer: Relative(8), source: Relative(17) }, Jump { location: 5212 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Relative(7), source: Relative(17) }, Jump { location: 5039 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 4975 }, Jump { location: 5218 }, Return, Call { location: 1533 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 5244 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 5248 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 5462 }, Jump { location: 5251 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 5259 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 5434 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 5460 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 85 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 85 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9965974553718638037 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 81 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 81 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 5464 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(12) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 5483 }, Jump { location: 5503 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 5491 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 1 }, Call { location: 6801 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Jump { location: 5503 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 5248 }, Call { location: 1533 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 5531 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 5535 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 5751 }, Jump { location: 5538 }, Load { destination: Relative(1), source_pointer: Relative(6) }, Load { destination: Relative(2), source_pointer: Relative(7) }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 5546 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Direct(32865) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32874) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32878) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32871) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32894) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32876) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32883) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32858) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32872) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32893) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32877) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32886) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32856) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32898) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32892) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32889) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32879) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32890) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32870) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32881) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32875) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32885) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32899) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32859) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 5723 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(6), location: 5749 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, Mov { destination: Relative(10), source: Relative(9) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(11) }, Mov { destination: Direct(32772), source: Relative(10) }, Mov { destination: Direct(32773), source: Relative(12) }, Call { location: 23 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Store { destination_pointer: Relative(10), source: Direct(32844) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(9), size: Relative(8) } }, Mov { destination: Relative(1), source: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 5753 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Load { destination: Relative(5), source_pointer: Relative(13) }, Not { destination: Relative(9), source: Relative(5), bit_size: U1 }, BinaryIntOp { destination: Relative(5), op: Mul, bit_size: U1, lhs: Relative(9), rhs: Relative(8) }, JumpIf { condition: Relative(5), location: 5777 }, Jump { location: 5799 }, Load { destination: Relative(5), source_pointer: Relative(6) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5785 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(13), source: Direct(32773) }, Mov { destination: Relative(14), source: Direct(32774) }, Store { destination_pointer: Relative(14), source: Relative(10) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Store { destination_pointer: Relative(6), source: Relative(9) }, Store { destination_pointer: Relative(7), source: Relative(13) }, Jump { location: 5799 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 5535 }, Call { location: 1533 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 5809 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(1), rhs: Direct(32836) }, JumpIf { condition: Relative(4), location: 5815 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(4) }, IndirectConst { destination_pointer: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(6), source: Relative(4) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32840) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(1) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 5837 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(1), location: 5842 }, Jump { location: 5840 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, BinaryIntOp { destination: Relative(1), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(1) }, Load { destination: Relative(5), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32842) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(1) }, Store { destination_pointer: Relative(11), source: Relative(5) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 5837 }, Call { location: 1533 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(9) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Direct(32842) }, Mov { destination: Relative(3), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 5896 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32835) }, JumpIf { condition: Relative(6), location: 5899 }, Jump { location: 6152 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5907 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Direct(32838) }, JumpIf { condition: Relative(7), location: 6151 }, Jump { location: 5912 }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 5920 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 7006 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Load { destination: Relative(12), source_pointer: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 5937 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(3), source: Relative(10) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 5945 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, JumpIf { condition: Relative(8), location: 6149 }, Jump { location: 5949 }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(11) }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(12), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(12), rhs: Direct(32844) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Direct(32895) }, Mov { destination: Relative(7), source: Relative(11) }, Jump { location: 5957 }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(14), location: 6065 }, Jump { location: 5960 }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(13), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(13), rhs: Direct(32836) }, JumpIf { condition: Relative(8), location: 5965 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(13), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(8) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, JumpIf { condition: Relative(9), location: 5975 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Load { destination: Relative(9), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(19), source: Direct(32773) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(8) }, Store { destination_pointer: Relative(21), source: Relative(9) }, Mov { destination: Direct(32771), source: Relative(19) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(15) }, Store { destination_pointer: Relative(9), source: Relative(18) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(7), source: Direct(32773) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, Store { destination_pointer: Relative(10), source: Relative(16) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 6019 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, JumpIf { condition: Relative(14), location: 6025 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(15), source: Direct(32773) }, Mov { destination: Relative(16), source: Direct(32774) }, Store { destination_pointer: Relative(16), source: Relative(9) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(15) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Direct(32838), rhs: Relative(13) }, JumpIf { condition: Relative(7), location: 6039 }, Jump { location: 6063 }, Load { destination: Relative(7), source_pointer: Relative(15) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 6045 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Direct(32842), rhs: Relative(13) }, JumpIf { condition: Relative(9), location: 6051 }, Call { location: 4480 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(10), source: Direct(32773) }, Mov { destination: Relative(12), source: Direct(32774) }, Store { destination_pointer: Relative(12), source: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Jump { location: 6063 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 5896 }, Load { destination: Relative(15), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(16), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Direct(32836) }, JumpIf { condition: Relative(16), location: 6069 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(16), op: Mul, bit_size: U32, lhs: Relative(7), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, JumpIf { condition: Relative(9), location: 6075 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(10) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryFieldOp { destination: Relative(15), op: LessThan, lhs: Relative(17), rhs: Relative(18) }, JumpIf { condition: Relative(13), location: 6087 }, Jump { location: 6081 }, BinaryFieldOp { destination: Relative(17), op: Equals, lhs: Relative(4), rhs: Direct(32902) }, JumpIf { condition: Relative(17), location: 6085 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 6089 }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 6089 }, JumpIf { condition: Relative(14), location: 6091 }, Jump { location: 6146 }, Load { destination: Relative(14), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(17), op: LessThan, bit_size: U32, lhs: Relative(15), rhs: Direct(32836) }, JumpIf { condition: Relative(17), location: 6096 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U32, lhs: Relative(15), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(17) }, Load { destination: Relative(18), source_pointer: Relative(20) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(19) }, Load { destination: Relative(20), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(16) }, Load { destination: Relative(21), source_pointer: Relative(23) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(22) }, Load { destination: Relative(23), source_pointer: Relative(25) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(24), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(17) }, Store { destination_pointer: Relative(26), source: Relative(21) }, Mov { destination: Direct(32771), source: Relative(24) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(19) }, Store { destination_pointer: Relative(21), source: Relative(23) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(17), source: Direct(32773) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(16) }, Store { destination_pointer: Relative(21), source: Relative(18) }, Mov { destination: Direct(32771), source: Relative(17) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 7 }, Call { location: 7043 }, Mov { destination: Relative(14), source: Direct(32773) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(22) }, Store { destination_pointer: Relative(18), source: Relative(20) }, Store { destination_pointer: Relative(1), source: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(16), op: LessThanEquals, bit_size: U32, lhs: Relative(15), rhs: Relative(14) }, JumpIf { condition: Relative(16), location: 6144 }, Call { location: 4434 }, Store { destination_pointer: Relative(8), source: Relative(14) }, Jump { location: 6146 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32842) }, Mov { destination: Relative(7), source: Relative(14) }, Jump { location: 5957 }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 5896 }, Jump { location: 6152 }, Return, Call { location: 1533 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 6163 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 6167 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 6172 }, Jump { location: 6170 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 6167 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 16291778408346427203 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 3078107792722303059 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32841) }, Load { destination: Relative(5), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(5) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 6201 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 6205 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 6210 }, Jump { location: 6208 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(8) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(7), rhs: Relative(10) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(9), rhs: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U1, lhs: Relative(8), rhs: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U1, lhs: Relative(5), rhs: Relative(6) }, Store { destination_pointer: Relative(4), source: Relative(7) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 6205 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 10951819287827820458 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1533 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 6246 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32842) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32867) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Direct(32869) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(4), rhs: Direct(32882) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 6292 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 6302 }, Jump { location: 6295 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Return, JumpIf { condition: Relative(10), location: 6304 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(10) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(17) }, Load { destination: Relative(10), source_pointer: Relative(19) }, JumpIf { condition: Relative(12), location: 6337 }, Jump { location: 6316 }, JumpIf { condition: Relative(13), location: 6332 }, Jump { location: 6318 }, JumpIf { condition: Relative(14), location: 6327 }, Jump { location: 6320 }, BinaryFieldOp { destination: Relative(19), op: Equals, lhs: Relative(4), rhs: Direct(32884) }, JumpIf { condition: Relative(19), location: 6324 }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(20) } }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(16), rhs: Direct(32849) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 6330 }, BinaryFieldOp { destination: Relative(19), op: Mul, lhs: Relative(16), rhs: Direct(32846) }, Mov { destination: Relative(18), source: Relative(19) }, Jump { location: 6330 }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 6335 }, BinaryFieldOp { destination: Relative(18), op: Mul, lhs: Relative(16), rhs: Direct(32904) }, Mov { destination: Relative(17), source: Relative(18) }, Jump { location: 6335 }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 6340 }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Relative(16), rhs: Direct(32845) }, Mov { destination: Relative(15), source: Relative(17) }, Jump { location: 6340 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 17 }, Mov { destination: Relative(17), source: Direct(0) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Relative(8) }, Mov { destination: Relative(20), source: Relative(6) }, Mov { destination: Relative(21), source: Relative(15) }, Mov { destination: Relative(22), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(10) }, Jump { location: 6292 }, Call { location: 1533 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 6362 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(8) }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(4), rhs: Direct(32867) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(4), rhs: Direct(32869) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(4), rhs: Direct(32882) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 6369 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 6373 }, Jump { location: 6372 }, Return, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(11), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 6378 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(9), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32847) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Load { destination: Relative(12), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32842) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32844) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(12) }, Mov { destination: Relative(15), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Relative(18), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(16) }, Mov { destination: Relative(19), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(17) }, Not { destination: Relative(20), source: Relative(17), bit_size: U1 }, BinaryIntOp { destination: Relative(17), op: Mul, bit_size: U1, lhs: Relative(20), rhs: Relative(12) }, JumpIf { condition: Relative(17), location: 6414 }, Jump { location: 6495 }, JumpIf { condition: Relative(7), location: 6437 }, Jump { location: 6416 }, JumpIf { condition: Relative(8), location: 6432 }, Jump { location: 6418 }, JumpIf { condition: Relative(10), location: 6427 }, Jump { location: 6420 }, BinaryFieldOp { destination: Relative(21), op: Equals, lhs: Relative(4), rhs: Direct(32884) }, JumpIf { condition: Relative(21), location: 6424 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(22) } }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(16), rhs: Direct(32849) }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 6430 }, BinaryFieldOp { destination: Relative(21), op: Mul, lhs: Relative(16), rhs: Direct(32846) }, Mov { destination: Relative(20), source: Relative(21) }, Jump { location: 6430 }, Mov { destination: Relative(17), source: Relative(20) }, Jump { location: 6435 }, BinaryFieldOp { destination: Relative(20), op: Mul, lhs: Relative(16), rhs: Direct(32904) }, Mov { destination: Relative(17), source: Relative(20) }, Jump { location: 6435 }, Mov { destination: Relative(12), source: Relative(17) }, Jump { location: 6440 }, BinaryFieldOp { destination: Relative(17), op: Mul, lhs: Relative(16), rhs: Direct(32845) }, Mov { destination: Relative(12), source: Relative(17) }, Jump { location: 6440 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 20 }, Mov { destination: Relative(20), source: Direct(0) }, Mov { destination: Relative(21), source: Relative(11) }, Mov { destination: Relative(22), source: Relative(15) }, Mov { destination: Relative(23), source: Relative(18) }, Mov { destination: Relative(24), source: Relative(19) }, Mov { destination: Relative(25), source: Relative(14) }, Mov { destination: Relative(26), source: Relative(12) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(16) }, Call { location: 4440 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(12), source_pointer: Relative(11) }, Load { destination: Relative(11), source_pointer: Relative(15) }, Load { destination: Relative(14), source_pointer: Relative(18) }, Load { destination: Relative(15), source_pointer: Relative(19) }, Load { destination: Relative(16), source_pointer: Relative(1) }, Load { destination: Relative(17), source_pointer: Relative(2) }, Load { destination: Relative(18), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(16) }, JumpIf { condition: Relative(19), location: 6461 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(17) }, Call { location: 4454 }, Mov { destination: Relative(19), source: Direct(32772) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(21) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(20), rhs: Relative(9) }, Store { destination_pointer: Relative(21), source: Relative(12) }, Mov { destination: Direct(32771), source: Relative(19) }, Call { location: 4454 }, Mov { destination: Relative(9), source: Direct(32772) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, Store { destination_pointer: Relative(17), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(9) }, Call { location: 4454 }, Mov { destination: Relative(12), source: Direct(32772) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(11) }, Store { destination_pointer: Relative(17), source: Relative(14) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(12) }, Call { location: 4454 }, Mov { destination: Relative(11), source: Direct(32772) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(9) }, Store { destination_pointer: Relative(14), source: Relative(15) }, Store { destination_pointer: Relative(1), source: Relative(16) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(18) }, Jump { location: 6495 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(9) }, Jump { location: 6369 }, Call { location: 1533 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 6508 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(6) }, Mov { destination: Relative(15), source: Relative(7) }, Mov { destination: Relative(16), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 5506 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(11), source: Relative(15) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(12) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(8), source: Relative(7) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32842) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Direct(32866) }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 6552 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, JumpIf { condition: Relative(10), location: 6562 }, Jump { location: 6555 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(5), source_pointer: Relative(8) }, Load { destination: Relative(6), source_pointer: Relative(3) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(5) }, Store { destination_pointer: Relative(3), source: Relative(6) }, Return, JumpIf { condition: Relative(10), location: 6564 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(10) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(16) }, Load { destination: Relative(10), source_pointer: Relative(18) }, JumpIf { condition: Relative(12), location: 6585 }, Jump { location: 6576 }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(4), rhs: Direct(32891) }, JumpIf { condition: Relative(16), location: 6580 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(17) } }, BinaryFieldOp { destination: Relative(16), op: Mul, lhs: Relative(15), rhs: Direct(32845) }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(10), rhs: Direct(32845) }, Mov { destination: Relative(13), source: Relative(16) }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 6590 }, BinaryFieldOp { destination: Relative(16), op: Add, lhs: Relative(15), rhs: Direct(32843) }, BinaryFieldOp { destination: Relative(15), op: Mul, lhs: Relative(10), rhs: Direct(32845) }, Mov { destination: Relative(13), source: Relative(16) }, Mov { destination: Relative(14), source: Relative(15) }, Jump { location: 6590 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(7) }, Mov { destination: Relative(17), source: Relative(8) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Relative(13) }, Mov { destination: Relative(20), source: Relative(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 1542 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(10) }, Jump { location: 6552 }, Call { location: 1533 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(1) }, Mov { destination: Relative(10), source: Relative(2) }, Mov { destination: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 7065 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 6621 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(8) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(4) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 6765 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(10), source: Relative(14) }, Load { destination: Relative(9), source_pointer: Relative(8) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(9) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6639 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Mov { destination: Relative(6), source: Direct(32838) }, Jump { location: 6643 }, BinaryIntOp { destination: Relative(8), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, JumpIf { condition: Relative(8), location: 6646 }, Jump { location: 6764 }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 6654 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(6), rhs: Relative(6) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(6) }, JumpIf { condition: Relative(13), location: 6664 }, BinaryIntOp { destination: Relative(16), op: Div, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(6) }, JumpIf { condition: Relative(15), location: 6664 }, Call { location: 4431 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(6), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 6668 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(11), op: Div, bit_size: U32, lhs: Relative(13), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, BinaryIntOp { destination: Relative(14), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(13) }, JumpIf { condition: Relative(14), location: 6673 }, Call { location: 4434 }, BinaryIntOp { destination: Relative(14), op: Div, bit_size: U32, lhs: Relative(13), rhs: Relative(8) }, BinaryIntOp { destination: Relative(15), op: Mul, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Sub, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, JumpIf { condition: Relative(13), location: 6679 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(11), rhs: Direct(32847) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32842) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(17) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Load { destination: Relative(17), source_pointer: Relative(19) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32837) }, Not { destination: Relative(16), source: Relative(13), bit_size: U1 }, BinaryIntOp { destination: Relative(13), op: Or, bit_size: U1, lhs: Relative(17), rhs: Relative(16) }, JumpIf { condition: Relative(13), location: 6706 }, Jump { location: 6701 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(15), rhs: Relative(4) }, JumpIf { condition: Relative(12), location: 6704 }, Jump { location: 6718 }, Store { destination_pointer: Relative(9), source: Direct(32841) }, Jump { location: 6718 }, Store { destination_pointer: Relative(9), source: Direct(32841) }, Load { destination: Relative(12), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(15), op: LessThanEquals, bit_size: U32, lhs: Relative(12), rhs: Relative(13) }, JumpIf { condition: Relative(15), location: 6712 }, Call { location: 4434 }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(15), source_pointer: Relative(2) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 6718 }, Load { destination: Relative(12), source_pointer: Relative(9) }, JumpIf { condition: Relative(12), location: 6724 }, Jump { location: 6721 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32842) }, Mov { destination: Relative(6), source: Relative(8) }, Jump { location: 6643 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(9), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(10), location: 6730 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(7) }, Call { location: 4454 }, Mov { destination: Relative(10), source: Direct(32772) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(12) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(8) }, Store { destination_pointer: Relative(12), source: Direct(32841) }, Mov { destination: Direct(32771), source: Relative(10) }, Call { location: 4454 }, Mov { destination: Relative(7), source: Direct(32772) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(14) }, Store { destination_pointer: Relative(11), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(7) }, Call { location: 4454 }, Mov { destination: Relative(8), source: Direct(32772) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(4) }, Store { destination_pointer: Relative(11), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Direct(32771), source: Relative(8) }, Call { location: 4454 }, Mov { destination: Relative(4), source: Direct(32772) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(5) }, Store { destination_pointer: Relative(10), source: Direct(32837) }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Store { destination_pointer: Relative(3), source: Relative(9) }, Jump { location: 6764 }, Return, Call { location: 1533 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(7) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Relative(7), source: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 6786 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Direct(32842) }, Mov { destination: Relative(10), source: Relative(5) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 6857 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Cast { destination: Relative(7), source: Relative(4), bit_size: Integer(U32) }, Cast { destination: Relative(5), source: Relative(7), bit_size: Field }, Cast { destination: Relative(4), source: Relative(5), bit_size: Integer(U32) }, Mov { destination: Relative(1), source: Relative(4) }, Return, Load { destination: Direct(32775), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32776), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Load { destination: Direct(32777), source_pointer: Direct(32779) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32780), op: LessThanEquals, bit_size: U32, lhs: Direct(32779), rhs: Direct(32777) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32775), rhs: Direct(2) }, JumpIf { condition: Direct(32780), location: 6812 }, Jump { location: 6829 }, JumpIf { condition: Direct(32781), location: 6814 }, Jump { location: 6818 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, Jump { location: 6828 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32777), rhs: Direct(32783) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32782) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32779) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(2) }, Store { destination_pointer: Direct(32782), source: Direct(32777) }, Jump { location: 6828 }, Jump { location: 6841 }, Const { destination: Direct(32783), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(32782), op: Mul, bit_size: U32, lhs: Direct(32779), rhs: Direct(32783) }, Const { destination: Direct(32784), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32782), rhs: Direct(32784) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32783) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32779) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, Store { destination_pointer: Direct(32783), source: Direct(32782) }, Jump { location: 6841 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32781), op: Equals, bit_size: U32, lhs: Direct(32771), rhs: Direct(32773) }, JumpIf { condition: Direct(32781), location: 6855 }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(32776) }, Mov { destination: Direct(32784), source: Direct(32778) }, Mov { destination: Direct(32785), source: Direct(32780) }, BinaryIntOp { destination: Direct(32786), op: Equals, bit_size: U32, lhs: Direct(32784), rhs: Direct(32783) }, JumpIf { condition: Direct(32786), location: 6855 }, Load { destination: Direct(32782), source_pointer: Direct(32784) }, Store { destination_pointer: Direct(32785), source: Direct(32782) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32785), op: Add, bit_size: U32, lhs: Direct(32785), rhs: Direct(2) }, Jump { location: 6848 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(32776) }, Return, Call { location: 1533 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(4) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 6864 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(4) }, Cast { destination: Relative(4), source: Relative(1), bit_size: Field }, Const { destination: Relative(6), bit_size: Field, value: 18446744073709551616 }, BinaryFieldOp { destination: Relative(7), op: Mul, lhs: Relative(4), rhs: Relative(6) }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(6) }, IndirectConst { destination_pointer: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(8), source: Relative(6) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32840) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(8) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Mov { destination: Relative(4), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Mov { destination: Relative(8), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Relative(9) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 6911 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(9) }, Mov { destination: Relative(3), source: Direct(32838) }, Jump { location: 6915 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, JumpIf { condition: Relative(5), location: 6942 }, Jump { location: 6918 }, Load { destination: Relative(1), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Direct(32837) }, JumpIf { condition: Relative(2), location: 6923 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Const { destination: Relative(1), bit_size: Integer(U32), value: 9 }, Mov { destination: Relative(9), source: Direct(0) }, Mov { destination: Relative(10), source: Relative(7) }, Mov { destination: Relative(11), source: Relative(4) }, Mov { destination: Relative(12), source: Relative(6) }, Mov { destination: Relative(13), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(1) }, Call { location: 7512 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(7) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(1) }, Store { destination_pointer: Relative(4), source: Relative(2) }, Store { destination_pointer: Relative(6), source: Relative(3) }, Store { destination_pointer: Relative(8), source: Direct(32841) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32842) }, Load { destination: Relative(1), source_pointer: Relative(3) }, Return, JumpIf { condition: Relative(5), location: 6944 }, Call { location: 4437 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(3) }, Load { destination: Relative(5), source_pointer: Relative(10) }, Load { destination: Relative(9), source_pointer: Relative(6) }, Load { destination: Relative(10), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Equals, bit_size: U1, lhs: Relative(10), rhs: Direct(32837) }, JumpIf { condition: Relative(11), location: 6954 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Direct(32836) }, JumpIf { condition: Relative(10), location: 6980 }, Jump { location: 6957 }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Load { destination: Relative(11), source_pointer: Relative(6) }, Load { destination: Relative(12), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(11), rhs: Direct(32836) }, JumpIf { condition: Relative(13), location: 6964 }, Call { location: 4437 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Store { destination_pointer: Relative(15), source: Relative(5) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(11), rhs: Relative(5) }, JumpIf { condition: Relative(9), location: 6975 }, Call { location: 4434 }, Store { destination_pointer: Relative(7), source: Relative(13) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(5) }, Store { destination_pointer: Relative(8), source: Relative(12) }, Jump { location: 7003 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, Mov { destination: Relative(12), source: Relative(4) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(8) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 7512 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(9), source_pointer: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(4) }, Load { destination: Relative(11), source_pointer: Relative(8) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 7043 }, Mov { destination: Relative(12), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(32842) }, Store { destination_pointer: Relative(13), source: Relative(5) }, Store { destination_pointer: Relative(7), source: Relative(12) }, Store { destination_pointer: Relative(4), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Direct(32842) }, Store { destination_pointer: Relative(8), source: Relative(11) }, Jump { location: 7003 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32842) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 6915 }, BinaryIntOp { destination: Direct(32775), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(2) }, Load { destination: Direct(32775), source_pointer: Direct(32775) }, BinaryIntOp { destination: Direct(32776), op: Sub, bit_size: U32, lhs: Direct(32775), rhs: Direct(32772) }, Load { destination: Direct(32777), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32778), op: Equals, bit_size: U32, lhs: Direct(32777), rhs: Direct(2) }, Const { destination: Direct(32780), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32780) }, JumpIf { condition: Direct(32778), location: 7015 }, Jump { location: 7019 }, Mov { destination: Direct(32773), source: Direct(32771) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Jump { location: 7041 }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32776), rhs: Direct(32781) }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32780) }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32780), rhs: Direct(2) }, Store { destination_pointer: Direct(32780), source: Direct(32776) }, Const { destination: Direct(32781), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Direct(32780), op: Add, bit_size: U32, lhs: Direct(32773), rhs: Direct(32781) }, BinaryIntOp { destination: Direct(32782), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Mov { destination: Direct(32783), source: Direct(32779) }, Mov { destination: Direct(32784), source: Direct(32780) }, BinaryIntOp { destination: Direct(32785), op: Equals, bit_size: U32, lhs: Direct(32783), rhs: Direct(32782) }, JumpIf { condition: Direct(32785), location: 7040 }, Load { destination: Direct(32781), source_pointer: Direct(32783) }, Store { destination_pointer: Direct(32784), source: Direct(32781) }, BinaryIntOp { destination: Direct(32783), op: Add, bit_size: U32, lhs: Direct(32783), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32784), op: Add, bit_size: U32, lhs: Direct(32784), rhs: Direct(2) }, Jump { location: 7033 }, Jump { location: 7041 }, BinaryIntOp { destination: Direct(32774), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(32776) }, Return, Load { destination: Direct(32774), source_pointer: Direct(32771) }, BinaryIntOp { destination: Direct(32775), op: Equals, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, JumpIf { condition: Direct(32775), location: 7047 }, Jump { location: 7049 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 7064 }, Mov { destination: Direct(32773), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(32772) }, BinaryIntOp { destination: Direct(32777), op: Add, bit_size: U32, lhs: Direct(32771), rhs: Direct(32772) }, Mov { destination: Direct(32778), source: Direct(32771) }, Mov { destination: Direct(32779), source: Direct(32773) }, BinaryIntOp { destination: Direct(32780), op: Equals, bit_size: U32, lhs: Direct(32778), rhs: Direct(32777) }, JumpIf { condition: Direct(32780), location: 7061 }, Load { destination: Direct(32776), source_pointer: Direct(32778) }, Store { destination_pointer: Direct(32779), source: Direct(32776) }, BinaryIntOp { destination: Direct(32778), op: Add, bit_size: U32, lhs: Direct(32778), rhs: Direct(2) }, BinaryIntOp { destination: Direct(32779), op: Add, bit_size: U32, lhs: Direct(32779), rhs: Direct(2) }, Jump { location: 7054 }, IndirectConst { destination_pointer: Direct(32773), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Direct(32774), op: Sub, bit_size: U32, lhs: Direct(32774), rhs: Direct(2) }, Jump { location: 7064 }, Return, Call { location: 1533 }, Load { destination: Relative(4), source_pointer: Relative(2) }, Load { destination: Relative(5), source_pointer: Relative(3) }, Load { destination: Relative(6), source_pointer: Relative(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7074 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 7080 }, Call { location: 4434 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(4) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(10), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(8) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 7087 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(8) }, BinaryIntOp { destination: Relative(4), op: Div, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 7511 }, Jump { location: 7093 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(6), source_pointer: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 7101 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(7) }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(9), op: Div, bit_size: U32, lhs: Relative(6), rhs: Direct(32844) }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(7), location: 7108 }, Call { location: 4431 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(9) }, IndirectConst { destination_pointer: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(9) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Direct(32838) }, Mov { destination: Relative(9), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(5) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 7128 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, JumpIf { condition: Relative(5), location: 7483 }, Jump { location: 7131 }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, Mov { destination: Relative(7), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(5) }, Mov { destination: Relative(5), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Direct(32838) }, Load { destination: Relative(8), source_pointer: Relative(1) }, Load { destination: Relative(9), source_pointer: Relative(2) }, Load { destination: Relative(10), source_pointer: Relative(3) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 7151 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(15) }, Mov { destination: Relative(11), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(14) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(13) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(13) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(14) }, Mov { destination: Relative(13), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32838) }, Mov { destination: Relative(14), source: Direct(1) }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(11) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 7177 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 7181 }, BinaryIntOp { destination: Relative(11), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(11), location: 7432 }, Jump { location: 7184 }, Load { destination: Relative(8), source_pointer: Relative(13) }, Load { destination: Relative(9), source_pointer: Relative(14) }, Load { destination: Relative(11), source_pointer: Relative(9) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(12), rhs: Relative(11) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 7192 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(11) }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 83 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(13) }, IndirectConst { destination_pointer: Relative(11), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Relative(14), source: Relative(13) }, Store { destination_pointer: Relative(14), source: Direct(32865) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32883) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32886) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32893) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32886) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32876) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32894) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32871) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32879) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32874) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32883) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32890) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32890) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32878) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32886) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32893) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32874) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32878) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32871) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32894) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32872) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32898) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32890) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32876) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32870) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32899) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32879) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32883) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32890) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32858) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32872) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32893) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32877) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32886) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32856) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32898) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32892) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32889) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32879) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32890) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32870) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32881) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32875) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32885) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32899) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Direct(32859) }, Load { destination: Relative(13), source_pointer: Relative(9) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(13) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 7369 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 7395 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 86 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 86 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(17) }, Mov { destination: Relative(17), source: Relative(16) }, IndirectConst { destination_pointer: Relative(17), bit_size: Integer(U64), value: 9576462532509309328 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 82 }, Mov { destination: Direct(32771), source: Relative(18) }, Mov { destination: Direct(32772), source: Relative(17) }, Mov { destination: Direct(32773), source: Relative(19) }, Call { location: 23 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 82 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(18) }, Store { destination_pointer: Relative(17), source: Direct(32844) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(10) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(8) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(17), rhs: Direct(2) }, Trap { revert_data: HeapVector { pointer: Relative(16), size: Relative(15) } }, Mov { destination: Relative(4), source: Direct(32838) }, Jump { location: 7397 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 7407 }, Jump { location: 7400 }, Load { destination: Relative(4), source_pointer: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(4) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(5) }, Jump { location: 7511 }, JumpIf { condition: Relative(10), location: 7409 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(10), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32844) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(13) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32842) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(12) }, Load { destination: Relative(10), source_pointer: Relative(14) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 13 }, Mov { destination: Relative(13), source: Direct(0) }, Mov { destination: Relative(14), source: Relative(7) }, Mov { destination: Relative(15), source: Relative(5) }, Mov { destination: Relative(16), source: Relative(6) }, Mov { destination: Relative(17), source: Relative(11) }, Mov { destination: Relative(18), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(12) }, Call { location: 6603 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(10) }, Jump { location: 7397 }, JumpIf { condition: Relative(11), location: 7434 }, Call { location: 4437 }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32847) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(16) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(16) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32842) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(18) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(17), rhs: Relative(15) }, Load { destination: Relative(16), source_pointer: Relative(18) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32844) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32836) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(19) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Load { destination: Relative(11), source_pointer: Relative(19) }, Not { destination: Relative(15), source: Relative(11), bit_size: U1 }, BinaryIntOp { destination: Relative(11), op: Mul, bit_size: U1, lhs: Relative(15), rhs: Relative(12) }, JumpIf { condition: Relative(11), location: 7458 }, Jump { location: 7480 }, Load { destination: Relative(11), source_pointer: Relative(13) }, Load { destination: Relative(12), source_pointer: Relative(14) }, Load { destination: Relative(15), source_pointer: Relative(12) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(15) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 7466 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(15) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(12) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 2 }, Call { location: 6801 }, Mov { destination: Relative(19), source: Direct(32773) }, Mov { destination: Relative(20), source: Direct(32774) }, Store { destination_pointer: Relative(20), source: Relative(16) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Store { destination_pointer: Relative(13), source: Relative(15) }, Store { destination_pointer: Relative(14), source: Relative(19) }, Jump { location: 7480 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(11) }, Jump { location: 7181 }, Load { destination: Relative(5), source_pointer: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Load { destination: Relative(10), source_pointer: Relative(8) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(11), rhs: Relative(10) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 7491 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 6801 }, Mov { destination: Relative(12), source: Direct(32773) }, Mov { destination: Relative(13), source: Direct(32774) }, Store { destination_pointer: Relative(13), source: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32840) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32839) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Direct(32837) }, Store { destination_pointer: Relative(7), source: Relative(10) }, Store { destination_pointer: Relative(9), source: Relative(12) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32842) }, Mov { destination: Relative(4), source: Relative(5) }, Jump { location: 7128 }, Return, Call { location: 1533 }, Mov { destination: Relative(5), source: Direct(32838) }, Jump { location: 7515 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32836) }, JumpIf { condition: Relative(6), location: 7543 }, Jump { location: 7518 }, Load { destination: Relative(5), source_pointer: Relative(2) }, Load { destination: Relative(6), source_pointer: Relative(5) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 7525 }, Call { location: 1539 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(5), source: Relative(6) }, Mov { destination: Relative(6), source: Direct(1) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(8) }, IndirectConst { destination_pointer: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BlackBox(Poseidon2Permutation { message: HeapVector { pointer: Relative(8), size: Relative(9) }, output: HeapArray { pointer: Relative(10), size: 4 }, len: Direct(32847) }), Load { destination: Relative(5), source_pointer: Relative(1) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Store { destination_pointer: Relative(1), source: Relative(5) }, Store { destination_pointer: Relative(2), source: Relative(6) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Return, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Relative(6) }, JumpIf { condition: Relative(7), location: 7547 }, Jump { location: 7570 }, Load { destination: Relative(6), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(8), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(5) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryFieldOp { destination: Relative(10), op: Add, lhs: Relative(7), rhs: Relative(9) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 7043 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(12), rhs: Relative(5) }, Store { destination_pointer: Relative(13), source: Relative(10) }, Store { destination_pointer: Relative(1), source: Relative(8) }, Store { destination_pointer: Relative(2), source: Relative(11) }, Store { destination_pointer: Relative(3), source: Relative(7) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Jump { location: 7570 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32842) }, Mov { destination: Relative(5), source: Relative(6) }, Jump { location: 7515 }]" ], - "debug_symbols": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", @@ -260,7 +260,7 @@ expression: artifact "path": "std/field/mod.nr" }, "19": { - "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", + "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Same as from_field but:\n// does not assert the limbs are 128 bits\n// does not assert the decomposition does not overflow the EmbeddedCurveScalar\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n", "path": "std/hash/mod.nr" }, "22": {